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()にコンパイルしています。

4

2 に答える 2

1

ああ、それは理にかなっていると思います。w componenetが初期化されていないため、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でカスタムビルドステップを設定するには、DirectX SDKからこのサンプルを確認し、このサイトも確認してください

fxcの使用については、msdnのこの記事も確認してください。

于 2009-08-16T12:04:25.353 に答える
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);
}
于 2009-08-17T08:15:40.837 に答える