gpt4 book ai didi

python - 如何使用 glDrawArrays 和 glVertexPointer?

转载 作者:行者123 更新时间:2023-12-01 07:50:23 26 4
gpt4 key购买 nike

我需要将我的程序从 glVertex 重新编写为 glDrawArrays,并且我正在尝试使用此函数进行整理。您能解释一下为什么这段代码不起作用以及如何更改它,以便它绘制 2 个三角形吗?

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)

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

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

关于python - 如何使用 glDrawArrays 和 glVertexPointer?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56247006/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com