OpenGL法线在三角形中不显示

3
我正在使用普通的数组来呈现以下普通数据集:

我正在使用普通的数组来呈现以下普通数据集:

glEnableClientState(GL_NORMAL_ARRAY);
glNormalPointer( GL_FLOAT, 0, nArray );

我的顶点渲染如下:

glEnableClientState( GL_VERTEX_ARRAY );
glVertexPointer( 3, GL_FLOAT, 0, vArray );
glDrawElements( GL_TRIANGLES, iSize, GL_UNSIGNED_INT, iArray );
glDisableClientState( GL_VERTEX_ARRAY );
glDisableClientState( GL_NORMAL_ARRAY );

为了举例说明,我将填充nArray如下(当法线正确计算时仍会出现错误):
for(int i = 0; i < nSize * 3; ++i){
    nArray[i] = randomNumber();
}

randomNumber()返回0到1之间的随机浮点数。

我希望nArray应该填充随机浮点数,范围在0到1之间,并且这些数字应该完全随机地显示在我生成的表面上。

当我渲染输出时,“法线”显示如下。我不关心它是否计算正确的法线,但似乎相邻两个三角形的法线是相同的。

Picture of normals not in triangles

下面是表面的线框图,以显示单独的三角形:Wireframe image of above image

我使用的着色方法是:glShadeModel(GL_FLAT);

我期望每个单独的三角形都有完全不同的灰度值,但情况并非如此。如果您能指出我做错了什么,我将不胜感激。


1
使用平面着色时,每个三角形只有一个引发顶点,因此它将取决于您如何在元素数组中重复使用顶点。 - derhass
1个回答

3
我使用的阴影方法是:glShadeModel(GL_FLAT); 当我渲染输出时,“法线”显示如下。我不关心它是否计算了正确的法向量,但是似乎相邻的两个三角形的法线是相同的
是的,你通过GL_FLAT请求了这样的效果
GL图元可以有平面或光滑着色。光滑着色是默认的,它会在光栅化图元时插值出顶点的计算颜色,通常将不同的颜色分配给每个生成的像素片段。 平面着色选择一个顶点的计算颜色,并将其分配给光栅化单个图元生成的所有像素片段。 如果您想在所有三个顶点的法线之间进行插值,则需要使用GL_SMOOTH

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接