2011-08-23 5 views
6

Per favore correggimi se sbaglio. Quando si usano vertex e pixel shader, di solito forniamo il codice per calcolare l'output gl_position del vertex shader. Quindi, ci ritroviamo con l'input gl_FragCoord nel pixel shader. Quali sono il nome delle operazioni eseguite da OpenGL per calcolare gl_FragCoord da gl_position? È corretto che quelli siano "proiezione" e "trasformazione delle coordinate di clip"? Quindi, quali sono esattamente le trasformazioni eseguite durante quelle operazioni? In altri termini, qual è la relazione matematica tra gl_FragCoord e gl_position, che potrei usare per sostituire la funzione openGL?In glsl, qual è la formula usata per calcolare gl_fragCoord da gl_position?

Grazie mille per qualsiasi contributo.

+0

Ho avuto lo stesso problema e la domanda un po 'di tempo fa, e ho risposto io stesso nella domanda "OpenGL: Compute coord space space da window space coord in GLSL?", Che puoi trovare un link a destra. – karx11erx

+0

Mi dispiace karx11erx, questo non è quello che voglio. In realtà, penso che quello che voglio sia il contrario. Non voglio "non proiettare", voglio proiettare le mie coordinate 3d sulle coordinate dello schermo 2D. – wil

+0

Potete vedere come fare anche lì, perché lo shader prima non proietta (dallo spazio di visualizzazione della luce) e poi proietta (nello spazio dello schermo del visualizzatore). – karx11erx

risposta

9

gl_Position è in coordinate omogenee post-proiezione.

Vale la pena notare che GL_POSITION è la posizione (4d) di un vertice , mentre gl_FragCoord è la posizione (2d) di un frammento .

Le operazioni che avvengono tra sono

  1. assemblaggio primitiva (per generare un triangolo da 3 vertici, ad esempio)
  2. clipping (cioè tagliare il triangolo in più triangoli che sono tutti all'interno della vista, se inizialmente non adatta)
  3. applicazione finestra
  4. rasterizzazione (prendere quei triangoli e generare frammenti coperti da loro)

Quindi, mentre è possibile trovare la formula per trasformare il punto arbitrario rappresentato dalla posizione del vertice nello spazio 2D che è il viewport, non è utile a sé stesso, poiché i frammenti generati non si allineano direttamente al posizione al vertice. la formula per ottenere la coordinata 2d del vertice è

2d_coord_vertex = viewport.xy + viewport.wh * (1 + gl_Position.xy/gl_Position.w)/2 

Ancora, questo non è gl_FragCoord. Controllare i dettagli sulla rasterizzazione nella specifica GL se si desidera una conoscenza più approfondita.

Non so esattamente cosa intendi per "sostituire la funzione openGL", ma la rasterizzazione non è banale e va oltre lo scopo di una risposta SO.

+0

Grazie per la risposta. Il mio scopo è quello di implementare uno shader per l'illuminazione delle mappe ombra. Ho creato una mappa di profondità (mappa ombra) rendendo la scena dalla posizione di luce (utilizzando "matrice di proiezione" della luce), tuttavia quando il rendering vertici della scena finale non so che coordina utilizzare per recuperare i dati ombra dalla mappa . Ho pensato che potevo usare la "matrice di proiezione" della luce per ottenere il valore che era gl_position quando ho creato la mappa delle ombre, e quindi calcolare il valore che era gl_fragCoord quando ho creato la mappa delle ombre, per recuperare i dati dell'ombra nella posizione corretta. Funziona? – wil

+0

@wil: il modo tipico per farlo è passare un mondo o visualizzare la posizione dello spazio insieme a gl_Position (in un output diverso) allo shader del frammento. In questo modo, nello shader di frammenti, la corretta posizione interpolata (in vista o nello spazio del mondo, a seconda di ciò che hai passato), può essere trasformata da una matrice per riportarla nello spazio luminoso. La risposta breve è, non fare affidamento su gl_FragCoord, passare ciò di cui hai bisogno. – Bahbar

+0

Non sono sicuro di cosa stai cercando, ma non sembra calcolare una mappa delle ombre. Questo è ciò a cui mi riferivo, e suona in modo significativamente diverso dalla tua stessa cosa. Consiglierei di aprire una nuova domanda, con alcune informazioni su _qualcosa_ che stai cercando di risolvere – Bahbar

Problemi correlati