Frage

Auf dieser Seite: http://www.catalinzima.com/?page_id=14

habe ich schon immer verwirrt darüber, wie die Tiefenkarte berechnet wird.

Die Vertexshader-Funktion berechnet Position wie folgt:

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;

}

Was ist output.Position.z und output.Position.w? Ich bin nicht sicher, ob in Bezug auf die Mathematik dahinter.

Und in den Pixel-Shader gibt es diese Zeile: output.Depth = input.Depth.x / input.Depth.y;

So output.Depth ist output.Position.z / outputPOsition.w? Warum tun wir das?

Schließlich in dem Punktlicht Shader ( http://www.catalinzima.com/?page_id= 55 ), um diese Ausgabe zu konvertieren eine Position zu sein, ist der Code:

 //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;

wieder verstehe ich nicht diese. Ich irgendwie sehen, warum wir InvertViewProjection wie wir mehrfach von der Ansichtsprojektions verwenden zuvor, aber die ganze z und nun w gleich 1 gemacht wird, wonach die ganze Position von w verwirrt geteilt ist mir eine ganze Menge.

War es hilfreich?

Lösung

Um diese vollständig zu verstehen, werden Sie verstehen müssen, wie die Algebra, dass untermauert 3D-Transformationen funktioniert. SO nicht wirklich helfen (oder ich weiß nicht, wie es zu benutzen) Matrix Mathematik zu tun, so dass es ohne Phantasie formulaes sein muß. Hier finden Sie einige hohe Erklärung aber:

Wenn Sie genau hinsehen, werden Sie feststellen, dass alle Veränderungen, die zu einer Scheitelposition passieren (von Modell zu Weltkoordinaten zu sehen Clip) geschehen 4D-Vektoren werden. Stimmt. 4D. Warum, wenn wir in einer 3D-Welt leben? Da in dieser 4D-Darstellung, alle Transformationen wir in der Regel zu Eckpunkten tun wollen, sind ausdrückbar als Matrixmultiplikation. Dies ist nicht der Fall, wenn wir in 3D-Darstellung bleiben. Und Matrix-Multiplikationen sind, was eine GPU ist gut.

Was eine Ecke in 3D entspricht jedoch in 4D? Dies ist, wo es interessant wird. Der (x, y, z) Punkt entspricht die Linie (a.x, a.y, a.z, a). Wir können auf dieser Linie einen beliebigen Punkt greifen die Mathematik zu tun wir brauchen, und wir in der Regel die einfachste Pick, a=1 (auf diese Weise, wir haben noch keine Multiplikation zu tun, nur Satz w=1).

So, dass die Antworten ziemlich alle die Mathematik Sie betrachten. Um einen 3D-Punkt projizieren in 4D wir w = 1 gesetzt ist, eine Komponente aus einem 4D-Vektor zurück zu bekommen, dass wir gegen unsere Standardgrößen in 3D vergleichen wollen, müssen wir diese Komponente unterteilen, indem w.

Dieses System koordinieren, wenn Sie wollen, tauchen tiefer wird homogeneous coordinates genannt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top