RuntimeData/shader/primitive.vert
2020-05-22 19:59:34 +08:00

130 lines
2.2 KiB
GLSL

#include <animation.glsl>
in vec3 a_Position;
out vec3 v_Position;
#ifdef HAS_NORMALS
in vec3 a_Normal;
#endif
#ifdef HAS_TANGENTS
in vec4 a_Tangent;
#endif
#ifdef HAS_NORMALS
#ifdef HAS_TANGENTS
out mat3 v_TBN;
#else
out vec3 v_Normal;
#endif
#endif
#ifdef HAS_UV_SET1
in vec2 a_UV1;
#endif
#ifdef HAS_UV_SET2
in vec2 a_UV2;
#endif
out vec2 v_UVCoord1;
out vec2 v_UVCoord2;
#ifdef HAS_VERTEX_COLOR_VEC3
in vec3 a_Color;
out vec3 v_Color;
#endif
#ifdef HAS_VERTEX_COLOR_VEC4
in vec4 a_Color;
out vec4 v_Color;
#endif
uniform mat4 u_ViewProjectionMatrix;
uniform mat4 u_ModelMatrix;
uniform mat4 u_NormalMatrix;
vec4 getPosition()
{
vec4 pos = vec4(a_Position, 1.0);
#ifdef USE_MORPHING
pos += getTargetPosition();
#endif
#ifdef USE_SKINNING
pos = getSkinningMatrix() * pos;
#endif
return pos;
}
#ifdef HAS_NORMALS
vec3 getNormal()
{
vec3 normal = a_Normal;
#ifdef USE_MORPHING
normal += getTargetNormal();
#endif
#ifdef USE_SKINNING
normal = mat3(getSkinningNormalMatrix()) * normal;
#endif
return normalize(normal);
}
#endif
#ifdef HAS_TANGENTS
vec3 getTangent()
{
vec3 tangent = a_Tangent.xyz;
#ifdef USE_MORPHING
tangent += getTargetTangent();
#endif
#ifdef USE_SKINNING
tangent = mat3(getSkinningMatrix()) * tangent;
#endif
return normalize(tangent);
}
#endif
void main()
{
vec4 pos = u_ModelMatrix * getPosition();
v_Position = vec3(pos.xyz) / pos.w;
#ifdef HAS_NORMALS
#ifdef HAS_TANGENTS
vec3 tangent = getTangent();
vec3 normalW = normalize(vec3(u_NormalMatrix * vec4(getNormal(), 0.0)));
vec3 tangentW = normalize(vec3(u_ModelMatrix * vec4(tangent, 0.0)));
vec3 bitangentW = cross(normalW, tangentW) * a_Tangent.w;
v_TBN = mat3(tangentW, bitangentW, normalW);
#else // !HAS_TANGENTS
v_Normal = normalize(vec3(u_NormalMatrix * vec4(getNormal(), 0.0)));
#endif
#endif // !HAS_NORMALS
v_UVCoord1 = vec2(0.0, 0.0);
v_UVCoord2 = vec2(0.0, 0.0);
#ifdef HAS_UV_SET1
v_UVCoord1 = a_UV1;
#endif
#ifdef HAS_UV_SET2
v_UVCoord2 = a_UV2;
#endif
#if defined(HAS_VERTEX_COLOR_VEC3) || defined(HAS_VERTEX_COLOR_VEC4)
v_Color = a_Color;
#endif
gl_Position = u_ViewProjectionMatrix * pos;
}