38 lines
887 B
GLSL
38 lines
887 B
GLSL
|
#version 450
|
||
|
|
||
|
#extension GL_EXT_scalar_block_layout : enable
|
||
|
|
||
|
#define MAX_WEIGHTS 3
|
||
|
#define MAX_BONES 50
|
||
|
|
||
|
layout(binding = 0) uniform Transform
|
||
|
{
|
||
|
mat4 viewProj;
|
||
|
mat4 model;
|
||
|
mat4 bones[MAX_BONES];
|
||
|
} transform;
|
||
|
|
||
|
layout(location = 0) in vec3 vNorm;
|
||
|
layout(location = 1) in vec3 vPos;
|
||
|
layout(location = 2) in uvec3 vBoneIndices;
|
||
|
layout(location = 3) in vec3 vWeights;
|
||
|
|
||
|
layout(location = 0) out vec3 fNorm;
|
||
|
layout(location = 1) out vec4 fWorldPos;
|
||
|
|
||
|
void main()
|
||
|
{
|
||
|
vec4 totalLocalPos = vec4(0.0f);
|
||
|
vec4 totalNormal = vec4(0.0f);
|
||
|
|
||
|
for (int i = 0; i < MAX_WEIGHTS; ++i)
|
||
|
{
|
||
|
totalLocalPos += transform.bones[vBoneIndices[i]] * vec4(vPos, 1.0f) * vWeights[i];
|
||
|
totalNormal += transform.bones[vBoneIndices[i]] * vec4(vNorm, 0.0f) * vWeights[i];
|
||
|
}
|
||
|
|
||
|
fNorm = (transform.model * totalNormal).xyz;
|
||
|
fWorldPos = transform.model * totalLocalPos;
|
||
|
|
||
|
gl_Position = transform.viewProj * fWorldPos;
|
||
|
}
|