私は3Dとシェーダーを学んでいて、何週間もかけて作成したシェーダーを持っています。
IDirect3DDevice9::CreateVertexShader()
このシェーダーの1行に問題があります。コメントを付けて別のシェーダーに置き換えると、が呼び出されたときにエフェクトが失敗します。すべてのフィールドが設定されています。この動作は、すべてのboneTransforms
とviewProj
を単位行列に設定した場合にも発生します。モデルが表示されますが、その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();
}
}
ありがとうございました!