2009-08-15 10 views
1
float4x4 matInvViewProj; 

float4 GetPointPosition(float2 Tex0) 
{ 
    float4 PosImageSpace; 
    PosImageSpace.xy = float2(Tex0*2-1); 
    PosImageSpace.z = tex2D(DepthTextureSampler,Tex0).r; 
    return mul(PosImageSpace,matInvViewProj); 
} 

Cela fait partie de mes pixelshader. Pourquoi y a-t-il une erreur de compilation? Je le compile dans ps_3_0. Sans le mul() il compile.Erreur de compilateur HLSL?

+0

Quelle erreur obtenez-vous? Il compile bien ici. – Tchami

+0

C: \ Dokumente und Einstellungen \ Administrateur \ Desktop \ Program Files \ 3d \ Litte3DEngine2 \ bin \ Release \ Shader \ Directional_Lighting_Shader_Default.fx (91): ID3DXEffectCompiler :: CompileEffect: Il y avait une erreur de compilation expression ID3DXEffectCompiler: Compilation a échoué – gufftan

+0

ligne 91 : PixelShader = compile ps_3_0 PS(); – gufftan

Répondre

1

Ahh, je suppose que c'est logique. Puisque le composant w n'est pas initialisé, la fonction mul() échouera.

Pour l'éviter, vous pouvez initialiser votre vecteur comme suit:

float4 PosImageSpace = (float4)0; 

Je vais quand même vous recommander de compiler votre shaders en utilisant FXC en mode débogage, comme vous pouvez obtenir beaucoup de meilleures descriptions d'erreur de cette façon. Vous pouvez même configurer une étape de construction personnalisée qui vous permet de faire un clic droit sur le fichier .fx et de le compiler sans avoir à compiler l'ensemble de la solution/du projet.

Pour compilez le shaders en utilisant FXC dans une configuration de débogage:

fxc /Od /Zi /T fx_3_0 /Fo Directional_Lighting_Shader_Defaul.fxo Directional_Lighting_Shader_Defaul.fx 

Vous pouvez trouver FXC dans C: \ Program Files \ Microsoft DirectX SDK \ Utilities \ bin

Pour configurer une version personnalisée étape dans Visual Studio check this sample from the DirectX SDK et également check this site

Vérifiez également this article on msdn à propos de l'utilisation de fxc.

0

C'est bizarre: je ajouté cette ligne:

PosImageSpace.w = 0.0f; 

et maintenant il compile bien. Voilà à quoi il ressemble maintenant:

float4x4 matInvViewProj; 

float4 GetPointPosition(float2 Tex0) 
{ 
    float4 PosImageSpace; 
    PosImageSpace.xy = float2(Tex0*2-1); 
    PosImageSpace.z = tex2D(DepthTextureSampler,Tex0).r; 
    PosImageSpace.w = 0.0f; 
    return mul(PosImageSpace,matInvViewProj); 
} 
+0

J'ai mis à jour ma réponse avec un peu plus d'informations. C'était juste plus facile que de tout écrire dans un commentaire :) – Tchami

Questions connexes