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

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

不在三角形中的法线图片

下面是表面的线框,用于显示单独的三角形: 上图的线框图

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

我希望每个单独的三角形都有完全不同的灰度值,但事实并非如此。感谢您对我出错的地方的任何帮助。

4

1 回答 1

3

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

和你到目前为止。

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

是的,您通过以下方式请求GL_FLAT

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

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

于 2018-03-20T22:44:23.157 回答