matBones
Enthält ein Shader ein Matrix-Array mit diesem Namen, berechnet die Engine die Bonesanimation auf der GPU anstatt auf der CPU. Auf diese Weise werden bones-animierte Modelle bis zu zehnmal schneller gerendet, vor allem dann, wenn sie viele Bones oder Bones-Gewichte haben.
Typ:
float4x3
Bemerkungen:
- Funktionen, die sich auf Vertex-Positionen verlassen - wie etwa vec_for_vertex, decals, Mauserkennung, polygonale Kollisionen, Traces etc. - können, wenn die Bonesanimation auf der GPU berechnet wird, nicht benutzt werden.
- Die Größe des Arrays muss der Anzahl der Bones des Modells entsprechen oder größer sein. Da die Anzahl von Shadervariablen, inklusive Bones-Matritzen, begrenzt ist, verwenden Sie bitte keine Modelle, die mehr als 70 Bones haben. Die DoBones Funktion der default.fx Shader-Codebibliothek allokiert 72 Bones-Matrizen; falls dies andere Shader-Variablen limitiert, reduzieren Sie diese Zahl.
- A8.11 Die Array-Größe kann per Skript aus dem maxbones Parameter des Material-Structs gelesen werden. Diese Variable kann auch verwendet werden, um festzustellen, ob ein Material einen GPU Bones Shader enthält.
- Das Modell sollte nicht mehr als 4 Bones pro Vertex haben, und die Bones mit dem höchsten Gewicht sollten zuerst kommen. Andernfalls kann in der GPU Bones-Animation eine Verzerrung sichtbar sein.
- Wenn Normalen auch mit der DoBones Funktion transformiert werden sollen, dürfen die Bones-Matrizen nur Rotationen und Translationen enthalten - sonst wird die Schattierung des Modells falsch aussehen. Beliebige Bones-Matrizen erfordern die Transformation der Normalen mit der invertierten transponierten Matrix, was die Shader-Framerate ungünstig beeinflussen würde.
- Der Code-Ordner enthält einen Beispiel-Shader, bones.fx. Der Shader läßt sich mit anderen Shadern, beispielsweise für Oberflächen-Bumpmapping kombinieren. Das Beispiel crowd.c benutzt GPU-Bonesanimation.
- Existiert eine Shadervariable iWeights, ist sie auf die Anzahl von Gewichten (0..3) des Modells voreingestellt.
Edition:
A8
P
Beispiel:
// bones animation shader
#include <transform>
#include <fog>
#include <pos>
#include <normal>
#include <lights>
#include <texture>
#include <color>
float4x3 matBones[72];
int iWeights;
struct vsOut
{
float4 Pos: POSITION;
float Fog: FOG;
float4 Ambient:COLOR;
float2 Tex: TEXCOORD0;
};
vsOut bones_VS (
in float4 inPos: POSITION,
in float3 inNormal: NORMAL,
in float2 inTex: TEXCOORD0,
in int4 inBoneIndices: BLENDINDICES,
in float4 inBoneWeights: BLENDWEIGHT
)
{
vsOut Out;
Out.Tex = DoTexture(inTex);
Out.Fog = DoFog(inPos);
Out.Ambient = DoAmbient();
float3 P = DoPos(inPos);
float3 N = DoNormal(inNormal);
for (int i=0; i<iLights; i++) // Add 8 dynamic lights
Out.Ambient.xyz += DoLight(P,N,i)*0.5*vecDiffuse;
float3 WorldPos = 0;
for (int i=0; i<iWeights; i++)
WorldPos += mul(inPos.xzyw,matBones[inBoneIndices[i]])*inBoneWeights[i];
Out.Pos = DoTransform(float4(WorldPos.xzy,1.0));
return Out;
}
technique bones
{
pass { VertexShader = compile vs_2_0 bones_VS(); }
}
Siehe auch:
Shader variables, matTangent
► latest
version online