KP3Dii/Data/resources/shaders/.kp3d/map_v.glsl
2024-08-14 00:37:23 -05:00

48 lines
1.2 KiB
GLSL

#version 330 core
uniform mat4 u_mvp;
uniform mat4 u_mv;
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_proj_normal = vec4(u_mv * vec4(normal, 1.0)).xyz;
v_normal = normal;
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);
}