2017-10-18 148 views
1

我开始学习PyOpenGL,我正在关注this教程。在一个点上的教师创建从他提取信息来构造一个三角形的单个阵列:vetices和它们的颜色(I加入这里的numpy的线):如何从PyOpenGL中的单个数组中提取glVertexPointer()和glColorPointer()的数据?

#-----------|-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

这取决于你是否有一个顶点缓冲约束与否。 gl*Pointer()中的最后一个参数pointer也是。

  • 没有顶点缓冲区绑定:这是地址到顶点
  • 顶点缓存绑定:这是一个相对的关系偏移到缓冲区地址

您可以利用​​为了这。

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这方面的需要,所以我不能确认。

+0

非常感谢,您添加的最后一条信息完成了工作。我仍然不清楚它在做什么。但我会发现。谢谢。 –

+0

不客气! 'vertices.ctypes.data'返回数组的地址。因此,地址中的前4个字节(浮点大小)将是“顶点”中的第一个元素(以每4个字节为单位)。因此,如果我们采用“地址+ 4 * 3”,那么这将是第一个颜色元素的地址。你已经告诉了步幅(24字节),这就是为什么它只需要知道起始地址。跨度为24个字节,因为您有6个浮点数(X,Y,Z,R,G,B)。 '6个浮点数* 4个float_size = 24个字节'。 – Vallentin

相关问题