4

我有一段看起来非常丑陋的小代码,每当我试图用 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()
4

2 回答 2

3

我认为您不需要将数据的地址转换为浮点指针,您可以直接传递地址:

gl.glVertexPointer(2, gl.GL_FLOAT, 0, vertPoints.ctypes.data)
gl.glColorPointer(3,  gl.GL_FLOAT, 0, vertColors.ctypes.data)
于 2013-03-24T22:59:40.953 回答
2

您可以直接将 Numpy 浮点数组与顶点缓冲区对象一起使用。不过,我还没有在 Pyglet 的上下文中使用它们。就像是:

from OpenGL.arrays import vbo

# setup
vertices_gl = vbo.VBO(vertPoints)
colours_gl = vbo.VBO(vertPoints)

# in drawing code
vertices.bind()
colours.bind()
glVertexPointer(2, gl.GL_FLOAT, 0, vertices_gl)
glColorPointer(2, gl.GL_FLOAT, 0, vertices_gl)
于 2013-03-24T21:06:15.170 回答