2009-08-31 9 views
2

J'ai un morceau de code HLSL qui ressemble à ceci:problème avec looping HLSL/échantillonnage

float4 GetIndirection(float2 TexCoord) 
{ 
    float4 indirection = tex2D(IndirectionSampler, TexCoord); 

    for (half mip = indirection.b * 255; mip > 1 && indirection.a < 128; mip--) 
    { 
     indirection = tex2Dlod(IndirectionSampler, float4(TexCoord, 0, mip)); 
    } 
    return indirection; 
} 

Les résultats que je recevais sont compatibles avec cette boucle que l'exécution d'une fois. J'ai vérifié le shader dans PIX et les choses sont devenues encore plus bizarres, la flèche jaune indiquant la position dans le code arrive à la boucle, la traverse une fois et revient au début, à ce moment la flèche jaune ne bouge plus mais le curseur se déplace à travers le code et renvoie un résultat (un bug dans PIX, ou est-ce que je ne l'utilise pas correctement?)

Je soupçonne que cela peut être un problème avec les lectures de texture qui sont déplacées hors de la boucle par le compilateur, mais je pensais que cela ne se produise avec tex2Dlod depuis que je suis le réglage de la LOD manuellement:/

Alors:

1) Quel est le problème?

2) Des solutions suggérées?

+0

Compilez-vous contre SM3 ou SM4? SI c'est directx 10, vous pouvez définir les indicateurs D3D10_SHADER_DEBUG et D3D10_SHADER_SKIP_OPTIMIZATION lors de la compilation de votre shader car cela peut vous aider à localiser le problème dans PIX. – Tchami

+0

Compilation à SM3 en utilisant DirectX9, qui est le plus élevé que je peux utiliser puisque c'est XNA – Martin

+0

Ok, ce n'était pas immédiatement évident puisque vous l'avez marqué à la fois DirectX et XNA;) – Tchami

Répondre

2

Le problème a été résolu, c'était une erreur de codage simple, j'avais besoin d'augmenter le niveau de mip à chaque itération, pas de le diminuer.

float4 GetIndirection(float2 TexCoord) 
{ 
    float4 indirection = tex2D(IndirectionSampler, TexCoord); 

    for (half mip = indirection.b * 255; mip > 1 && indirection.a < 128; mip++) 
    { 
     indirection = tex2Dlod(IndirectionSampler, float4(TexCoord, 0, mip)); 
    } 
    return indirection; 
}