在OpenGL中批处理三角形条时,光照不正确

时间:2012-09-05 08:14:02

标签: 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);

但是,尽管三角形条正确分开,但照明仅适用于第一个三角形条。

在下面的示例中,我渲染的是五边形和一个正方形,您可以看到只有五边形的光线正确。

enter image description here

这是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

为什么广场上的灯光错误?

1 个答案:

答案 0 :(得分:0)

显然,问题与组合2个三角形条带时添加的退化三角形的数量有关。这可以改变顶点排序,从而使法线的方向不一致。

我通过在三角形条的当前运行长度为奇数时添加额外的冗余顶点来解决上述问题。

以下链接提供了许多有关三角形条带构造和连接的有用信息:

http://www.codercorner.com/Strips.htm