From 3bd1afedbd72b861a4352011e76270af4b07e8fd Mon Sep 17 00:00:00 2001 From: Pixelflinger Date: Fri, 1 May 2020 13:29:43 -0700 Subject: [PATCH] compute bitangeant in fragment shader This saves 4 varying components. Fixes #2092 --- shaders/src/inputs.fs | 3 +-- shaders/src/inputs.vs | 3 +-- shaders/src/main.vs | 12 ++++-------- shaders/src/shading_parameters.fs | 4 ++-- 4 files changed, 8 insertions(+), 14 deletions(-) diff --git a/shaders/src/inputs.fs b/shaders/src/inputs.fs index 38b335c6a0..64b3ef6d61 100644 --- a/shaders/src/inputs.fs +++ b/shaders/src/inputs.fs @@ -9,8 +9,7 @@ LAYOUT_LOCATION(4) in highp vec3 vertex_worldPosition; #if defined(HAS_ATTRIBUTE_TANGENTS) LAYOUT_LOCATION(5) SHADING_INTERPOLATION in mediump vec3 vertex_worldNormal; #if defined(MATERIAL_NEEDS_TBN) -LAYOUT_LOCATION(6) SHADING_INTERPOLATION in mediump vec3 vertex_worldTangent; -LAYOUT_LOCATION(7) SHADING_INTERPOLATION in mediump vec3 vertex_worldBitangent; +LAYOUT_LOCATION(6) SHADING_INTERPOLATION in mediump vec4 vertex_worldTangent; #endif #endif diff --git a/shaders/src/inputs.vs b/shaders/src/inputs.vs index 1d84275aea..242e9a4f63 100644 --- a/shaders/src/inputs.vs +++ b/shaders/src/inputs.vs @@ -60,8 +60,7 @@ LAYOUT_LOCATION(4) out highp vec3 vertex_worldPosition; #if defined(HAS_ATTRIBUTE_TANGENTS) LAYOUT_LOCATION(5) SHADING_INTERPOLATION out mediump vec3 vertex_worldNormal; #if defined(MATERIAL_NEEDS_TBN) -LAYOUT_LOCATION(6) SHADING_INTERPOLATION out mediump vec3 vertex_worldTangent; -LAYOUT_LOCATION(7) SHADING_INTERPOLATION out mediump vec3 vertex_worldBitangent; +LAYOUT_LOCATION(6) SHADING_INTERPOLATION out mediump vec4 vertex_worldTangent; #endif #endif diff --git a/shaders/src/main.vs b/shaders/src/main.vs index 0c3911a4a5..9eaf62edff 100644 --- a/shaders/src/main.vs +++ b/shaders/src/main.vs @@ -9,7 +9,7 @@ void main() { #if defined(MATERIAL_NEEDS_TBN) // Extract the normal and tangent in world space from the input quaternion // We encode the orthonormal basis as a quaternion to save space in the attributes - toTangentFrame(mesh_tangents, material.worldNormal, vertex_worldTangent); + toTangentFrame(mesh_tangents, material.worldNormal, vertex_worldTangent.xyz); #if defined(HAS_SKINNING_OR_MORPHING) if (objectUniforms.morphingEnabled == 1) { @@ -27,7 +27,7 @@ void main() { if (objectUniforms.skinningEnabled == 1) { skinNormal(material.worldNormal, mesh_bone_indices, mesh_bone_weights); - skinNormal(vertex_worldTangent, mesh_bone_indices, mesh_bone_weights); + skinNormal(vertex_worldTangent.xyz, mesh_bone_indices, mesh_bone_weights); } #endif @@ -35,13 +35,9 @@ void main() { // because we ensure the worldFromModelNormalMatrix pre-scales the normal such that // all its components are < 1.0. This precents the bitangent to exceed the range of fp16 // in the fragment shader, where we renormalize after interpolation - vertex_worldTangent = objectUniforms.worldFromModelNormalMatrix * vertex_worldTangent; + vertex_worldTangent.xyz = objectUniforms.worldFromModelNormalMatrix * vertex_worldTangent.xyz; + vertex_worldTangent.w = mesh_tangents.w; material.worldNormal = objectUniforms.worldFromModelNormalMatrix * material.worldNormal; - - // Reconstruct the bitangent from the normal and tangent. We don't bother with - // normalization here since we'll do it after interpolation in the fragment stage - vertex_worldBitangent = - cross(material.worldNormal, vertex_worldTangent) * sign(mesh_tangents.w); #else // MATERIAL_NEEDS_TBN // Without anisotropy or normal mapping we only need the normal vector toTangentFrame(mesh_tangents, material.worldNormal); diff --git a/shaders/src/shading_parameters.fs b/shaders/src/shading_parameters.fs index efff4e0fab..9e8f21289a 100644 --- a/shaders/src/shading_parameters.fs +++ b/shaders/src/shading_parameters.fs @@ -10,8 +10,8 @@ void computeShadingParams() { #if defined(HAS_ATTRIBUTE_TANGENTS) highp vec3 n = vertex_worldNormal; #if defined(MATERIAL_NEEDS_TBN) - highp vec3 t = vertex_worldTangent; - highp vec3 b = vertex_worldBitangent; + highp vec3 t = vertex_worldTangent.xyz; + highp vec3 b = cross(n, t) * sign(vertex_worldTangent.w); #endif #if defined(MATERIAL_HAS_DOUBLE_SIDED_CAPABILITY)