Question

A partir de ce site: http://www.catalinzima.com/?page_id=14

J'ai toujours été confus au sujet de la façon dont on calcule la carte de profondeur.

La fonction de vertex shader calcule la position de la façon suivante:

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;

}

Quels sont output.Position.z et output.Position.w? Je ne suis pas sûr que les mathématiques derrière tout cela.

Et dans le pixel shader il y a cette ligne: output.Depth = input.Depth.x / input.Depth.y;

output.Depth est output.Position.z / outputPOsition.w? Pourquoi faisons-nous cela?

Enfin, dans le shader point de lumière ( http://www.catalinzima.com/?page_id= 55 ) pour convertir cette sortie à une position de code est le suivant:

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

encore une fois, je ne comprends pas. Je vois en quelque sorte pourquoi nous utilisons InvertViewProjection comme nous multiplions par la projection de vue précédemment, mais l'ensemble z et maintenant w étant faite à l'égalité 1, après quoi la position est divisé par w me trouble un peu.

Était-ce utile?

La solution

Pour comprendre cela complètement, vous aurez besoin de comprendre comment l'algèbre qui sous-tend les transformations 3D fonctionne. SO ne pas vraiment aider (ou je ne sais pas comment l'utiliser) pour faire des mathématiques de la matrice, donc il faudra être sans formulaes fantaisie. Voici quelques explications de haut niveau si:

Si vous regardez attentivement, vous remarquerez que toutes les transformations qui se produisent à une position de sommet (du modèle au monde à voir pour couper les coordonnées) passe à l'aide de vecteurs 4D. C'est vrai. 4D. Pourquoi, quand nous vivons dans un monde 3D? Parce que dans cette représentation 4D, toutes les transformations que nous voulons habituellement faire pour les sommets sont exprimable comme une multiplication de la matrice. Ceci est pas le cas si nous restons dans la représentation 3D. Et multiplications de matrice sont ce qu'un GPU est bon.

Qu'est-ce qu'un sommet en 3D correspondent à 4D? C'est là que ça devient intéressant. Le point de (x, y, z) correspond à la ligne (a.x, a.y, a.z, a). Nous pouvons saisir tout point de cette ligne pour faire le calcul nous avons besoin, et nous choisir habituellement le plus facile, a=1 (cette façon, nous ne devons pas faire une multiplication, vient de mettre w=1).

Alors que les réponses à peu près toutes les mathématiques que vous regardez. Pour projeter un point 3D dans 4D, nous fixons w = 1, pour récupérer un composant d'un vecteur 4D, que nous voulons comparer à nos tailles standard en 3D, nous devons diviser ce composant par w.

Ce système de coordonnées, si vous voulez plonger plus profondément, est appelé homogeneous coordinates.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top