Pong/resources/shaders/Phong.vert

63 lines
1.4 KiB
GLSL
Raw Normal View History

2024-07-01 19:55:24 -07:00
#version 450
#extension GL_ARB_separate_shader_objects : enable
struct Bone
{
mat4 trans;
};
layout(std140, binding = 0) uniform Transform
{
mat4 viewProj;
mat4 model;
vec3 viewPos;
} transform;
layout(std140, binding = 1) uniform Skin
{
Bone skeleton[255];
} skin;
layout(location = 0) in vec3 vPos;
layout(location = 1) in vec3 vNorm;
layout(location = 2) in vec2 vUV;
layout(location = 3) in vec3 vTan;
layout(location = 4) in vec3 vBiTan;
layout(location = 5) in uvec4 bones;
layout(location = 6) in vec4 weights;
layout(location = 0) out vec4 fVertPos;
layout(location = 1) out vec3 fTanPos;
layout(location = 2) out vec2 fUV;
layout(location = 3) out vec3 fViewPos;
layout(location = 4) out mat3 fTBN;
void main()
{
vec4 totalPos = vec4(0.0f);
for (uint i = 0; i < 4; ++i)
{
if (weights[i] == 0.0f)
continue;
totalPos += skin.skeleton[bones[i]].trans * vec4(vPos, 1.0f) * weights[i];
}
fVertPos = transform.model * totalPos;
fUV = vUV;
vec3 T = normalize(vec3(transform.model * vec4(vTan, 0.0f)));
vec3 B = normalize(vec3(transform.model * vec4(vBiTan, 0.0f)));
vec3 N = normalize(vec3(transform.model * vec4(vNorm, 0.0f)));
T = normalize(T - dot(T, N) * N);
fTBN = transpose(mat3(T, B, N));
fTanPos = fTBN * fVertPos.xyz;
fViewPos = fTBN * transform.viewPos;
gl_Position = transform.viewProj * transform.model * totalPos;
}