我需要将程序从glVertex
修改为glDrawArrays
,并且尝试使用此功能进行梳理。您能解释一下为什么此代码不起作用以及如何对其进行更改,以便绘制两个三角形吗?
import pyglet
import pyglet.gl as pgl
win = pyglet.window.Window(1300, 1000, resizable=True)
@win.event
def on_draw():
array = [100, 100, 0,
500, 300, 0,
900, 100, 0,
100, 300, 0,
500, 500, 0,
900, 300, 0]
pgl.glClearColor(0.3, 0.3, 0.3, 0.0)
pgl.glEnableClientState(pgl.GL_VERTEX_ARRAY)
pgl.glVertexPointer(3, pgl.GL_FLOAT, 18, (pgl.GLubyte * len(array))(*array))
pgl.glDrawArrays(pgl.GL_TRIANGLES, 0,18)
pgl.glDisableClientState(pgl.GL_VERTEX_ARRAY)
pyglet.app.run()
最佳答案
缓冲区中数据的类型必须与glVertexPointer
定义顶点数据数组时指定的类型相对应。
由于集合类型为GL_FLOAT
,因此数组数据的类型必须为GLfloat
:
data = (pgl.GLfloat * len(array))(*array)
stride
(和类似功能)的第3个参数(glVertexPointer
)指定连续属性之间的字节偏移。由于每个顶点包含3个分量(x,y,z),并且一个分量的大小为
GLfloat
的大小,因此stride
必须为3 * 4 = 12。由于缓冲区紧紧包装,因此
stride
也可以设置为0。这是glVertexPointer
(和类似功能)提供的特殊情况。如果stride
设置为0,它将由size
和type
参数自动计算。pgl.glVertexPointer(3, pgl.GL_FLOAT, 0, data)
最终代码:
import pyglet
import pyglet.gl as pgl
win = pyglet.window.Window(1300, 1000, resizable=True)
@win.event
def on_draw():
array = [100, 100, 0,
500, 300, 0,
900, 100, 0,
100, 300, 0,
500, 500, 0,
900, 300, 0]
pgl.glClearColor(0.3, 0.3, 0.3, 0.0)
pgl.glEnableClientState(pgl.GL_VERTEX_ARRAY)
data = (pgl.GLfloat * len(array))(*array)
pgl.glVertexPointer(3, pgl.GL_FLOAT, 0, data)
pgl.glDrawArrays(pgl.GL_TRIANGLES, 0, 18)
pgl.glDisableClientState(pgl.GL_VERTEX_ARRAY)
pyglet.app.run()