I negozi variabile gl_FragCoord quattro componenti: (x, y, z, 1/w)Cosa significa la coordinata 1/w per in gl_FragCoord?
Qual è la w coordinare e perché è memorizzato come 1/w?
I negozi variabile gl_FragCoord quattro componenti: (x, y, z, 1/w)Cosa significa la coordinata 1/w per in gl_FragCoord?
Qual è la w coordinare e perché è memorizzato come 1/w?
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.
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.
"' gl_FragCoord' memorizza questa proiezione "No, memorizza una trasformazione di post-proiezione di quello nello spazio della finestra. –