如何使用 glDrawArrays 和 glVertexPointer?
How to work with glDrawArrays and glVertexPointer?
我需要将我的程序从 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,则由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()
我需要将我的程序从 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,则由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()