如何从PyOpenGL中的单个数组中提取glVertexPointer()和glColorPointer()的数据?

时间:2017-10-18 22:32:55

标签: python pointers opengl pyopengl

我开始学习PyOpenGL,并且我正在学习this教程。在某一点上,教师创建了一个单一的数组,从中提取信息以构建一个三角形:vetices及其颜色(我在这里添加了Numpy行):

#-----------|-Vertices pos--|---Colors----|-----------
vertices = [-0.5, -0.5, 0.0, 1.0, 0.0, 0.0,
             0.5, -0.5, 0.0, 0.0, 1.0, 0.0,
             0.0,  0.5, 0.0, 0.0, 0.0, 1.0]

vertices = np.array(vertices, dtype = np.float32)

此数组的信息将传递给显示功能中的glVertexPointer() and glColorPointer()

def display():

    glClear(GL_COLOR_BUFFER_BIT)      
    glEnableClientState(GL_VERTEX_ARRAY)
    glEnableClientState(GL_COLOR_ARRAY)

    glVertexPointer(3, GL_FLOAT, 12, vertices)
    glColorPointer(3, GLFLOAT, 12, vertices + 3)

    glDrawArrays(GL_TRIANGLES, 0, 3)

    glDisableClientState(GL_VERTEX_ARRAY)
    glDisableClientState(GL_COLOR_ARRAY)
    glutSwapBuffers()

我的问题是这些函数的最后一个参数,在教程中(因为他正在使用C ++),他可以编写vertices + 3以告诉程序从数组的第三个位置开始读取,我不能在python中这样做。 有人可以指导我如何定义这个指针?或者如何从我的数组中提取信息。

注意:我知道我可以在不同的数组中分割顶点和颜色的信息,但我想知道是否可以使用一个数组来完成它。

编辑 - 添加完整代码:

from OpenGL.GL import *
from OpenGL.GLUT import *
import numpy as np
import ctypes

#-----------|-Vertices pos--|---Colors----|-----------
vertices = [-0.5, -0.5, 0.0, 1.0, 0.0, 0.0,
             0.5, -0.5, 0.0, 0.0, 1.0, 0.0,
             0.0,  0.5, 0.0, 0.0, 0.0, 1.0]
vertices = np.array(vertices, dtype = np.float32)

buffer_offset = ctypes.c_void_p
float_size = ctypes.sizeof(ctypes.c_float)

#-----------------------------------------------------

def display():

    glClear(GL_COLOR_BUFFER_BIT)      
    glEnableClientState(GL_VERTEX_ARRAY)
    glEnableClientState(GL_COLOR_ARRAY)

    glVertexPointer(3, GL_FLOAT, 24, buffer_offset(vertices.ctypes.data))
    glColorPointer(3, GL_FLOAT, 24, buffer_offset(vertices.ctypes.data + float_size * 3))

    glDrawArrays(GL_TRIANGLES, 0, 3)

    glDisableClientState(GL_VERTEX_ARRAY)
    glDisableClientState(GL_COLOR_ARRAY)
    glutSwapBuffers()

def reshape(w,h):
    glViewport(0,0,w,h)

def initOpenGL():
    glClearColor(0,0,0,1)

#-----------------------------------------------------

glutInit()
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH)
glutInitWindowSize(500,500)
glutCreateWindow(b'Test')

glutDisplayFunc(display)
glutIdleFunc(display)
glutReshapeFunc(reshape)

initOpenGL()
glutMainLoop()

1 个答案:

答案 0 :(得分:1)

这取决于您是否绑定了顶点缓冲区。 pointer中的最后一个参数gl*Pointer()是。

  • 没有顶点缓冲区绑定:它是顶点的地址
  • 顶点缓冲区绑定:它是相对于缓冲区地址的相对偏移量

您可以使用ctypes

import ctypes

buffer_offset = ctypes.c_void_p
float_size = ctypes.sizeof(ctypes.c_float)

假设您绑定了顶点缓冲区,那么您只需执行:

glVertexPointer(3, GL_FLOAT, 12, buffer_offset(0))
glColorPointer(3, GLFLOAT, 12, buffer_offset(float_size * 3))

如果你只是使用那个数组而没有别的,那么我会假设你可以获得地址并平均抵消它。

glVertexPointer(3, GL_FLOAT, 12, buffer_offset(vertices.ctypes.data))
glColorPointer(3, GLFLOAT, 12, buffer_offset(vertices.ctypes.data + float_size * 3))

但我不得不承认,我从来没有在Python中对此进行过必要,所以我无法确认。