Edit: rotoglup обнаружил проблемы в моем коде, добавив шейдеры, которые я удалил, завершило решение. Правильный код (с шейдерами) см. В моем ответе ниже.
Привет всем!
Я ' Я пытаюсь изучить основы современного OpenGL из этого руководства .
Я бы хотел сделать это с помощью python / pyglet вместо C ++. Я знаю, что пиглет может абстрагировать большую часть низкоуровневого OpenGL; Я хочу понять некоторые основы, прежде чем переходить к их сокрытию за слоями абстракции.
Моя проблема чрезвычайно проста: приведенный ниже код рисует только одну точку вместо трех, которые я ожидал. Насколько я могу судить, мой код идентичен C ++ в руководстве, за исключением удаления вершинных и фрагментных шейдеров (выполняется с помощью gletools в python), что, похоже, не имеет значения для моих
Упрощение вещей до одной точки показывает поведение, которое я не понимаю (первая координата, кажется, единственная, которая влияет на что-либо), что возвращает меня к моему убеждению, что я просто не смог понять чего-то очень простого. либо pyglet, либо OpenGL, либо даже 3D в целом: p
Вот соответствующий код:
import pyglet
from pyglet.gl import *
window = pyglet.window.Window()
positionBufferObject = GLuint()
vao = GLuint()
vertexPositions = [0.0, 0.0, 0.0,
0.25, 0.0, 0.0,
1.75, 1.75, 0.0]
vertexPositionsGl = (GLfloat * len(vertexPositions))(*vertexPositions)
@window.event
def on_draw():
glBindBuffer(GL_ARRAY_BUFFER, positionBufferObject)
glEnableVertexAttribArray(0)
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0)
glDrawArrays(GL_POINTS, 0, 3)
glDisableVertexAttribArray(0)
glGenBuffers(1, positionBufferObject)
glBindBuffer(GL_ARRAY_BUFFER, positionBufferObject)
glBufferData(GL_ARRAY_BUFFER, len(vertexPositionsGl)*4, vertexPositionsGl, GL_STATIC_DRAW)
glBindBuffer(GL_ARRAY_BUFFER, 0)
glClearColor(0.0, 0.0, 0.0, 0.0)
pyglet.app.run()