Python 如何使用GLDrawArray和glVertexPointer?
我需要将我的程序从Python 如何使用GLDrawArray和glVertexPointer?,python,opengl,pyglet,opengl-compat,Python,Opengl,Pyglet,Opengl Compat,我需要将我的程序从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,
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()
缓冲区中的数据类型必须与定义顶点数据数组时指定的类型相对应。
由于设置类型为
GL_FLOAT
,因此数组数据必须为GLfloat
类型:
data=(pgl.GLfloat*len(数组))(*array)
(和类似函数)的第三个参数(stride
)指定连续属性之间的字节偏移量。由于每个顶点由3个分量(x、y、z)组成,且一个分量的大小为
GLfloat
,因此步幅必须为3*4=12。
由于缓冲区是紧密压缩的,stride
也可以设置为0。这是由glvertexpinter
(和类似函数)提供的特殊情况。如果步幅
设置为0,则由大小
和类型
参数自动计算
pgl.glvertexinter(3,pgl.GL\u浮点,0,数据)
最终代码:
导入pyglet
将pyglet.gl作为pgl导入
win=pyglet.window.window(1300,1000,可调整大小=True)
@胜利事件
def on_draw():
数组=[100100,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_顶点_数组)
数据=(pgl.GLfloat*len(数组))(*array)
pgl.glVertexPointer(3,pgl.GLU浮点,0,数据)
pgl.gldrawArray(pgl.GL_三角形,0,18)
pgl.glDisableClientState(pgl.GL\u顶点\u数组)
pyglet.app.run()文件
例如,如果我想输入顶点的数组坐标(x,y,z)、法线的坐标(x1,y1,z1)和纹理的坐标(x2,y2,z2),参数stride将是9?@popeythesailer否如果类型是GLfloat
,则步幅为9*4=36。对于法向量,必须向数据指针添加偏移量3*4=12,向纹理坐标添加偏移量6*4=24。