Pyglet VBOs glVertexPointer

Posted

技术标签:

【中文标题】Pyglet VBOs glVertexPointer【英文标题】: 【发布时间】:2015-10-30 22:22:37 【问题描述】:

我已经使用 PyOpenGL 很长时间了,但现在,我已经切换到 PyGlet。 PyGlet 比 PyOpenGL 更严格,所以我现在正在学习它。我使用 VBO 编写了一个简单的代码来渲染三角形(我从 PyGlet 教程中获取了基础),但它对我不起作用。

它应该渲染一个彩色三角形,而不是渲染一个白色三角形。我做错了什么?

这是我的代码:

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()

提前致谢!

【问题讨论】:

您使用的是什么版本的 Python?我担心带有空父类声明的 VBO 的类声明。 @Erik 我使用的是 PYthon 2.7,但如果 VBO 对象产生问题,它不应该渲染任何东西。 【参考方案1】:

我能够通过添加以下内容来显示颜色:

...

glClientStateEnable(GL_COLOR_ARRAY) 

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

...

pyglet 的嵌入式文档非常无用,但是 glColorPointer 的手册页非常清楚地指出,在通过 glClientStateEnable 启用 GL_COLOR_ARRAY 之前,glDrawArray 会忽略颜色数组。

【讨论】:

感谢您的帮助!我知道问题很简单,只是忽略了一些事情!

以上是关于Pyglet VBOs glVertexPointer的主要内容,如果未能解决你的问题,请参考以下文章

切换到 glVertexPointer 后未应用 Cg 着色器

如何使用 glDrawArrays 和 glVertexPointer?

openGL之API学习(一八八)glVertexAttribPointer和glVertexPointer

NDK OpenGL 未定义对 glVertexPointer 的引用

openGL之API学习(一六九)glVertexPointer

glvertexpointer std::vector,结构内存 opengl