2012-06-20 39 views
2

如何在PyOpenGL python綁定到OpenGL中使用glBufferData()?如何在PyOpenGL中使用glBufferData()?

當我在錯誤消息中

Haven't implemented type-inference for lists yet 

運行下面的代碼

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()的結果的代碼應該畫上一個綠色背景上的紅色矩形。

回答

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