|
|
发表于 2009-5-20 10:08:00
|
显示全部楼层
Re:有没有什么游戏是用shader来计算骨骼蒙皮的?
这是ms xna skinning sample中的代码,应该算是可以使用了
如果还要优化,那么可以把boneMatrix改为4*3(或者3*4)的矩阵
#define MaxBones 59
// Input parameters.
float4x4 View;
float4x4 Projection;
float4x4 Bones[MaxBones];
struct VS_INPUT
{
float4 Position : POSITION0;
float3 Normal : NORMAL0;
float2 TexCoord : TEXCOORD0;
float4 BoneIndices : BLENDINDICES0;
float4 BoneWeights : BLENDWEIGHT0;
};
VS_OUTPUT VertexShader(VS_INPUT input)
{
VS_OUTPUT output;
// Blend between the weighted bone matrices.
float4x4 skinTransform = 0;
skinTransform += Bones[input.BoneIndices.x] * input.BoneWeights.x;
skinTransform += Bones[input.BoneIndices.y] * input.BoneWeights.y;
skinTransform += Bones[input.BoneIndices.z] * input.BoneWeights.z;
skinTransform += Bones[input.BoneIndices.w] * input.BoneWeights.w;
// Skin the vertex position.
float4 position = mul(input.Position, skinTransform);
output.Position = mul(mul(position, View), Projection);
// Skin the vertex normal, then compute lighting.
float3 normal = normalize(mul(input.Normal, skinTransform));
//float3 normal = normalize(mul(skinTransform, input.Normal));
float3 light1 = max(dot(normal, Light1Direction), 0) * Light1Color;
float3 light2 = max(dot(normal, Light2Direction), 0) * Light2Color;
output.Lighting = light1 + light2 + AmbientColor;
output.TexCoord = input.TexCoord;
return output;
}
float4 PixelShader(PS_INPUT input) : COLOR0
{
float4 color = tex2D(Sampler, input.TexCoord);
color.rgb *= input.Lighting;
return color;
}
ps:我不是大师....-_-# |
|