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 '.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top