我使用顶点缓冲区(在固定功能管线中)通过重复第一个/最后一个顶点来批量处理三角形条。渲染代码如下:在OpenGL中配制三角形条时灯光不正确
glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer); // enable vertex array glEnableClientState(GL_VERTEX_ARRAY); glVertexPointer(3, GL_FLOAT, 3*sizeof(GLfloat), 0); // prepare color VBO glBindBuffer(GL_ARRAY_BUFFER, _colorBuffer); // enable color array glEnableClientState(GL_COLOR_ARRAY); glColorPointer(3, GL_FLOAT, 3*sizeof(GLfloat), 0); // prepare normals VBO glBindBuffer(GL_ARRAY_BUFFER, _normalBuffer); // enable normal array glEnableClientState(GL_NORMAL_ARRAY); glNormalPointer(GL_FLOAT, 0, 0); glDrawArrays(mode, 0, _nVertices); // disable/unbind glDisableClientState(GL_VERTEX_ARRAY); glDisableClientState(GL_COLOR_ARRAY); glDisableClientState(GL_NORMAL_ARRAY); glBindBuffer(GL_ARRAY_BUFFER, 0);
但是,虽然三角形带被正确分离,照明仅对第一三角形带是正确的。
在下面的例子中,我渲染了一个五边形和一个正方形,并且您可以看到只有五边形的照明是正确的。
这是在图3(顶点,正常颜色)顶点缓冲器中的数据。您可以看到五边形的最后一个顶点和正方形的第一个顶点重复,并且法线一致。
vertices: -2.000000 1.000000 0.000000 -1.000000 0.000000 0.000000 -1.000000 2.000000 0.000000 0.000000 0.000000 0.000000 0.000000 2.000000 0.000000 0.000000 2.000000 0.000000 1.000000 -1.000000 0.000000 1.000000 -1.000000 0.000000 1.000000 -2.000000 0.000000 2.000000 -1.000000 0.000000 2.000000 -2.000000 0.000000 normals: -0.000000 0.000000 1.000000 -0.000000 0.000000 1.000000 -0.000000 0.000000 1.000000 -0.000000 -0.000000 1.000000 -0.000000 0.000000 1.000000 -0.000000 0.000000 1.000000 -0.000000 0.000000 1.000000 -0.000000 0.000000 1.000000 -0.000000 0.000000 1.000000 -0.000000 0.000000 1.000000 -0.000000 -0.000000 1.000000 colors: 0.317647 0.011765 0.458824 0.317647 0.011765 0.458824 0.317647 0.011765 0.458824 0.317647 0.011765 0.458824 0.317647 0.011765 0.458824 0.317647 0.011765 0.458824 0.678431 0.003922 0.003922 0.678431 0.003922 0.003922 0.678431 0.003922 0.003922 0.678431 0.003922 0.003922 0.678431 0.003922 0.003922
为什么广场的照明不对?
为什么是错误的?你期望它会是什么?从我可以看到的照明看起来很好,没有照明设置代码,很难说出发生了什么。 – Yno
红色正方形的灯是错的 - 它根本没有点亮。两个原始图像都具有法线(0,0,1) - 旋转场景时五角形照亮了。我不认为设置代码是必要的 - 我已经提供了发送到缓冲区的数据。我认为这个问题与退化三角形和正常值有关。 –
正方形属性中的颜色比五角形的颜色要少,因此我仍然没有看到问题所在。它也可能取决于你拥有什么样的照明选项,远离光线的物体不太亮,这是正常的。如果你明确想要认为它与你的法线一致,那么尝试启用标准化'glEnable(GL_NORMALIZE);'。 – Yno