如何从 PyOpenGL 中的单个数组中提取 glVertexPointer() 和 glColorPointer() 的数据?
How to extract data for glVertexPointer() and glColorPointer() from a single array in 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()
这取决于您是否绑定了顶点缓冲区。 gl*Pointer()
中的最后一个参数pointer
是.
- 没有绑定顶点缓冲区:它是顶点的地址
- Vertex Buffer Bound:这是相对于缓冲区地址的相对偏移量
您可以为此使用 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中从来没有需要这个,所以我无法确认。
我开始学习 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()
这取决于您是否绑定了顶点缓冲区。 gl*Pointer()
中的最后一个参数pointer
是.
- 没有绑定顶点缓冲区:它是顶点的地址
- Vertex Buffer Bound:这是相对于缓冲区地址的相对偏移量
您可以为此使用 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中从来没有需要这个,所以我无法确认。