2012-06-20 2 views
2

Как вы используете glBufferData() в привязках python PyOpenGL к OpenGL?Как использовать glBufferData() в PyOpenGL?

Когда я запускаю следующий результат кода

import sys 
from OpenGL.GL import * 
from PySide.QtCore import * 
from PySide.QtGui import * 
from PySide.QtOpenGL import * 

class SimpleTestWidget(QGLWidget): 

    def __init__(self): 
     QGLWidget.__init__(self) 

    def initializeGL(self): 
     self._vertexBuffer = glGenBuffers(1) 
     glBindBuffer(GL_ARRAY_BUFFER, self._vertexBuffer) 
     vertices = [0.5, 0.5, -0.5, 0.5, -0.5, -0.5, 0.5, -0.5] 
     glBufferData(GL_ARRAY_BUFFER, vertices, GL_STATIC_DRAW) # Error 

    def paintGL(self): 
     glViewport(0, 0, self.width(), self.height()) 
     glClearColor(0.0, 1.0, 0.0, 1.0) 
     glClear(GL_COLOR_BUFFER_BIT) 

     glEnableClientState(GL_VERTEX_ARRAY) 
     glBindBuffer(GL_ARRAY_BUFFER, self._vertexBuffer) 
     glVertexPointer(2, GL_FLOAT, 0, 0) 
     glColor3f(1.0, 0.0, 0.0) 
     glDrawArrays(GL_QUADS, 0, 4) 

if __name__ == '__main__': 
    app = QApplication(sys.argv) 
    w = SimpleTestWidget() 
    w.show() 
    app.exec_() 

тогда вызов к glBufferData() в сообщении об ошибке

Haven't implemented type-inference for lists yet 

Код должен нарисовать красный прямоугольник на зеленом фоне.

ответ

7

В качестве временного решения, пока списки не поддерживаются, проходят вершины как Numpy массива:

vertices = numpy.array([0.5, 0.5, -0.5, 0.5, -0.5, -0.5, 0.5, -0.5], 
         dtype='float32') 

Вызов glVertexPointer должен быть glVertexPointer(2, GL_FLOAT, 0, None)

+0

Спасибо! Это решает проблему. – user763305

+0

Я озадачен тем, что четвертый аргумент glVertexPointer должен быть None; см. следующий вопрос: http://stackoverflow.com/questions/11132716/how-to-specify-buffer-offset-with-pyopengl – user763305

+0

Кроме того, вы можете избежать необходимости связывать буферы вручную с помощью [обертки VBO] (http://pyopengl.sourceforge.net/documentation/pydoc/OpenGL.arrays.vbo.html). – Milliams

0

Вы можете также использовать массив объект массив модуль:

from array import array 
vert=[0.0,0.0,0.0, 
     1.0,0.0,0.0, 
     1.0,1.0,0.0, 
     0.0,1.0,0.0] 

ar=array("f",vert) 
glBufferData(GL_ARRAY_BUFFER, ar.tostring(), GL_STATIC_DRAW) 

https://docs.python.org/2/library/array.html

Смежные вопросы