2012-09-05 37 views
1

我使用顶点缓冲区(在固定功能管线中)通过重复第一个/最后一个顶点来批量处理三角形条。渲染代码如下:在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 

为什么广场的照明不对?

+0

为什么是错误的?你期望它会是什么?从我可以看到的照明看起来很好,没有照明设置代码,很难说出发生了什么。 – Yno

+0

红色正方形的灯是错的 - 它根本没有点亮。两个原始图像都具有法线(0,0,1) - 旋转场景时五角形照亮了。我不认为设置代码是必要的 - 我已经提供了发送到缓冲区的数据。我认为这个问题与退化三角形和正常值有关。 –

+1

正方形属性中的颜色比五角形的颜色要少,因此我仍然没有看到问题所在。它也可能取决于你拥有什么样的照明选项,远离光线的物体不太亮,这是正常的。如果你明确想要认为它与你的法线一致,那么尝试启用标准化'glEnable(GL_NORMALIZE);'。 – Yno

回答

0

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

我解决了上述问题,当三角形带的当前运行长度为奇数时,我添加了一个额外的冗余顶点。

下面的链接有很多的建设有用的信息和三角带的加盟:

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

+0

您是否考虑过使用[primitive restart?](http://www.opengl.org/wiki/Vertex_Rendering#Primitive_Restart)它没有这些问题。 –

+0

我不能,因为我需要支持每个面的属性 - 颜色/法线等,所以一个顶点可以映射到几个值。索引渲染似乎不可能。事实上,我已经在此发布了另一个SO问题。 –