PyOpenGL:glVertexPointer()偏移问题

时间:2010-04-21 13:20:03

标签: opengl rendering pyopengl

我的顶点交错在一个numpy数组(dtype = float32)中,如下所示:... tu,tv,nx,ny,nz,vx,vy,vz,...

渲染时,我正在调用gl * Pointer()(我之前启用了数组):

stride = (2 + 3 + 3) * 4
glTexCoordPointer( 2, GL_FLOAT, stride, self.vertArray )
glNormalPointer( GL_FLOAT, stride, self.vertArray + 2 )
glVertexPointer( 3, GL_FLOAT, stride, self.vertArray + 5 )
glDrawElements( GL_TRIANGLES, len( self.indices ), GL_UNSIGNED_SHORT, self.indices )

结果是没有任何渲染。但是,如果我组织我的数组,使顶点位置是第一个元素(... vx,vy,vz,tu,tv,nx,ny,nz,...)我在渲染时获得顶点的正确位置但纹理coords和normals无法正确呈现。

这让我相信我没有将指针偏移设置为正确。我该怎么设置它?我在C ++中的其他应用程序中使用了几乎完全相同的代码,但它确实有用。

4 个答案:

答案 0 :(得分:3)

在python中,你不能做指针算术。你想要做的只适用于C / C ++。

使用普通的Python列表:

>>> array = [1, 2, 3, 4]
>>> array
[1, 2, 3, 4]
>>> array + 2
Traceback (most recent call last):
  File "<input>", line 1, in <module>
TypeError: can only concatenate list (not "int") to list

使用numpy数组:

>>> import numpy
>>> a = numpy.array([1, 2, 3])
>>> a + 2
array([3, 4, 5])

看看你想要的是什么:在某个位置启动数组。

我认为你基本上有两种选择:

  1. 不要使用交错数组。这确实有一个优点:当你只需要更新顶点时(比如在骨骼动画中),你不需要更新纹理坐标。
  2. 使用切片可能为您工作。
  3. 像这样:

    >>> a = numpy.array(range(10))
    >>> a
    array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
    >>> a[3:]
    array([3, 4, 5, 6, 7, 8, 9])
    

    将此与正确的步幅相结合,你可以让它发挥作用。

答案 1 :(得分:3)

我遇到了类似的问题,发现将偏移量转移到ctypes.c_void_p就可以了。

from ctypes import c_void_p

t_size = self.vertArray.itemsize * 2
n_size = self.vertArray.itemsize * 3

t_offset = c_void_p(0)
n_offset = c_void_p(t_size)
v_offset = c_void_p(t_size+n_size)

glTexCoordPointer( 2, GL_FLOAT, stride, t_offset )
glNormalPointer( GL_FLOAT, stride, n_offset )
glVertexPointer( 3, GL_FLOAT, stride, v_offset )
glDrawElements( GL_TRIANGLES, len( self.indices ), GL_UNSIGNED_SHORT, self.indices )

答案 2 :(得分:0)

我正在回答我自己的问题,因为我找到了另一种方法来完成正确的结果。我没有调用gl * Pointer(),而是调用了:

glInterleavedArrays( GL_T2F_N3F_V3F, stride, self.vertArray )

我仍然很想找到一个适用于gl * Pointer()的解决方案。

答案 3 :(得分:0)

根据此链接:http://www.opengl.org/sdk/docs/man/xhtml/glTexCoordPointer.xml

  

步幅

     

指定之间的字节偏移量   连续纹理坐标集。   如果stride为0,则数组元素为   理解为紧密包装。该   初始值为0。

你确定,在你的情况下,步幅是(2 + 3 + 3)* 4?