4

我的顶点交错在一个 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, ... )我在渲染时得到正确的顶点位置但纹理坐标和法线未正确渲染。

这让我相信我没有正确设置指针偏移量。我应该如何设置它?我在我的其他 C++ 应用程序中使用几乎完全相同的代码并且它可以工作。

4

4 回答 4

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. 使用切片可能对您有用。

像这样:

>>> 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])

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

于 2010-04-25T05:41:52.777 回答
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 )
于 2011-01-15T22:33:40.397 回答
0

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

glInterleavedArrays( GL_T2F_N3F_V3F, stride, self.vertArray )

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

于 2010-04-21T16:18:19.913 回答
0

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

大步

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

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

于 2010-04-22T06:32:19.510 回答