我正在使用顶点缓冲区(在固定函数管道中)通过重复第一个/最后一个顶点来批处理三角形条带。渲染代码如下:
glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer); // 启用顶点数组 glEnableClientState(GL_VERTEX_ARRAY); glVertexPointer(3, GL_FLOAT, 3*sizeof(GLfloat), 0); //准备颜色VBO glBindBuffer(GL_ARRAY_BUFFER, _colorBuffer); // 启用颜色数组 glEnableClientState(GL_COLOR_ARRAY); glColorPointer(3, GL_FLOAT, 3*sizeof(GLfloat), 0); // 准备法线 VBO glBindBuffer(GL_ARRAY_BUFFER, _normalBuffer); // 启用普通数组 glEnableClientState(GL_NORMAL_ARRAY); glNormalPointer(GL_FLOAT, 0, 0); glDrawArrays(mode, 0, _nVertices); // 禁用/解除绑定 glDisableClientState(GL_VERTEX_ARRAY); glDisableClientState(GL_COLOR_ARRAY); glDisableClientState(GL_NORMAL_ARRAY); glBindBuffer(GL_ARRAY_BUFFER, 0);
但是,虽然三角形条被正确分开,但只有第一个三角形条的照明是正确的。
在下面的示例中,我正在渲染一个五边形和一个正方形,您可以看到只有五边形的照明是正确的。
这是 3 个(顶点、法线、颜色)顶点缓冲区中的数据。可以看到五边形的最后一个顶点和正方形的第一个顶点是重复的,而且法线是一致的。
顶点: -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 法线: -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 颜色: 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
为什么广场的照明不对?