【问题标题】:VBO colors of vertices using shaders使用着色器的顶点的 VBO 颜色
【发布时间】:2013-12-19 14:16:42
【问题描述】:

我正在使用 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)所有法线(法线数量是顶点数量和顶点颜色的三倍)然后我附加每个顶点的颜色向量(使用@ 987654325@)。 我想知道这是否是个好主意,因为我在用不同颜色绘制每个顶点时遇到问题。绘图代码为:

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 个顶点)?因为我想得到如下所示的显示(左:当前状态,中间:计划,右:理想 - 重点是表面的阴影),我想请你给我一些关于如何实现这一点的指导(使用着色器)。

【问题讨论】:

  • 你得到的图像有什么问题? “当前状态”是你应该从你的代码中得到的(忽略法线,就像你现在做的那样)。
  • @derhass 好的。如果我理解正确,我必须使用glNormalPointer 调用来获得类似于中间或右侧的显示?如果我使用glNormalPointer,我是否必须使用着色器,或者是否可以在没有着色器的情况下使用此功能并且仍然可以像中间或右侧一样显示?

标签: opengl vbo pyopengl


【解决方案1】:

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

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

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

这样,为处理单个而提取的所有数据都是本地的,彼此靠近,从而提高了缓存效率。您可以使用属性指针的stride 参数为此类布局进行设置。

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

【讨论】:

  • 好的。我将重塑数据以具有您建议的形状。目前没有启用法线 - “当前状态”。中间状态的颜色差异并不重要,重点是表面的阴影或绘制以及它们是如何阴影的。我必须使用glVertexAttribPointer() 功能还是您建议使用哪些功能?我是否必须使用着色器或不为每个顶点绘制不同的颜色?我找不到明确的答案。
  • @avstenit:在查看生成的图像时,很难猜测使用的是什么照明模型。但是,看起来您显示的阴影可以通过使用固定功能管道来实现。您只需要提供正确的法线向量,必须设置适当的材质和灯光属性。然而,所有这些当然都可以通过着色器来实现,这将是当今推荐的方式。
  • 感谢您的回复。我希望我可以使用固定功能管道(没有着色器)来实现它。我已经开始稍微研究着色器(它正在工作),但理解逻辑需要时间。由于可视化只是项目的一半,它不是重点,重点是物理部分,所以我想尽可能简单:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多