2015-10-30 13 views
0

我已經使用了PyOpenGL很長一段時間,但現在,我已經切換到PyGlet。 PyGlet更加嚴格的PyOpenGL,所以我現在正在學習它。我已經使用VBOs編寫了一個簡單的代碼來呈現一個三角形(我從PyGlet教程中學習了這個基礎),但它不適用於我。Pyglet VBOs glVertexPointer

它應該呈現一個彩色的三角形,而不是,它呈現出一個白色的三角形。我做錯了什麼?

這裏是我的代碼:

from pyglet.gl import * 

window = pyglet.window.Window() 
glEnableClientState(GL_VERTEX_ARRAY) 
vertices = [ 
    0,0,0, 
    window.width,0,0, 
    window.width,window.height,0] 

colors=[1.0,0.0,0.0, 
     0.0,1.0,0.0, 
     0.0,0.0,1.0] 

class VBO(): 
    def __init__(self): 
     self.buffer=(GLuint)(0) 
     glGenBuffers(1,self.buffer) 
    def data(self,data): 
     data_gl= (GLfloat * len(data))(*data) 
     glBindBuffer(GL_ARRAY_BUFFER_ARB, self.buffer) 
     glBufferData(GL_ARRAY_BUFFER_ARB, len(data)*4, 
        data_gl, GL_STATIC_DRAW) 

    def bind(self): 
     glBindBuffer(GL_ARRAY_BUFFER_ARB, self.buffer) 
    def vertex(self): 
     self.bind() 
     glVertexPointer(3, GL_FLOAT, 0, 0) 
    def color(self): 
     self.bind() 
     glColorPointer(3, GL_FLOAT, 0, 0) 




vbo=VBO() 
vbo.data(vertices) 
color=VBO() 
color.data(colors) 

@window.event 
def on_draw(): 
    glClear(GL_COLOR_BUFFER_BIT) 
    glLoadIdentity() 
    vbo.vertex() 
    color.color() 
    glDrawArrays(GL_TRIANGLES, 0, len(vertices) // 2) 

@window.event 
def on_resize(width, height): 
    glViewport(0, 0, width, height) 
    glMatrixMode(gl.GL_PROJECTION) 
    glLoadIdentity() 
    glOrtho(0, width, 0, height, -1, 1) 
    glMatrixMode(gl.GL_MODELVIEW) 

pyglet.app.run() 

提前感謝!

+0

您使用的是什麼版本的Python?我擔心VBO的類聲明是空的父類聲明。 – Erik

+0

@Erik我正在使用PYthon 2.7,但如果VBO對象創建問題,它不應該呈現任何東西。 – Sasszem

回答

1

我能得到通過增加顯示的顏色如下:

... 

glClientStateEnable(GL_COLOR_ARRAY) 

vbo=VBO() 
vbo.data(vertices) 
color=VBO() 
color.data(colors) 

... 

的pyglet嵌入文檔是單獨無益,但是對於glColorPointer手冊頁是指出,彩色陣列被忽略的很清楚glDrawArray直到通過glClientStateEnable啓用了GL_COLOR_ARRAY。

Triangle drawn with colored vertices.

+0

感謝您的幫助!我知道問題很簡單,有些事情被忽略了! – Sasszem