我使用顶点缓冲区(在固定的函数管道中)通过重复第一个/最后一个顶点来批处理三角形条带。渲染代码如下:
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
为什么广场上的灯光错误?
答案 0 :(得分:0)
显然,问题与组合2个三角形条带时添加的退化三角形的数量有关。这可以改变顶点排序,从而使法线的方向不一致。
我通过在三角形条的当前运行长度为奇数时添加额外的冗余顶点来解决上述问题。
以下链接提供了许多有关三角形条带构造和连接的有用信息: