Pregunta

A partir de este sitio: http://www.catalinzima.com/?page_id=14

Siempre he sido confundido acerca de cómo el mapa de profundidad se calcula.

La función vértice shader calcula la posición de la siguiente manera:

VertexShaderOutput VertexShaderFunction(VertexShaderInput input)

{

    VertexShaderOutput output;

    float4 worldPosition = mul(input.Position, World);

    float4 viewPosition = mul(worldPosition, View);

    output.Position = mul(viewPosition, Projection);

    output.TexCoord = input.TexCoord;                            //pass the texture coordinates further

    output.Normal =mul(input.Normal,World);                   //get normal into world space

    output.Depth.x = output.Position.z;

    output.Depth.y = output.Position.w;

    return output;

}

¿Cuáles son output.Position.z y output.Position.w? No estoy seguro de que las matemáticas detrás de esto.

Y en el sombreado de píxeles existe esta línea: = output.Depth input.Depth.x / input.Depth.y;

Así es output.Depth output.Position.z / outputPOsition.w? ¿Por qué hacemos esto?

Finalmente en el shader de luz puntual ( http://www.catalinzima.com/?page_id= 55 ) para convertir esta salida a ser una posición del código es:

 //read depth

    float depthVal = tex2D(depthSampler,texCoord).r;

    //compute screen-space position

    float4 position;

    position.xy = input.ScreenPosition.xy;

    position.z = depthVal;

    position.w = 1.0f;

    //transform to world space

    position = mul(position, InvertViewProjection);

    position /= position.w;

de nuevo no entiendo esto. En cierto modo me veo por qué usamos InvertViewProjection como multiplicamos por la proyección vista con anterioridad, sino a toda la z y w están realizando ahora a igual a 1, después de lo cual la posición entera se divide por w me confunde un poco.

¿Fue útil?

Solución

Para entender esto por completo, usted necesita entender cómo el álgebra que sustenta 3D transforma las obras. SO realmente no ayuda (o no sé cómo usarlo) para hacer matemáticas matriz, por lo que tendrá que estar sin formulas de lujo. Aquí hay alguna explicación alto nivel embargo:

Si se mira de cerca, usted notará que todas las transformaciones que ocurren a una posición de vértice (de modelo al mundo para ver a clip coordenadas) pasa a ser el uso de vectores 4D. Eso es correcto. 4D. ¿Por qué, cuando vivimos en un mundo 3D? Debido a que en esa representación 4D, todas las transformaciones que normalmente queremos hacer a los vértices se pueden expresar como una multiplicación de matrices. Este es no el caso si nos quedamos en la representación 3D. Y multiplicaciones de matrices son lo que una GPU es bueno.

¿Qué hace un vértice en 3D corresponden en 4D? Aquí es donde se pone interesante. El punto (x, y, z) corresponde a la (a.x, a.y, a.z, a) línea. Podemos tomar cualquier punto de esta línea para hacer los cálculos que necesitamos, y que por norma escoger la más fácil, a=1 (de esa manera, no tenemos que hacer ninguna multiplicación, acaba de establecer w=1).

Así que las respuestas más o menos todas las matemáticas que están viendo. Para proyectar un punto 3D en 4D nos propusimos w = 1, para volver un componente de un vector 4D, que se quiere comparar con nuestros tamaños estándar en 3D, tenemos que dividir ese componente por w.

Este sistema de coordenadas, si se quiere profundizar más, se llama homogeneous coordinates.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top