Pyglet VBO glVertexPointer
Pyglet VBOs glVertexPointer
我已经使用 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()
提前致谢!
我可以通过添加以下内容来显示颜色:
...
glClientStateEnable(GL_COLOR_ARRAY)
vbo=VBO()
vbo.data(vertices)
color=VBO()
color.data(colors)
...
pyglet 的嵌入式文档非常无用,但是 glColorPointer 的手册页非常清楚地指出 glDrawArray 会忽略颜色数组,直到 GL_COLOR_ARRAY 通过 glClientStateEnable 启用。
我已经使用 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()
提前致谢!
我可以通过添加以下内容来显示颜色:
...
glClientStateEnable(GL_COLOR_ARRAY)
vbo=VBO()
vbo.data(vertices)
color=VBO()
color.data(colors)
...
pyglet 的嵌入式文档非常无用,但是 glColorPointer 的手册页非常清楚地指出 glDrawArray 会忽略颜色数组,直到 GL_COLOR_ARRAY 通过 glClientStateEnable 启用。