如何使用glDrawArrays和glVertexPointer?

2024-05-18 09:39:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要把我的程序从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()

Tags: 函数代码import程序arraywin整理pyglet
1条回答
网友
1楼 · 发布于 2024-05-18 09:39:46

缓冲区中的数据类型必须与顶点数据数组由^{}定义时指定的类型相对应。
由于集合类型是GL_FLOAT,数组数据必须是GLfloat类型:

data = (pgl.GLfloat * len(array))(*array)

^{}(和类似函数)的第三个参数(stride)指定连续属性之间的字节偏移量。
因为每个顶点由3个分量(x,y,z)组成,一个分量的大小是GLfloat,所以{}必须是3*4=12。
由于缓冲区是紧压缩的,stride也可以设置为0。这是glVertexPointer(和类似函数)提供的特殊情况。如果stride设置为0,它将由sizetype参数自动计算。在

^{pr2}$

最终代码:

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

相关问题 更多 >