2010-10-15 29 views
2

Salut les gens cela devrait être une tâche facile, mais pour une raison quelconque, je ne comprends pas élaboré ...profondeur de rendu en HLSL

Je veux juste obtenir une visualisation de la profondeur dans ma scène à l'aide d'un shader :

float4x4 matViewProjection; 
float4x4 matWorld; 
float4 eyePos; 

struct VS_OUTPUT 
{ 
    float4 position : POSITION0; 
    float depth : TEXCOORD0; 
}; 

VS_OUTPUT vs_main(VS_INPUT input) 
{ 
VS_OUTPUT output; 
output.position = mul(input.position, matViewProjection); 

float3 posWorld = mul(input.position, matWorld); 
output.depth = distance(posWorld, eyePos); 
return(output); 
} 

Pour obtenir la valeur de profondeur (ce que je pensais) je calcule la distance entre la position dans l'espace mondial et la position de la vue.

Et le pixel shader correspondant

float4 ps_main(VS_OUTPUT input) : COLOR0 
{ 
    float depth = input.depth; 
    return float4(depth, depth, depth, 1.0f); 
} 

qui se traduit rien d'autre qu'une couleur blanche

Alors j'ai commencé essai & erreur multipliant une valeur à la profondeur:

float depth = input.depth * 0.005f; 

qui donne une satisfaction résultat en fonction de la distance à l'objet. Donc, si je me rapproche de l'objet, je vais devoir ajuster à nouveau la valeur.

theres quelque chose de très mal ...

Merci pour la lecture!

Répondre

5

Eh bien votre problème est que vous ne normaliser la valeur de la profondeur à aucun moment. Il peut être n'importe où dans la plage de ZNear à ZFar.

Effectuez les opérations suivantes pour votre shader vert:

VS_OUTPUT vs_main(VS_INPUT input) 
{ 
VS_OUTPUT output; 
output.position = mul(input.position, matViewProjection); 
output.depth = output.position.z/output.position.w; 
return(output); 
} 

Après fracture avec une valeur Z valide sera compris entre 0 et 1. Toute valeur Z qui ne sont pas dans cette gamme est en dehors du tronc de cône (c'est-à-dire devant le plan de coupure proche ou derrière le plan de coupure éloigné) et n'atteindra donc pas le pixel shader de toute façon.

+0

Oui ... Je n'ai pas oublié de normaliser la valeur, mais j'ai utilisé la fonction normalize() pour cela et j'ai juste obtenu une couleur grise ... Je n'ai pas pensé à utiliser la division homogène - merci pour ce rappel !!! – SideEffect

+1

gardez à l'esprit que le type de normalisation dont je parle est très différent d'une normalisation vectorielle. – Goz

2

Juste une courte distance plus: utilisant

output.depth = output.position.z/output.position.w; 

résultats dans un endroit sombre à la coloration lumineuse le long de la distance tout en

output.depth = 1.0f - (output.position.z/output.position.w); 

entraînerait brillant à la coloration foncée, ce qui est correct, espérons aussi bien .

+0

Ouais c'est parfaitement ok. – Goz