Add initial prototype.
This commit is contained in:
116
3-mid/opengl/assets/shader/lit_textured_skinned.vert
Normal file
116
3-mid/opengl/assets/shader/lit_textured_skinned.vert
Normal file
@@ -0,0 +1,116 @@
|
||||
#version 140
|
||||
|
||||
uniform mat4 mvp_Transform;
|
||||
uniform vec3 Scale;
|
||||
uniform mat4 bone_Matrices[120];
|
||||
|
||||
|
||||
in vec3 Site;
|
||||
in vec3 Normal;
|
||||
in vec2 Coords;
|
||||
in float Shine;
|
||||
|
||||
in vec4 bone_Ids;
|
||||
in vec4 bone_Weights;
|
||||
|
||||
|
||||
out vec3 frag_Site;
|
||||
out vec3 frag_Normal;
|
||||
out vec2 frag_Coords;
|
||||
out float frag_Shine;
|
||||
|
||||
const float c_zero = 0.0;
|
||||
const float c_one = 1.0;
|
||||
|
||||
|
||||
void main()
|
||||
{
|
||||
vec4 transformedPosition = vec4 (0.0);
|
||||
vec3 transformedNormal = vec3 (0.0);
|
||||
|
||||
if (int (bone_Ids.x) == 0) // No bones affect this vertex.
|
||||
{
|
||||
transformedPosition = vec4 (Site, c_one);
|
||||
transformedNormal = Normal;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Bone 1.
|
||||
//
|
||||
mat4 m44 = bone_Matrices [int (bone_Ids.x) - 1];
|
||||
|
||||
// Transform the offset by bone 1.
|
||||
transformedPosition += m44 * vec4 (Site, c_one) * bone_Weights.x;
|
||||
|
||||
mat3 m33 = mat3 (m44[0].xyz,
|
||||
m44[1].xyz,
|
||||
m44[2].xyz);
|
||||
|
||||
// Transform the normal by bone 1.
|
||||
transformedNormal += m33 * Normal * bone_Weights.x;
|
||||
|
||||
if (int(bone_Ids.y) != 0)
|
||||
{
|
||||
// Bone 2.
|
||||
//
|
||||
m44 = bone_Matrices [int (bone_Ids.y) - 1];
|
||||
|
||||
// Transform the offset by bone 2.
|
||||
transformedPosition += m44 * vec4 (Site, c_one) * bone_Weights.y;
|
||||
|
||||
m33 = mat3 (m44[0].xyz,
|
||||
m44[1].xyz,
|
||||
m44[2].xyz);
|
||||
|
||||
// Transform the normal by bone 2.
|
||||
transformedNormal += m33 * Normal * bone_Weights.y;
|
||||
|
||||
if (int (bone_Ids.z) != 0)
|
||||
{
|
||||
// Bone 3.
|
||||
//
|
||||
m44 = bone_Matrices [int (bone_Ids.z) - 1];
|
||||
|
||||
// Transform the offset by bone 3.
|
||||
transformedPosition += m44 * vec4 (Site, c_one) * bone_Weights.z;
|
||||
|
||||
m33 = mat3 (m44[0].xyz,
|
||||
m44[1].xyz,
|
||||
m44[2].xyz);
|
||||
|
||||
// Transform the normal by bone 3.
|
||||
transformedNormal += m33 * Normal * bone_Weights.z;
|
||||
|
||||
if (int (bone_Ids.w) != 0)
|
||||
{
|
||||
// Bone 4.
|
||||
//
|
||||
m44 = bone_Matrices [int (bone_Ids.w) - 1];
|
||||
|
||||
// Transform the offset by bone 4.
|
||||
transformedPosition += m44 * vec4 (Site, c_one) * bone_Weights.w;
|
||||
|
||||
m33 = mat3 (m44[0].xyz,
|
||||
m44[1].xyz,
|
||||
m44[2].xyz);
|
||||
|
||||
// Transform the normal by bone 4.
|
||||
transformedNormal += m33 * Normal * bone_Weights.w;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Pass some variables to the fragment shader.
|
||||
//
|
||||
frag_Site = transformedPosition.xyz * Scale;
|
||||
frag_Normal = normalize (transformedNormal);
|
||||
frag_Coords = Coords;
|
||||
frag_Shine = Shine;
|
||||
|
||||
// Apply all matrix transformations to 'Site'.
|
||||
//
|
||||
gl_Position = mvp_Transform * transformedPosition;
|
||||
gl_Position = mvp_Transform * (transformedPosition * vec4 (Scale, 1));
|
||||
}
|
||||
Reference in New Issue
Block a user