Merge pull request #56161 from The-O-King/blend_shapes_octahedral

This commit is contained in:
Rémi Verschelde 2022-01-04 14:09:49 +01:00 committed by GitHub
commit cc6e0e7fb3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 38 additions and 2 deletions

View File

@ -1268,6 +1268,8 @@ void RasterizerSceneGLES3::_setup_geometry(RenderList::Element *e, const Transfo
if (s->blend_shapes.size() && e->instance->blend_values.size()) { if (s->blend_shapes.size() && e->instance->blend_values.size()) {
//blend shapes, use transform feedback //blend shapes, use transform feedback
storage->mesh_render_blend_shapes(s, e->instance->blend_values.read().ptr()); storage->mesh_render_blend_shapes(s, e->instance->blend_values.read().ptr());
//disable octahedral compression as the result of blend shapes is always uncompressed cartesian coordinates
state.scene_shader.set_conditional(SceneShaderGLES3::ENABLE_OCTAHEDRAL_COMPRESSION, false);
//rebind shader //rebind shader
state.scene_shader.bind(); state.scene_shader.bind();
#ifdef DEBUG_ENABLED #ifdef DEBUG_ENABLED

View File

@ -4300,6 +4300,7 @@ void RasterizerStorageGLES3::mesh_render_blend_shapes(Surface *s, const float *p
shaders.blend_shapes.set_conditional(BlendShapeShaderGLES3::ENABLE_BLEND, false); //first pass does not blend shaders.blend_shapes.set_conditional(BlendShapeShaderGLES3::ENABLE_BLEND, false); //first pass does not blend
shaders.blend_shapes.set_conditional(BlendShapeShaderGLES3::USE_2D_VERTEX, s->format & VS::ARRAY_FLAG_USE_2D_VERTICES); //use 2D vertices if needed shaders.blend_shapes.set_conditional(BlendShapeShaderGLES3::USE_2D_VERTEX, s->format & VS::ARRAY_FLAG_USE_2D_VERTICES); //use 2D vertices if needed
shaders.blend_shapes.set_conditional(BlendShapeShaderGLES3::ENABLE_OCTAHEDRAL_COMPRESSION, s->format & VS::ARRAY_FLAG_USE_OCTAHEDRAL_COMPRESSION); //use octahedral normal compression
shaders.blend_shapes.bind(); shaders.blend_shapes.bind();

View File

@ -25,11 +25,19 @@ ARRAY_INDEX=8,
layout(location = 0) in highp VFORMAT vertex_attrib; layout(location = 0) in highp VFORMAT vertex_attrib;
/* clang-format on */ /* clang-format on */
#ifdef ENABLE_OCTAHEDRAL_COMPRESSION
layout(location = 2) in vec4 normal_tangent_attrib;
#else
layout(location = 1) in vec3 normal_attrib; layout(location = 1) in vec3 normal_attrib;
#endif
#ifdef ENABLE_TANGENT #ifdef ENABLE_TANGENT
#ifdef ENABLE_OCTAHEDRAL_COMPRESSION
// packed into normal_attrib zw component
#else
layout(location = 2) in vec4 tangent_attrib; layout(location = 2) in vec4 tangent_attrib;
#endif #endif
#endif
#ifdef ENABLE_COLOR #ifdef ENABLE_COLOR
layout(location = 3) in vec4 color_attrib; layout(location = 3) in vec4 color_attrib;
@ -109,20 +117,37 @@ out vec4 weight_out; //tfb:ENABLE_SKELETON
uniform float blend_amount; 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() { void main() {
#ifdef ENABLE_BLEND #ifdef ENABLE_BLEND
vertex_out = vertex_attrib_blend + vertex_attrib * blend_amount; vertex_out = vertex_attrib_blend + vertex_attrib * blend_amount;
#ifdef ENABLE_NORMAL #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; normal_out = normal_attrib_blend + normal_attrib * blend_amount;
#endif #endif
#endif
#ifdef ENABLE_TANGENT #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.xyz = tangent_attrib_blend.xyz + tangent_attrib.xyz * blend_amount;
tangent_out.w = tangent_attrib_blend.w; //just copy, no point in blending his tangent_out.w = tangent_attrib_blend.w; //just copy, no point in blending his
#endif #endif
#endif
#ifdef ENABLE_COLOR #ifdef ENABLE_COLOR
@ -150,14 +175,22 @@ void main() {
vertex_out = vertex_attrib * blend_amount; vertex_out = vertex_attrib * blend_amount;
#ifdef ENABLE_NORMAL #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; normal_out = normal_attrib * blend_amount;
#endif #endif
#endif
#ifdef ENABLE_TANGENT #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.xyz = tangent_attrib.xyz * blend_amount;
tangent_out.w = tangent_attrib.w; //just copy, no point in blending his tangent_out.w = tangent_attrib.w; //just copy, no point in blending his
#endif #endif
#endif
#ifdef ENABLE_COLOR #ifdef ENABLE_COLOR