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

私は同様の問題に遭遇し、オフセットを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 に答える
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])

どちらもあなたが望むことをしない方法を見てください:特定の位置で配列を開始します。

基本的に2つのオプションがあると思います:

  1. インターリーブ配列を使用しないでください。これには 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 に答える
0

このリンクによると: http://www.opengl.org/sdk/docs/man/xhtml/glTexCoordPointer.xml

ストライド

連続するテクスチャ座標セット間のバイト オフセットを指定します。stride が 0 の場合、配列要素は密集していると見なされます。初期値は 0 です。

あなたの場合、ストライドは (2 + 3 + 3) * 4 ですか?

于 2010-04-22T06:32:19.510 に答える
0

正しい結果を達成する別の方法を見つけたので、私は自分の質問に答えています。gl*Pointer() を呼び出す代わりに、次のように呼び出しました。

glInterleavedArrays( GL_T2F_N3F_V3F, stride, self.vertArray )

gl*Pointer() で動作するソリューションを見つけることにまだ興味があります。

于 2010-04-21T16:18:19.913 に答える