2012-04-30 15 views

Respuesta

12

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.

2

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.

+1

"' gl_FragCoord' almacena esta proyección "No, almacena una transformación de proyección de esa en el espacio de la ventana. –