2012-04-30 9 views

risposta

12

Le specifiche GLSL e OpenGL sono inutilmente confuse a questo proposito. Le specifiche OpenGL sono più facili da capire: gl_FragCoord memorizza le componenti X, Y e Z della posizione del vertice dello spazio della finestra. I valori X, Y e Z sono calcolati come descritto per calcolare la posizione dello spazio finestra (sebbene l'origine pixel-centro e superiore-sinistra possa modificare i valori X e Y). Questo è descritto nella sezione Coordinate Transforms della specifica.

Il componente O di gl_FragCoord è (1/W c), dove W c è il clip-space posizione vertice. È gl_Position.w dal vertex shader.

L'unico scopo utile per mantenere W c in giro è a reverse-transform gl_FragCoord per ripristinare la posizione dello spazio per le clip. Quale, come quella pagina mostra, richiede moltiplicando per W c. Ma dal momento che lo gl_FragCoord memorizza solo l'inverso di questo valore, ora richiede la divisione per gl_FragCoord.w.

Pertanto, possiamo presumere che OpenGL lo memorizzi in questo modo perché OpenGL non è autorizzato a fare troppo senso;) Vedi, è una regola che ogni parte delle specifiche OpenGL deve avere qualcosa che sia un po 'priva di senso. I componenti XYZ erano troppo intuitivi, quindi decisero di memorizzare l'inverso del valore che si desidera effettivamente.

OK, tecnicamente questo è un artefatto storico dai tempi in cui 3D Labs creava GLSL. Sono sicuro che l'hanno fatto per ragioni puramente egoistiche dell'hardware, ma non ne ho una vera prova.

2

Un coordinate omogenee è data da: (x, y, z, w), sporgente a: (x/w, y/w, z/w). gl_FragCoord memorizza questa proiezione, ma anziché archiviare il (inutile) (w/w) = (1) per l'ultimo componente, memorizza (1/w), per conservare informazioni utili.

+1

"' gl_FragCoord' memorizza questa proiezione "No, memorizza una trasformazione di post-proiezione di quello nello spazio della finestra. –