PyOpenGL:glVertexPointer()偏移问题
我的顶点在 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++ 应用程序中使用了几乎完全相同的代码,并且它有效。
My vertices are interleaved in a numpy array (dtype = float32) like this: ... tu, tv, nx, ny, nz, vx, vy, vz, ...
When rendering, I'm calling gl*Pointer() like this (I have enabled the arrays before):
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 )
The result is that nothing renders. However, if I organize my array so that the vertex position is the first element ( ... vx, vy, vz, tu, tv, nx, ny, nz, ... ) I get correct positions for vertices while rendering but texture coords and normals aren't rendered correctly.
This leads me to believe that I'm not setting the pointer offset right. How should I set it? I'm using almost the exact same code in my other app in C++ and it works.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
在Python中,你不能进行指针算术。您尝试做的事情仅适用于 C/C++。
使用普通的 Python 列表:
使用 numpy 数组:
看看两者都没有达到您想要的效果:从某个位置开始数组。
我认为你基本上有两个选择:
像这样:
将其与正确的步幅相结合,您可能可以让它发挥作用。
In python, you can't do pointer arithmetic. What you're trying to do only works for C/C++.
With normal Python list:
With numpy arrays:
See how neither does what you want: starting the array at a certain position.
I think you have basically two options:
Like this:
Combine this with a correct stride, you can probably get it to work.
我遇到了类似的问题,发现将偏移量转换为 ctypes.c_void_p 成功了。
I ran into a similar problem and found that casting the offset to ctypes.c_void_p did the trick.
我正在回答我自己的问题,因为我找到了另一种方法来实现正确的结果。我没有调用 gl*Pointer(),而是调用:
我仍然很好奇找到一个与 gl*Pointer() 一起使用的解决方案。
I'm answering my own question, because I found an alternative way to accomplish the correct result. Instead of calling gl*Pointer(), I called:
I'm still curious to find a solution that works with gl*Pointer().
根据此链接: http://www.opengl.org/sdk /docs/man/xhtml/glTexCoordPointer.xml
您确定在您的情况下步幅是 (2 + 3 + 3) * 4 吗?
According to this link: http://www.opengl.org/sdk/docs/man/xhtml/glTexCoordPointer.xml
Are you sure, that in your case stride is (2 + 3 + 3) * 4 ?