我的顶点交错在一个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 ++中的其他应用程序中使用了几乎完全相同的代码,但它确实有用。
答案 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])
看看你想要的是什么:在某个位置启动数组。
我认为你基本上有两种选择:
像这样:
>>> 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?