Тип данных в буфере должен соответствовать типу, который указан, когда массив данных вершин определен как glVertexPointer
.
Поскольку тип набора GL_FLOAT
, данные массива должны иметь тип GLfloat
:
data = (pgl.GLfloat * len(array))(*array)
Третий параметр (stride
) из glVertexPointer
(и аналогичные функции) указывает смещение байта между последовательными атрибутами.
Поскольку каждая вершина состоит из 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()