使用着色器的顶点的VBO颜色

时间:2013-12-03 13:33:08

标签: opengl vbo pyopengl

我正在使用OpenGL(PyOpenGL和Python)显示几何体(文件格式:.stl)。几何数据具有form并由三角形组合。

我保存到VBO数据;顶点,法线和颜色。由于法线仅按每3个顶点(三角形)定义,并且我为每个顶点定义颜色矢量,因此VBO中的数据具有以下形式:

VBO = [v1x, v1y, v1z,...vNx, vNy, vNz,
       n1x, n1y, n1z,...nNx, nNy, nNz,
       R1, G1, B1,...RN, GN, BN]

用言语;首先我保存所有顶点,然后我“追加”(使用glBufferSubData)所有法线(法线数比顶点数和顶点颜色数少3倍)然后我追加每个顶点的颜色矢量(使用glBufferSubData)。 我想知道这是否是个好主意,因为我在绘制不同颜色的每个顶点时遇到问题。绘图代码是:

glPushMatrix()
glEnableClientState(GL_VERTEX_ARRAY)
glVertexPointer(3, 
                GL_FLOAT, 
                0, 
                None)
glEnableClientState(GL_COLOR_ARRAY)
glColorPointer(3,
               GL_UNSIGNED_BYTE,
               0,
               self.data_size_vertices+self.data_size_normals)
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, self.vbo_id)     
glDrawArrays(GL_TRIANGLES,
             0,
             self.N_vertices)
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0) # reset
glDisableClientState(GL_COLOR_ARRAY)
glDisableClientState(GL_VERTEX_ARRAY)
glPopMatrix()

我认为glColorPointer()遇到了问题。有人可以指出问题吗?我还看到了另外两种将数据保存到VBO的方法:

  1. 为顶点创建单独的VBO,为法线创建VBO,为颜色创建VBO
  2. 一个VBO,但格式为:[v1, c1, v2, c2, v3, c3, n1, ....]
  3. 这两个中的任何一个都是更好的解决方案(在实践中更常见)吗?我是否必须为每个顶点指定一个三角形法线,尽管它是相同的(对于定义三角形的3个顶点)?因为我想得到如下所示的显示(左:当前状态,中间:计划,右:理想 - 点是表面的阴影),我想请你给我一些关于如何实现这一点的指示(使用着色器)。 enter image description here

1 个答案:

答案 0 :(得分:1)

您必须复制每个顶点的法线。对于OpenGL,顶点是一组属性(如位置,颜色,法线,texcoords,......)。顶点由其索引引用,因此第i个顶点将由所有已启用属性数组的第i个元素组成。

顶点属性的常见布局是交错每个顶点的属性,如

v1x, v1y, v1z, n1x, n1y, n1z, R1, G1, B1, v2x, ...

这样,为处理单个数据而获取的所有数据都是本地接近的,从而提高了缓存效率。您可以使用attrib指针的stride参数为这种布局设置它。

“当前状态”图像看起来像是在没有启用普通数组时应该看起来(并且仍然启用了照明)。然后GL将为所有顶点重复使用当前设置的法线向量,从而产生您看到的阴影。看一下“理想”的图像,我会得出结论,蓝色对于物体来说是正确的,所以我看不出你的颜色阵列有什么问题。