locked
XNA4.0移行時の問題について RRS feed

  • 質問

  • 一点を覗いてすべて4.0に対応することができたのですがどうしても解決しなかったので質問させていただきます。


    問題になったのはシェーダなのですが、3.0では通っていたはずの
    <pre>

     

    #define MaxBones 117

    float4x4 View;
    float4x4 Projection;

    float4 BoneRotations[MaxBones];
    float3 BoneTranslations[MaxBones];

    texture Texture;

    sampler Sampler = sampler_state
    {
        Texture = (Texture);

        MinFilter = Linear;
        MagFilter = Linear;
        MipFilter = Linear;
    };

    float4x4 CreateTransformFromQuaternionTransforms(float4 q1,float3 t1,
                          float4 q2, float3 t2,
                          float4 q3, float3 t3,
                          float4 q4, float3 t4,
                          float4 weights )
    {
     float ww = q1.w * q1.w - 0.5f;
     float3 row10 = float3( ww         , q1.x * q1.y, q1.x * q1.z ) + float3( q1.x * q1.x, q1.w * q1.z,-q1.w * q1.y );
     float3 row11 = float3( q1.x * q1.y, ww,          q1.y * q1.z ) + float3(-q1.w * q1.z, q1.y * q1.y, q1.w * q1.x );
     float3 row12 = float3( q1.x * q1.z, q1.y * q1.z, ww          ) + float3( q1.w * q1.y,-q1.w * q1.x, q1.z * q1.z );
     
     ww = q2.w * q2.w - 0.5f;
     float3 row20 = float3( ww,          q2.x * q2.y, q2.x * q2.z ) + float3( q2.x * q2.x, q2.w * q2.z,-q2.w * q2.y );
     float3 row21 = float3( q2.x * q2.y, ww,          q2.y * q2.z ) + float3(-q2.w * q2.z, q2.y * q2.y, q2.w * q2.x );
     float3 row22 = float3( q2.x * q2.z, q2.y * q2.z, ww          ) + float3( q2.w * q2.y,-q2.w * q2.x, q2.z * q2.z );
     
     ww = q3.w * q3.w - 0.5f;
     float3 row30 = float3( ww,          q3.x * q3.y, q3.x * q3.z ) + float3( q3.x * q3.x, q3.w * q3.z,-q3.w * q3.y );
     float3 row31 = float3( q3.x * q3.y, ww,          q3.y * q3.z ) + float3(-q3.w * q3.z, q3.y * q3.y, q3.w * q3.x );
     float3 row32 = float3( q3.x * q3.z, q3.y * q3.z, ww          ) + float3( q3.w * q3.y,-q3.w * q3.x, q3.z * q3.z );
     
     ww = q4.w * q4.w - 0.5f;
     float3 row40 = float3( ww,          q4.x * q4.y, q4.x * q4.z ) + float3( q4.x * q4.x, q4.w * q4.z,-q4.w * q4.y );
     float3 row41 = float3( q4.x * q4.y, ww,          q4.y * q4.z ) + float3(-q4.w * q4.z, q4.y * q4.y, q4.w * q4.x );
     float3 row42 = float3( q4.x * q4.z, q4.y * q4.z, ww          ) + float3( q4.w * q4.y,-q4.w * q4.x, q4.z * q4.z );       
     float4 w2 = 2.0f * weights;
     
     return float4x4(
      row10 * w2.x + row20 * w2.y + row30 * w2.z + row40 * w2.w, 0,
      row11 * w2.x + row21 * w2.y + row31 * w2.z + row41 * w2.w, 0,
      row12 * w2.x + row22 * w2.y + row32 * w2.z + row42 * w2.w, 0,
      t1 * weights.x + t2 * weights.y + t3 * weights.z + t4 * weights.w, 1
     );
     
    }

    struct VS_INPUT
    {
        float4 Position : POSITION0;
        float3 Normal : NORMAL0;
        float2 TexCoord : TEXCOORD0;
        float4 BoneIndices : BLENDINDICES0;
        float4 BoneWeights : BLENDWEIGHT0;
    };

    struct VS_OUTPUT
    {
        float4 Position : POSITION0;
        float2 TexCoord : TEXCOORD0;
    };

    VS_OUTPUT NormalVertexShader(VS_INPUT input)
    {
        VS_OUTPUT output;

        float4x4 skinTransform = CreateTransformFromQuaternionTransforms(
       BoneRotations[input.BoneIndices.x], BoneTranslations[input.BoneIndices.x],
       BoneRotations[input.BoneIndices.y], BoneTranslations[input.BoneIndices.y],
       BoneRotations[input.BoneIndices.z], BoneTranslations[input.BoneIndices.z],
       BoneRotations[input.BoneIndices.w], BoneTranslations[input.BoneIndices.w],
       input.BoneWeights );
       
        float4 position = mul(input.Position, skinTransform);
        output.Position = mul(mul(position, View), Projection);
        output.TexCoord = input.TexCoord;
        return output;
    }

    struct PS_INPUT
    {
        float2 TexCoord : TEXCOORD0;
    };

    float4 NormalPixelShader(PS_INPUT input) : COLOR0
    {
        float4 color = tex2D(Sampler, input.TexCoord);
        return color;
    }

    technique SkinnedModelTechnique
    {
        pass SkinnedModelPass
        {
            VertexShader = compile vs_2_0 NormalVertexShader();
            PixelShader = compile ps_2_0 NormalPixelShader();
        }
    }
    </pre>

     

     

     

     というエフェクトファイルがコンパイルエラーを吐くようになってしまいました。
    エラーの内容は


    エラー 1 C:hogehoge.fx のコンパイル中にエラーが発生しました:
    C:hogehoge.fx(43,9): error X4505: maximum temp register index exceeded
    C:hogehoge.fx(42,9): error X4505: maximum temp register index exceeded
    C:hogehoge.fx(44,9): error X4505: maximum temp register index exceeded
    C:hogehoge.fx(42,9): error X4505: maximum temp register index exceeded
    C:hogehoge.fx(42,9): error X4505: maximum temp register index exceeded
    C:hogehoge.fx(42,9): error X4505: maximum temp register index exceeded
    C:hogehoge.fx(42,9): error X4505: maximum temp register index exceeded
    C:hogehoge.fx(43,9): error X4505: maximum temp register index exceeded
    C:hogehoge.fx(43,9): error X4505: maximum temp register index exceeded
    C:hogehoge.fx(43,9): error X4505: maximum temp register index exceeded
    C:hogehoge.fx(44,9): error X4505: maximum temp register index exceeded
    C:hogehoge.fx(44,9): error X4505: maximum temp register index exceeded
    ID3DXEffectCompiler: Compilation failed C:\hogehoge.fx 43 9 

    コメントの日本語を無くしましたが解決せず、コマンドプロントにて「fxc.exe 名前 /T fx_2_0 /Fo 書き出す名前 」としても同じエラーでコンパイルできませんでした。

    内容は「ひにけにXNA」様のクォータニオンによるスキニングモデルの内容と一致しているはずなので問題ないと思っておりますし、3.0の時は問題なくコンパイルできておりました。
    Reach、HiDef共に通りません。

    解決方法など頂けましたら助かります。
    よろしくお願いします。

    2011年2月8日 18:37

回答

  • とりあえず、最後のテクニックの部分を
    VertexShader = compile vs_3_0 NormalVertexShader();
    PixelShader = compile ps_3_0 NormalPixelShader();

    とするとコンパイル通るようです。
    ひにけにさんの4.0対応版もシェーダーモデル3.0になっていました。
    2011年2月10日 4:43

すべての返信

  • とりあえず、最後のテクニックの部分を
    VertexShader = compile vs_3_0 NormalVertexShader();
    PixelShader = compile ps_3_0 NormalPixelShader();

    とするとコンパイル通るようです。
    ひにけにさんの4.0対応版もシェーダーモデル3.0になっていました。
    2011年2月10日 4:43
  • 別の記事にて
  • SM 2.0だとテンポラリレジスタが足りなくなってしまうので、SM 3.0に変更、つまりHiDefのみの対応

     

    という文面を見つけました。
    2.0で通す方法が知りたいところですが今回は諦めたいと思います。

    ありがとうございました。

2011年2月10日 6:06