Now first, I'm still waaay newbie at HLSL;
I thought such a "simple" code (not many articulated functions, just a big, main one) would be technically correct, but it keeps crashing :/
//Transformation Matrices
matrix matW;
matrix matVP;
extern float4x4 MatrixPalette[35];
extern int numBoneInfluences = 2;
//Vertex Input
struct VS_INPUT_SKIN
{
float4 position : POSITION0;
float3 normal : NORMAL;
float2 tex0 : TEXCOORD0;
float4 weights : BLENDWEIGHT0;
int4 boneIndices : BLENDINDICES0;
};
//Vertex Output / Pixel Shader Input
struct VS_OUTPUT
{
float4 position : POSITION0;
float2 tex0 : TEXCOORD0;
float shade : TEXCOORD1;
};
VS_OUTPUT vs_Skinning(VS_INPUT_SKIN IN)
{
VS_OUTPUT OUT = (VS_OUTPUT)0;
float4 p = float4(0.0f, 0.0f, 0.0f, 1.0f);
float3 norm = float3(0.0f, 0.0f, 0.0f);
float lastWeight = 0.0f;
int n = numBoneInfluences-1;
IN.normal = normalize(IN.normal);
//Blend vertex position & normal
for(int i = 0; i < n; ++i)
{
lastWeight += IN.weights[i];
p += IN.weights[i] * mul(IN.position, MatrixPalette[IN.boneIndices[i]]);
norm += IN.weights[i] * mul(IN.normal, MatrixPalette[IN.boneIndices[i]]);
}
lastWeight = 1.0f - lastWeight;
p += lastWeight * mul(IN.position, MatrixPalette[IN.boneIndices[n]]);
norm += lastWeight * mul(IN.normal, MatrixPalette[IN.boneIndices[n]]);
p.w = 1.0f;
//Transform vertex to world space
float4 posWorld = mul(p, matW);
//... then to screen space
OUT.position = mul(posWorld, matVP);
//Copy UV coordinate
OUT.tex0 = IN.tex0;
//Calculate Lighting
norm = normalize(norm);
norm = mul(norm, matW);
OUT.shade = max(dot(norm, normalize(lightPos - posWorld)), 0.2f);
return OUT;
}
technique Skinning
{
pass P0
{
Lighting = false;
VertexShader = compile vs_2_0 vs_Skinning();
}
}
C++ runs correctly other shader files, but with this one it crashes (0xC0000005 access violation) whenever it gets to the point where it sets the matrices for it (ID3DXEffect->SetMatrix();), no matter what matrix I choose to set first.
Is the error in the HLSL itself or is it C++ related? Do I have to post more code?