我正在使用interleaved VBO
来使用Python和PyOpenGL显示几何体。 VBO由顶点,法线和颜色组成:
[vx1, vy1, vz1, nx1, ny1, nz1, R1, G1, B1, vx2...]
使用代码进行绘图:
glEnableClientState(GL_VERTEX_ARRAY)
glEnableClientState(GL_NORMAL_ARRAY)
glEnableClientState(GL_COLOR_ARRAY)
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, self.vbo_id)
v_pointer = None
n_pointer = ctypes.c_void_p(12)
c_pointer = ctypes.c_void_p(24)
v_stride = 24
n_stride = 24
c_stride = 24
glVertexPointer(3,
GL_FLOAT,
v_stride,
v_pointer)
glNormalPointer(GL_FLOAT,
n_stride,
n_pointer)
glColorPointer(3,
GL_FLOAT,
c_stride,
c_pointer)
glDrawArrays(GL_TRIANGLES, #POINTS
0,
self.len_)
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0) # reset
glDisableClientState(GL_COLOR_ARRAY)
glDisableClientState(GL_NORMAL_ARRAY)
glDisableClientState(GL_VERTEX_ARRAY)
显示的几何体应该是一个简单的立方体,但我得到的只是随机取向的三角形(见图)。我正在阅读PyOpenGL here中的glVertexPointer()
问题并找到solution ctypes.c_void_p()
,但我不确定如何实现它。有人可以指出我在做错了什么或在这里失踪了吗?或者我该如何解决这个问题?
基于documentation,stride
参数在VBO
数组中相同类型的两个连续数组(顶点,法线,颜色......)(以字节为单位)之间偏移。或者不是?
答案 0 :(得分:0)
我已经解决了关于法线的问题。代码是:
v_pointer = ctypes.c_void_p(0) # or None
n_pointer = ctypes.c_void_p(12)
c_pointer = ctypes.c_void_p(24)
v_stride = 36
n_stride = 36
c_stride = 36
但是我仍然有颜色问题,因为模特不是很丰富多彩? :)非常感谢任何想法。