In vertex shader avete gl_Vertex (o qualcosa d'altro, se non si utilizza gasdotto fisso), che è la posizione di un vertice in coordinate modello. Moltiplica la matrice del modello di gl_Vertex e otterrai la posizione del vertice nelle coordinate del mondo. Assegnalo a variando la variabile, quindi leggi il suo valore in framment shader e otterrai la posizione del frammento nelle coordinate del mondo.
Ora il problema è che non si dispone necessariamente di una matrice modello se si utilizza la matrice modelview predefinita di OpenGL, che è una combinazione di matrici di modelli e di viste. Di solito risolvere questo problema avendo due matrici separati invece di una sola matrice modelview:
- matrice modello (modello mappe coordinate coordinate mondo), e
- vista matrice (mappe coordinate globali a telecamera).
Quindi basta passare due diverse matrici al vertex shader separatamente. Puoi farlo definendo
uniform mat4 view_matrix;
uniform mat4 model_matrix;
All'inizio del vertex shader. E allora invece di ftransform(), dicono:
gl_Position = gl_ProjectionMatrix * view_matrix * model_matrix * gl_Vertex;
Nel programma principale è necessario scrivere i valori di entrambe queste nuove matrici. Innanzitutto, per ottenere la matrice di visualizzazione, effettuare le trasformazioni della telecamera con glLoadIdentity(), glTranslate(), glRotate() o gluLookAt() o qualunque cosa si preferisca normalmente, quindi chiamare glGetFloatv (GL_MODELVIEW_MATRIX, & array); per ottenere i dati della matrice su un array. E in secondo luogo, in modo simile, per ottenere la matrice del modello, chiamate anche glLoadIdentity(); e fai le trasformazioni dell'oggetto con glTranslate(), glRotate(), glScale() ecc. e infine chiama glGetFloatv (GL_MODELVIEW_MATRIX, & array); per ottenere i dati matrix da OpenGL, in modo da poterli inviare al vertex shader. Soprattutto notare che è necessario chiamare glLoadIdentity() prima di iniziare a trasformare l'oggetto. Normalmente si dovrebbe prima trasformare la fotocamera e quindi trasformare l'oggetto che risulterebbe in una matrice che esegue sia la vista che le funzioni del modello. Ma poiché si utilizzano matrici separate, è necessario reimpostare la matrice dopo le trasformazioni della telecamera con glLoadIdentity().
gl_FragCoord sono le coordinate dei pixel e non le coordinate del mondo.
Non moltiplicare dal tuo gl_ModelViewMatrix. – Hannesh