我有一段看起来非常丑陋的小代码,每当我尝试用 pyglet 绘制数组时,我似乎都会继续使用它,形式如下:
vertPoints = someArray.flatten().astype(ctypes.c_float)
vertices_gl = vertPoints.ctypes.data_as(ctypes.POINTER(ctypes.c_float))
我根据使用 numpy 和 pyglet 找到的少数资源拼凑在一起。有没有更优雅的方法来获取指向 numpy 数组的指针作为 c_floats?
下面是我写的一个小例子的上下文中的代码:
import numpy as np; import ctypes
import pyglet; import pyglet.gl as gl
def drawArray(someArray):
vertPoints = someArray[:,:2].flatten().astype(ctypes.c_float)
vertices_gl = vertPoints.ctypes.data_as(ctypes.POINTER(ctypes.c_float))
vertColors = someArray[:,2:].flatten().astype(ctypes.c_float)
colors_gl = vertColors.ctypes.data_as(ctypes.POINTER(ctypes.c_float))
gl.glVertexPointer(2, gl.GL_FLOAT, 0, vertices_gl)
gl.glColorPointer(3, gl.GL_FLOAT, 0, colors_gl)
gl.glDrawArrays(gl.GL_POINTS, 0, len(vertPoints) // 2)
window = pyglet.window.Window(400,400)
@window.event
def on_draw():
gl.glPointSize(10.0)
gl.glEnable(gl.GL_POINT_SMOOTH)
gl.glEnable(gl.GL_BLEND)
gl.glBlendFunc(gl.GL_SRC_ALPHA, gl.GL_ONE_MINUS_SRC_ALPHA)
gl.glEnableClientState(gl.GL_VERTEX_ARRAY)
gl.glEnableClientState(gl.GL_COLOR_ARRAY)
points = np.random.random((50,5))*np.array([400,400,1,1,1])
drawArray(points)
pyglet.app.run()
最佳答案
我认为你不需要将数据的地址转换为浮点指针,你可以直接传递地址:
gl.glVertexPointer(2, gl.GL_FLOAT, 0, vertPoints.ctypes.data)
gl.glColorPointer(3, gl.GL_FLOAT, 0, vertColors.ctypes.data)
关于python - 在 Pyglet 中使用 numpy 数组和 ctypes 进行 OpenGL 调用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15603931/