1

私は3Dとシェーダーを学んでいて、何週間もかけて作成したシェーダーを持っています。

IDirect3DDevice9::CreateVertexShader()このシェーダーの1行に問題があります。コメントを付けて別のシェーダーに置き換えると、が呼び出されたときにエフェクトが失敗します。すべてのフィールドが設定されています。この動作は、すべてのboneTransformsviewProjを単位行列に設定した場合にも発生します。モデルが表示されますが、その1行(コメント付き)を変更すると、頂点シェーダーがコンパイルされなくなります。なぜこれが起こるのですか?私はこれをデバッグするのに何日も費やしましたが、理由を見つけることができません!

static const int MAX_MATRICES = 100;
float4x3    boneTransforms[MAX_MATRICES] : WORLDMATRIXARRAY;
float4x4    ViewProj : VIEWPROJECTION;

struct VS_INPUT
{
    float3  Pos             : POSITION;
    float4  BlendWeights    : BLENDWEIGHT;
    float4  BlendIndices    : BLENDINDICES;
    float3  Normal          : NORMAL;
    float2  Tex0            : TEXCOORD0;
};

struct VS_OUTPUT
{
    float4  Pos      : POSITION;
    float2  Tex0     : TEXCOORD0;
    float4  Diffuse  : COLOR;
};

VS_OUTPUT VShade(VS_INPUT i)
{
    VS_OUTPUT   o;

    int4 blendIndicies = D3DCOLORtoUBYTE4(i.BlendIndices);

    float blendWeights[4] = (float[4])i.BlendWeights;
    int boneIndicies[4] = (int[4])blendIndicies;

    float3 pos = mul(i.Pos, boneTransforms[boneIndicies[0]]) * blendWeights[0]
                  + mul(i.Pos, boneTransforms[boneIndicies[1]]) * blendWeights[1]
                  + mul(i.Pos, boneTransforms[boneIndicies[2]]) * blendWeights[2]
                  + mul(i.Pos, boneTransforms[boneIndicies[3]]) * blendWeights[3];

    float4 aaa = mul(float4(pos.xyz, 1.0f), ViewProj);

    //////////////////////////////////////////////////////////////////////////////
    // If I comment out this SINGLE line
    o.Pos = mul(float4(i.Pos.xyz, 1.0f), ViewProj);
    // and replace it with this one, then IDirect3DDevice9::CreateVertexShader() returns D3DERR_INVALIDCALL
    // o.Pos = aaa;
    //////////////////////////////////////////////////////////////////////////////

    o.Diffuse = 1.0f;
    o.Tex0  = i.Tex0.xy;
    return o;
}

float4 PShade(VS_OUTPUT i) : COLOR
{
    return float4(1.0, 1.0, 1.0, 1.0);
}

technique technique0
{
    pass p0
    {
        //PixelShader = compile ps_2_0 PShade();
        VertexShader = compile vs_2_0 VShade();
    }
}

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

4

1 に答える 1

1

MAX_MATRICESを減らすようにする必要があります

static const int MAX_MATRICES = 50;

そうしないと、最大の一定のバッファサイズを超えてしまいます。

于 2012-10-14T11:49:25.527 に答える