Come fa questo lavoro nel calcolo della mappa di profondità?
-
19-09-2019 - |
Domanda
Da questo sito: http://www.catalinzima.com/?page_id=14
Sono sempre stato confuso su come la mappa di profondità viene calcolata.
La funzione vertex shader calcola la posizione come segue:
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;
}
Quali sono output.Position.z e output.Position.w? Non sono sicuro per la matematica alla base di questo.
E nel pixel shader c'è questa linea: output.Depth = input.Depth.x / input.Depth.y;
Quindi output.Depth è output.Position.z / outputPOsition.w? Perché facciamo questo?
Infine nella luce Shader punto ( http://www.catalinzima.com/?page_id= 55 ) per convertire questa uscita per essere una posizione il codice è:
//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;
ancora non capisco questo. I sorta di capire perché usiamo InvertViewProjection come moltiplichiamo dalla sporgenza vista in precedenza, ma l'intero z e ora w fatti alla parità 1, dopo di che la posizione intera è diviso da w mi confonde un po '.
Soluzione
Per capire questo completamente, è necessario capire come l'algebra che sostiene 3D trasforma opere. SO non aiuta (o non so come usarlo) per fare matrice matematica, quindi dovrete fare a meno formulaes fantasia. Ecco qualche spiegazione di alto livello anche se:
Se si guarda da vicino, si noterà che tutte le trasformazioni che avvengono ad una posizione di vertice (dal modello al mondo di visualizzare a clip coordinate) sembra essere utilizzando vettori 4D. Giusto. 4D. Perché, quando viviamo in un mondo 3D? Perché in questa rappresentazione 4D, tutte le trasformazioni che di solito vogliamo fare per i vertici sono esprimibili come moltiplicazione di matrici. Si tratta di non il caso se restiamo nella rappresentazione 3D. E moltiplicazione di matrici sono ciò che una GPU è bravo a.
Che cosa fa un vertice in 3D corrispondono al 4D? Questo è dove si fa interessante. Il punto (x, y, z)
corrisponde alla linea (a.x, a.y, a.z, a)
. Siamo in grado di afferrare qualsiasi punto su questa linea per fare la matematica abbiamo bisogno, e noi di solito scegliere il più facile, a=1
(in questo modo, non abbiamo a che fare ogni moltiplicazione, basta impostare w=1
).
In modo che le risposte più o meno tutta la matematica che si Ecco. Per proiettare un punto 3D in 4D abbiamo impostato w = 1, per tornare un componente da un vettore 4D, che vogliamo confrontare con i nostri formati standard in 3D, dobbiamo dividere tale componente da w.
Questo sistema di coordinate, se si desidera immergersi a profondità, si chiama homogeneous coordinates
.