Editar: rotoglup encontró los problemas en mi código, agregando los sombreadores que había eliminado completaron la solución. Ver mi respuesta a continuación para el código correcto (con sombreadores).basic openGL, buffers de vértice y pyglet
¡Hola a todos!
Estoy tratando de aprender algunos conceptos básicos de OpenGL moderno desde this tutorial.
Me gustaría hacerlo con python/pyglet en lugar de C++. Sé que pyglet puede abstraer gran parte del bajo nivel de OpenGL; Sin embargo, quiero entender algunos de los conceptos básicos antes de seguir ocultándolos detrás de capas de abstracción.
Mi problema es extremadamente simple: el siguiente código solo dibuja un punto único en lugar de los 3 que estoy esperando. Mi código es, hasta donde puedo decir, idéntico al C++ en el tutorial, excepto por la eliminación de los sombreadores de vértices y fragmentos (hecho a través de gletools en python), que parece no afectar mi problema.
Simplificar las cosas en un solo punto muestra un comportamiento que no entiendo (la primera coordenada parece ser la única que afecta a algo), lo que me lleva a pensar que simplemente no pude entender algo muy básico sobre cualquiera Pyglet, OpenGL, o incluso en 3D en general: p
Aquí está el código correspondiente:
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()
¿Quiere decir que con el código corregido, todavía tiene un único punto dibujado? ¿Este punto está dibujado en el medio de la pantalla? Si cambias las primeras coordenadas, ¿se mueve el punto? – rotoglup
Con el código corregido, lo mejor que obtengo es un único punto que no se mueve con la coordenada w en 1 y pasando el tamaño en bytes. Si elimino las coordenadas w y cambio glVertexAttribPointer en consecuencia, no obtengo nada. ¡Estoy completamente confundido! –
Corrección: w tiene que estar en 0 para que se muestre algo, lo que me hace más confuso. –