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。