2009-08-15 2 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); 
} 

Это часть моего пикселя. Почему существует ошибка компилятора? Я компилирую его в ps_3_0. Без mul() скомпилирован.Ошибка компилятора HLSL?

+0

Какая ошибка вы получаете? Он прекрасно компилируется здесь. – Tchami

+0

C: \ Dokumente унд Einstellungen \ Администратор \ Desktop \ Program \ 3д \ Litte3DEngine2 \ Bin \ Release \ Shader \ Directional_Lighting_Shader_Default.fx (91): ID3DXEffectCompiler :: CompileEffect: Был ошибка компиляции выражение: ID3DXEffectCompiler: Компиляция не удалось – gufftan

+0

линии 91 : PixelShader = compile ps_3_0 PS(); – gufftan

ответ

1

Ahh, я думаю, это имеет смысл. Поскольку w componentenet не инициализирован, функция mul() не будет выполнена.

Чтобы избежать этого можно инициализировать вектор следующим образом:

float4 PosImageSpace = (float4)0; 

Я по-прежнему рекомендую вам попробовать компиляции шейдеров с помощью FXC в режиме отладки, как вы можете получить гораздо лучшие описания ошибок таким образом. Вы даже можете настроить пользовательский шаг сборки, который позволяет щелкнуть файл .fx правой кнопкой мыши и скомпилировать его, не компилируя все решение/проект.

Чтобы скомпилировать шейдер с помощью FXC в конфигурации отладки:

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

Вы можете найти FXC в C: \ Program Files \ Microsoft DirectX SDK \ Utilities \ Bin

Чтобы настроить пользовательские сборки шаг в Visual Studio check this sample from the DirectX SDK, а также check this site

Также проверьте this article on msdn об использовании fxc.

0

Это странно: я добавил эту строку:

PosImageSpace.w = 0.0f; 

и теперь он компилирует хорошо. Вот как это выглядит сейчас:

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

Я обновил свой ответ немного подробнее. Это было просто проще, чем написать все в комментарии :) – Tchami

Смежные вопросы