glVertexPointer(),glNormalPointer - PyOpenGL中的stride和pointer参数

时间:2013-12-10 08:38:49

标签: python opengl vbo pyopengl

我正在使用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(),但我不确定如何实现它。有人可以指出我在做错了什么或在这里失踪了吗?或者我该如何解决这个问题?

基于documentationstride参数在VBO数组中相同类型的两个连续数组(顶点,法线,颜色......)(以字节为单位)之间偏移。或者不是?

drawn triagles

1 个答案:

答案 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

但是我仍然有颜色问题,因为模特不是很丰富多彩? :)非常感谢任何想法。