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

标签 python pointers opengl pyopengl

我开始学习 PyOpenGL,我正在关注 this教程。在某一时刻,教师创建一个数组,从中提取信息来构造一个三角形:顶点及其颜色(我在此处添加了 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()

最佳答案

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

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

您可以利用ctypes来实现此目的。

import ctypes

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

假设您有一个顶点缓冲区绑定(bind),那么您只需执行以下操作:

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 中从来没有这样的需要,所以我无法确认。

关于python - 如何从 PyOpenGL 中的单个数组中提取 glVertexPointer() 和 glColorPointer() 的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46820254/

相关文章:

c++ - 如何使用 Qt QwtPlot3D 可视化数据

visual-studio-2010 - 使用 File* 对象时出现错误指针错误

python - 如何在 Python 中为包装的 C++ 函数传递指向数组的指针

python - 加速两个字符串的成对比较

python - 在 Python 中使用类和函数通过递归查找结果时出现问题

c - (C) 传递给 func 的指针与原始指针不同

c++ - 片段着色器中的 OpenGL 点 Sprite 旋转

c# - 如何在 OpenTK .NET Core 中设置 OpenGL API 版本?

python - 使用 Beautiful Soup 和 Python 抓取 Asp.NET 网站

python - 如何将 DataFrame 的每一行导出到同一工作簿中的不同工作表?