【发布时间】: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 的方法:
- 为顶点创建单独的 VBO,为法线创建 VBO,为颜色创建 VBO
- 一个 VBO,但格式为:
[v1, c1, v2, c2, v3, c3, n1, ....]
这两个中的任何一个是更好的解决方案吗(在实践中更常见)?我是否必须为每个顶点分配一个三角形的法线,尽管它是相同的(对于定义三角形的 3 个顶点)?因为我想得到如下所示的显示(左:当前状态,中间:计划,右:理想 - 重点是表面的阴影),我想请你给我一些关于如何实现这一点的指导(使用着色器)。
【问题讨论】:
-
你得到的图像有什么问题? “当前状态”是你应该从你的代码中得到的(忽略法线,就像你现在做的那样)。
-
@derhass 好的。如果我理解正确,我必须使用
glNormalPointer调用来获得类似于中间或右侧的显示?如果我使用glNormalPointer,我是否必须使用着色器,或者是否可以在没有着色器的情况下使用此功能并且仍然可以像中间或右侧一样显示?