From 863646a9e1695c85119eda068196264a9f3e0038 Mon Sep 17 00:00:00 2001 From: Ryan McDonough Date: Thu, 6 Feb 2025 08:22:05 -0500 Subject: [PATCH] Fix Rendering Issue in PBRTerrain This PR attempts to fix a rendering bug that a few jme have experienced on certain devices, as discussed in this thread: https://hub.jmonkeyengine.org/t/requesting-help-troubleshooting-pbrterrain-bug/47895 I believe the issue was due to a combination of things that were wrong with the process of reading normal maps, calculating tangents, and then blending them. The order of these operations is important, and I believe it is also important to normalize the normal value prior to blending each layer, which I previously was not doing. There's also some code that puts a normal map in the proper range, and this was being done improperly for tri-planar normal mapping. Once this PR is done I'll post back to that thread and request testing from the users who were experiencing the bug on their device. --- .../Common/ShaderLib/TriPlanarUtils.glsllib | 48 ++++++++++++++++--- 1 file changed, 41 insertions(+), 7 deletions(-) diff --git a/jme3-core/src/main/resources/Common/ShaderLib/TriPlanarUtils.glsllib b/jme3-core/src/main/resources/Common/ShaderLib/TriPlanarUtils.glsllib index 2b00eb7be3..7b79a4181b 100644 --- a/jme3-core/src/main/resources/Common/ShaderLib/TriPlanarUtils.glsllib +++ b/jme3-core/src/main/resources/Common/ShaderLib/TriPlanarUtils.glsllib @@ -1,8 +1,8 @@ #ifndef __TRIPLANAR_UTILS_MODULE__ #define __TRIPLANAR_UTILS_MODULE__ - vec3 triBlending; - + vec3 triBlending; + void TriPlanarUtils_calculateBlending(vec3 geometryNormal){ triBlending = abs( geometryNormal ); triBlending = (triBlending -0.2) * 0.7; @@ -11,7 +11,8 @@ triBlending /= vec3(b, b, b); } - vec4 getTriPlanarBlend(in vec4 coords, in sampler2D map, in float scale) { + // basic triplanar blend: + vec4 getTriPlanarBlend(in vec3 coords, in sampler2D map, in float scale) { vec4 col1 = texture2D( map, coords.yz * scale); vec4 col2 = texture2D( map, coords.xz * scale); vec4 col3 = texture2D( map, coords.xy * scale); @@ -21,7 +22,8 @@ return tex; } - vec4 getTriPlanarBlendFromTexArray(in vec4 coords, in int idInTexArray, in float scale, in sampler2DArray texArray) { + // basic triplanar blend for TextureArrays: + vec4 getTriPlanarBlendFromTexArray(in vec3 coords, in int idInTexArray, in float scale, in sampler2DArray texArray) { vec4 col1 = texture2DArray( texArray, vec3((coords.yz * scale), idInTexArray ) ); vec4 col2 = texture2DArray( texArray, vec3((coords.xz * scale), idInTexArray ) ); vec4 col3 = texture2DArray( texArray, vec3((coords.xy * scale), idInTexArray ) ); @@ -29,6 +31,38 @@ vec4 tex = col1 * triBlending.x + col2 * triBlending.y + col3 * triBlending.z; return tex; - } - -#endif \ No newline at end of file + } + + // triplanar blend for Normal maps: + vec4 getTriPlanarNormalBlend(in vec3 coords, in sampler2D map, in float scale) { + vec4 col1 = texture2D( map, coords.yz * scale); + vec4 col2 = texture2D( map, coords.xz * scale); + vec4 col3 = texture2D( map, coords.xy * scale); + + col1.xyz = col1.xyz * vec3(2.0) - vec3(1.0); + col2.xyz = col2.xyz * vec3(2.0) - vec3(1.0); + col3.xyz = col3.xyz * vec3(2.0) - vec3(1.0); + + // blend the results of the 3 planar projections. + vec4 tex = normalize(col1 * triBlending.x + col2 * triBlending.y + col3 * triBlending.z); + + return tex; + } + + // triplanar blend for Normal maps in a TextureArray: + vec4 getTriPlanarNormalBlendFromTexArray(in vec3 coords, in int idInTexArray, in float scale, in sampler2DArray texArray) { + vec4 col1 = texture2DArray( texArray, vec3((coords.yz * scale), idInTexArray ) ); + vec4 col2 = texture2DArray( texArray, vec3((coords.xz * scale), idInTexArray ) ); + vec4 col3 = texture2DArray( texArray, vec3((coords.xy * scale), idInTexArray ) ); + + col1.xyz = col1.xyz * vec3(2.0) - vec3(1.0); + col2.xyz = col2.xyz * vec3(2.0) - vec3(1.0); + col3.xyz = col3.xyz * vec3(2.0) - vec3(1.0); + + // blend the results of the 3 planar projections. + vec4 tex = normalize(col1 * triBlending.x + col2 * triBlending.y + col3 * triBlending.z); + + return tex; + } + +#endif