50ed674ec2
Blend shapes did not take into account octahedral compressed vertex attribute layouts and this resulted in incorrect lighting on the resulting blended mesh Now make the blend_shapes shader octahedral compression aware!
227 lines
4.4 KiB
GLSL
227 lines
4.4 KiB
GLSL
/* clang-format off */
|
|
[vertex]
|
|
|
|
/*
|
|
from VisualServer:
|
|
|
|
ARRAY_VERTEX=0,
|
|
ARRAY_NORMAL=1,
|
|
ARRAY_TANGENT=2,
|
|
ARRAY_COLOR=3,
|
|
ARRAY_TEX_UV=4,
|
|
ARRAY_TEX_UV2=5,
|
|
ARRAY_BONES=6,
|
|
ARRAY_WEIGHTS=7,
|
|
ARRAY_INDEX=8,
|
|
*/
|
|
|
|
#ifdef USE_2D_VERTEX
|
|
#define VFORMAT vec2
|
|
#else
|
|
#define VFORMAT vec3
|
|
#endif
|
|
|
|
/* INPUT ATTRIBS */
|
|
|
|
layout(location = 0) in highp VFORMAT vertex_attrib;
|
|
/* clang-format on */
|
|
#ifdef ENABLE_OCTAHEDRAL_COMPRESSION
|
|
layout(location = 2) in vec4 normal_tangent_attrib;
|
|
#else
|
|
layout(location = 1) in vec3 normal_attrib;
|
|
#endif
|
|
|
|
#ifdef ENABLE_TANGENT
|
|
#ifdef ENABLE_OCTAHEDRAL_COMPRESSION
|
|
// packed into normal_attrib zw component
|
|
#else
|
|
layout(location = 2) in vec4 tangent_attrib;
|
|
#endif
|
|
#endif
|
|
|
|
#ifdef ENABLE_COLOR
|
|
layout(location = 3) in vec4 color_attrib;
|
|
#endif
|
|
|
|
#ifdef ENABLE_UV
|
|
layout(location = 4) in vec2 uv_attrib;
|
|
#endif
|
|
|
|
#ifdef ENABLE_UV2
|
|
layout(location = 5) in vec2 uv2_attrib;
|
|
#endif
|
|
|
|
#ifdef ENABLE_SKELETON
|
|
layout(location = 6) in ivec4 bone_attrib;
|
|
layout(location = 7) in vec4 weight_attrib;
|
|
#endif
|
|
|
|
/* BLEND ATTRIBS */
|
|
|
|
#ifdef ENABLE_BLEND
|
|
|
|
layout(location = 8) in highp VFORMAT vertex_attrib_blend;
|
|
layout(location = 9) in vec3 normal_attrib_blend;
|
|
|
|
#ifdef ENABLE_TANGENT
|
|
layout(location = 10) in vec4 tangent_attrib_blend;
|
|
#endif
|
|
|
|
#ifdef ENABLE_COLOR
|
|
layout(location = 11) in vec4 color_attrib_blend;
|
|
#endif
|
|
|
|
#ifdef ENABLE_UV
|
|
layout(location = 12) in vec2 uv_attrib_blend;
|
|
#endif
|
|
|
|
#ifdef ENABLE_UV2
|
|
layout(location = 13) in vec2 uv2_attrib_blend;
|
|
#endif
|
|
|
|
#ifdef ENABLE_SKELETON
|
|
layout(location = 14) in ivec4 bone_attrib_blend;
|
|
layout(location = 15) in vec4 weight_attrib_blend;
|
|
#endif
|
|
|
|
#endif
|
|
|
|
/* OUTPUTS */
|
|
|
|
out VFORMAT vertex_out; //tfb:
|
|
|
|
#ifdef ENABLE_NORMAL
|
|
out vec3 normal_out; //tfb:ENABLE_NORMAL
|
|
#endif
|
|
|
|
#ifdef ENABLE_TANGENT
|
|
out vec4 tangent_out; //tfb:ENABLE_TANGENT
|
|
#endif
|
|
|
|
#ifdef ENABLE_COLOR
|
|
out vec4 color_out; //tfb:ENABLE_COLOR
|
|
#endif
|
|
|
|
#ifdef ENABLE_UV
|
|
out vec2 uv_out; //tfb:ENABLE_UV
|
|
#endif
|
|
|
|
#ifdef ENABLE_UV2
|
|
out vec2 uv2_out; //tfb:ENABLE_UV2
|
|
#endif
|
|
|
|
#ifdef ENABLE_SKELETON
|
|
out ivec4 bone_out; //tfb:ENABLE_SKELETON
|
|
out vec4 weight_out; //tfb:ENABLE_SKELETON
|
|
#endif
|
|
|
|
uniform float blend_amount;
|
|
|
|
#ifdef ENABLE_OCTAHEDRAL_COMPRESSION
|
|
vec3 oct_to_vec3(vec2 e) {
|
|
vec3 v = vec3(e.xy, 1.0 - abs(e.x) - abs(e.y));
|
|
float t = max(-v.z, 0.0);
|
|
v.xy += t * -sign(v.xy);
|
|
return normalize(v);
|
|
}
|
|
#endif
|
|
|
|
void main() {
|
|
#ifdef ENABLE_BLEND
|
|
|
|
vertex_out = vertex_attrib_blend + vertex_attrib * blend_amount;
|
|
|
|
#ifdef ENABLE_NORMAL
|
|
#ifdef ENABLE_OCTAHEDRAL_COMPRESSION
|
|
normal_out = normal_attrib_blend + oct_to_vec3(normal_tangent_attrib.xy) * blend_amount;
|
|
#else
|
|
normal_out = normal_attrib_blend + normal_attrib * blend_amount;
|
|
#endif
|
|
#endif
|
|
|
|
#ifdef ENABLE_TANGENT
|
|
#ifdef ENABLE_OCTAHEDRAL_COMPRESSION
|
|
tangent_out.xyz = tangent_attrib_blend.xyz + oct_to_vec3(vec2(normal_tangent_attrib.z, abs(normal_tangent_attrib.w) * 2.0 - 1.0)) * blend_amount;
|
|
tangent_out.w = sign(tangent_attrib_blend.w);
|
|
#else
|
|
tangent_out.xyz = tangent_attrib_blend.xyz + tangent_attrib.xyz * blend_amount;
|
|
tangent_out.w = tangent_attrib_blend.w; //just copy, no point in blending his
|
|
#endif
|
|
#endif
|
|
|
|
#ifdef ENABLE_COLOR
|
|
|
|
color_out = color_attrib_blend + color_attrib * blend_amount;
|
|
#endif
|
|
|
|
#ifdef ENABLE_UV
|
|
|
|
uv_out = uv_attrib_blend + uv_attrib * blend_amount;
|
|
#endif
|
|
|
|
#ifdef ENABLE_UV2
|
|
|
|
uv2_out = uv2_attrib_blend + uv2_attrib * blend_amount;
|
|
#endif
|
|
|
|
#ifdef ENABLE_SKELETON
|
|
|
|
bone_out = bone_attrib_blend;
|
|
weight_out = weight_attrib_blend + weight_attrib * blend_amount;
|
|
#endif
|
|
|
|
#else //ENABLE_BLEND
|
|
|
|
vertex_out = vertex_attrib * blend_amount;
|
|
|
|
#ifdef ENABLE_NORMAL
|
|
#ifdef ENABLE_OCTAHEDRAL_COMPRESSION
|
|
normal_out = oct_to_vec3(normal_tangent_attrib.xy) * blend_amount;
|
|
#else
|
|
normal_out = normal_attrib * blend_amount;
|
|
#endif
|
|
#endif
|
|
|
|
#ifdef ENABLE_TANGENT
|
|
#ifdef ENABLE_OCTAHEDRAL_COMPRESSION
|
|
tangent_out.xyz = oct_to_vec3(vec2(normal_tangent_attrib.z, abs(normal_tangent_attrib.w) * 2.0 - 1.0)) * blend_amount;
|
|
tangent_out.w = sign(normal_tangent_attrib.w);
|
|
#else
|
|
tangent_out.xyz = tangent_attrib.xyz * blend_amount;
|
|
tangent_out.w = tangent_attrib.w; //just copy, no point in blending his
|
|
#endif
|
|
#endif
|
|
|
|
#ifdef ENABLE_COLOR
|
|
|
|
color_out = color_attrib * blend_amount;
|
|
#endif
|
|
|
|
#ifdef ENABLE_UV
|
|
|
|
uv_out = uv_attrib * blend_amount;
|
|
#endif
|
|
|
|
#ifdef ENABLE_UV2
|
|
|
|
uv2_out = uv2_attrib * blend_amount;
|
|
#endif
|
|
|
|
#ifdef ENABLE_SKELETON
|
|
|
|
bone_out = bone_attrib;
|
|
weight_out = weight_attrib * blend_amount;
|
|
#endif
|
|
|
|
#endif
|
|
gl_Position = vec4(0.0);
|
|
}
|
|
|
|
/* clang-format off */
|
|
[fragment]
|
|
|
|
void main() {
|
|
|
|
}
|
|
/* clang-format on */
|