Las tiendas variables gl_FragCoord cuatro componentes: (x, y, z, 1/w)¿Qué significa la coordenada 1/w en gl_FragCoord?
¿Cuál es el w coordinar y por qué se almacena como 1/w?
Las tiendas variables gl_FragCoord cuatro componentes: (x, y, z, 1/w)¿Qué significa la coordenada 1/w en gl_FragCoord?
¿Cuál es el w coordinar y por qué se almacena como 1/w?
Las especificaciones GLSL y OpenGL son innecesariamente confusas en este sentido. La especificación de OpenGL es más fácil de entender: gl_FragCoord
almacena los componentes X, Y y Z de la posición del vértice del espacio de la ventana. Los valores X, Y y Z se calculan como se describe para calcular la posición del espacio de la ventana (aunque el origen del píxel y el origen superior izquierdo pueden modificar los valores X e Y). Esto se describe en la sección Coordinate Transforms
de la especificación.
El componente W de gl_FragCoord
es (1/W c), donde W c es el clip-espacio posición vértice. Es gl_Position.w
desde su sombreador de vértices.
El único propósito útil para mantener W c alrededor es reverse-transform gl_FragCoord
para recuperar la posición del espacio de clips. Lo cual, como muestra esa página, requiere multiplicar por W c. Pero dado que gl_FragCoord
solo almacena el inverso de este valor, ahora requiere dividir por gl_FragCoord.w
.
Por lo tanto, podemos suponer que OpenGL lo almacena de esta manera porque OpenGL no tiene demasiado sentido;) Vea, es una regla que cada parte de la especificación OpenGL debe tener algo que no tiene sentido. Los componentes XYZ tenían demasiado sentido, por lo que decidieron almacenar el valor inverso al que realmente deseas.
Bien, técnicamente esto es un artefacto histórico de los días en que 3D Labs creó GLSL. Estoy seguro de que lo hicieron por razones de hardware puramente egoístas, pero no tengo una prueba real de eso.
A coordenadas homogéneas viene dada por: (x, y, z, w), que se proyecta a: (x/w, y/w, z/w). gl_FragCoord
almacena esta proyección, pero en lugar de almacenar el (inútil) (w/w) = (1) para el último componente, almacena (1/w), para conservar información útil.
"' gl_FragCoord' almacena esta proyección "No, almacena una transformación de proyección de esa en el espacio de la ventana. –