Modifica: rotoglup ha trovato i problemi nel mio codice, aggiungendo gli ombreggiatori che avevo rimosso completato la soluzione. Vedere la mia risposta sotto per il codice corretto (con shader).openGL di base, buffer di vertici e pyglet
Ciao a tutti!
Sto cercando di imparare alcune nozioni di base della moderna OpenGL da this tutorial.
Mi piacerebbe farlo con python/pyglet invece di C++. So che Pyglet può astrarre molto del livello basso OpenGL di distanza; Voglio capire alcune delle basi prima di passare a nascondendole dietro strati di astrazione però.
Il mio problema è estremamente semplice: il codice seguente disegna solo un punto invece del 3 che mi aspetto. Il mio codice è, per quanto posso dire, identico al C++ nel tutorial, fatta eccezione per la rimozione di vertex e framment shaders (eseguita tramite gletools in python), che sembra non fare alcuna differenza per il mio problema.
Semplificare le cose in un singolo punto mostra un comportamento che non capisco (la prima coordinata sembra essere l'unica che influisce su qualsiasi cosa), riportandomi alla mia convinzione che semplicemente non sono riuscito a capire qualcosa di molto basilare su entrambi pyglet, OpenGL, o anche in 3D in generale: p
Ecco il codice in questione:
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()
Vuoi dire che con il codice corretto, hai ancora un punto tracciato? Questo punto è disegnato al centro dello schermo? Se cambi le prime coordinate, il punto si muove? – rotoglup
Con il codice corretto, il meglio che ottengo è ancora un singolo punto che non si sposta con la coordinata w in 1 e passando la dimensione in byte. Se rimuovo le coordinate w e cambio glVertexAttribPointer di conseguenza, non ottengo nulla. Sono completamente confuso! Correzione –
: w deve essere a 0 per far comparire qualcosa, il che mi rende solo più confuso. –