OpenGL法线不出现在三角形中

时间:2018-03-20 22:12:55

标签: c++ opengl surface normals shading

我使用普通数组渲染普通数据集,如下所示:

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之间的随机浮点数,这些应该在我生成的表面上完全随机显示。

当我渲染输出时,&#34;法线&#34;显示如下。我不在乎它没有计算出正确的法线,但看起来两个并排三角形的法线是相同的。

Picture of normals not in triangles

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

我使用的阴影方法是:glShadeModel(GL_FLAT);

我预计每个三角形都会有完全不同的灰度值,但情况并非如此。我对错误的任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:3)

  

我使用的阴影方法是:glShadeModel(GL_FLAT);

到目前为止。

  

当我渲染输出时,“法线”显示如下。我不在乎它没有计算正确的法线,但看起来两个并排的三角形的法线是相同的

是的,you requested that via GL_FLAT

  

GL基元可以具有平坦或平滑的阴影。默认情况下,平滑着色会导致计算的顶点颜色在基元被光栅化时进行插值,通常会为每个结果像素片段分配不同的颜色。 平面着色选择仅一个顶点的计算颜色,并将其分配给通过栅格化单个基元生成的所有像素片段。

如果要在所有三个顶点的法线之间进行插值,则需要使用GL_SMOOTH