47 lines
1.2 KiB
GLSL
47 lines
1.2 KiB
GLSL
#version 330 core
|
|
|
|
uniform mat4 u_mvp;
|
|
|
|
layout (location = 0) in vec3 position;
|
|
layout (location = 1) in vec3 normal;
|
|
layout (location = 2) in vec2 texcoord;
|
|
layout (location = 3) in vec3 tangent;
|
|
layout (location = 4) in vec3 bitangent;
|
|
layout (location = 5) in uvec4 bone_ids; // Skinning (experimental)
|
|
layout (location = 6) in vec4 weights;
|
|
|
|
out vec3 v_position;
|
|
out vec3 v_normal;
|
|
out vec3 v_proj_normal;
|
|
out vec2 v_texcoord;
|
|
out vec3 v_tangent;
|
|
out vec3 v_bitangent;
|
|
|
|
out float v_id;
|
|
|
|
const int MAX_BONES = 96;
|
|
uniform mat4 u_bones[MAX_BONES];
|
|
uniform int u_has_bones;
|
|
|
|
void main()
|
|
{
|
|
v_position = position;
|
|
v_normal = normal;
|
|
v_proj_normal = vec4(u_mvp * vec4(normal, 1.0)).xyz;
|
|
v_texcoord = vec2(texcoord.x, -texcoord.y);
|
|
v_tangent = tangent;
|
|
v_bitangent = bitangent;
|
|
|
|
v_id = gl_VertexID;
|
|
|
|
if (u_has_bones == 1) {
|
|
mat4 bone_transform = u_bones[bone_ids[0]] * weights[0];
|
|
bone_transform += u_bones[bone_ids[1]] * weights[1];
|
|
bone_transform += u_bones[bone_ids[2]] * weights[2];
|
|
bone_transform += u_bones[bone_ids[3]] * weights[3];
|
|
gl_Position = u_mvp * (bone_transform * vec4(v_position, 1.0));
|
|
return;
|
|
}
|
|
|
|
gl_Position = u_mvp * vec4(v_position, 1.0);
|
|
}
|