Как работать с glDrawArrays и glVertexPointer? - PullRequest
1 голос
/ 22 мая 2019

Мне нужно переработать мою программу с 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()

1 Ответ

1 голос
/ 22 мая 2019

Тип данных в буфере должен соответствовать типу, который указан, когда массив данных вершин определен как 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()
...