浏览代码

Merge pull request #2365 from jMonkeyEngine/yaRnMcDonuts-patch-7

Fix Rendering Issue in PBRTerrain
Ryan McDonough 7 月之前
父节点
当前提交
98c0f9d20a

+ 2 - 2
jme3-core/src/main/resources/Common/MatDefs/Light/PBRLighting.vert

@@ -30,7 +30,7 @@ attribute vec3 inNormal;
 varying vec3 wNormal;
 varying vec3 wPosition;
 
-varying vec4 lPosition;
+varying vec3 lPosition;
 
 attribute vec4 inTangent;
 varying vec4 wTangent;
@@ -46,7 +46,7 @@ void main(){
     vec3 modelSpaceNorm = inNormal;
     vec3 modelSpaceTan  = inTangent.xyz;
     
-    lPosition = modelSpacePos;
+    lPosition = modelSpacePos.xyz;
     
     
     #ifdef USE_VERTEX_COLORS_AS_SUN_INTENSITY

+ 7 - 15
jme3-core/src/main/resources/Common/ShaderLib/TangentUtils.glsllib

@@ -1,21 +1,13 @@
 #ifndef __TANGENT_UTILS_MODULE__
     #define __TANGENT_UTILS_MODULE__
 
-    //used for calculating tangents in-shader
-   
-
-    //primarily used for terrains, since jme terrains do not store pre-calculated tangents by default (thus the tbnMat cannot be used for PBR light calculation like it is in jme's stock PBR shader)
-    vec3 calculateTangentsAndApplyToNormals(in vec3 normalIn, in vec3 worldNorm){
-        vec3 returnNorm = normalize((normalIn.xyz * vec3(2.0) - vec3(1.0)));
-
+    //used for calculating tangents in-shader for axis-aligned quads/planes/terrains   
+    //primarily used for PBR terrains, since jme terrains do not store pre-calculated tangents by default (thus the tbnMat cannot be used for PBR light calculation like it is in jme's stock PBR shader)
+    vec3 calculateTangentsAndApplyToNormals(in vec3 normalIn, in vec3 worldNorm){        
         vec3 baseNorm = worldNorm.rgb + vec3(0, 0, 1);
-        returnNorm *= vec3(-1, -1, 1);
-        returnNorm = baseNorm.rgb*dot(baseNorm.rgb, returnNorm.rgb)/baseNorm.z - returnNorm.rgb;
-
-        returnNorm = normalize(returnNorm);
+        normalIn = baseNorm.rgb*dot(baseNorm.rgb, normalIn.rgb)/baseNorm.z - normalIn.rgb;
+        normalIn = normalize(normalIn);
 
-
-        return returnNorm;
+        return normalIn;
     }
-
-#endif
+#endif

+ 41 - 7
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
+    }    
+     
+    //  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

+ 1 - 1
jme3-core/src/main/resources/Common/ShaderLib/module/pbrlighting/PBRLightingUtils.glsllib

@@ -41,7 +41,7 @@
     #endif
     
     #if defined(ENABLE_PBRLightingUtils_getLocalPosition)
-        varying vec4 lPosition;
+        varying vec3 lPosition;
     #endif 
 
 

+ 2 - 5
jme3-terrain/src/main/resources/Common/MatDefs/Terrain/PBRTerrain.vert

@@ -8,7 +8,7 @@ attribute vec2 inTexCoord;
 varying vec2 texCoord;
 varying vec3 wPosition;
 varying vec3 wNormal;
-
+varying vec3 lPosition;
 
 uniform vec4 g_AmbientLightColor;
 
@@ -17,9 +17,6 @@ uniform vec4 g_AmbientLightColor;
     uniform vec3 g_CameraPosition;
 #endif
 
-
-varying vec4 lPosition;
-
 void main(){
     vec4 modelSpacePos = vec4(inPosition, 1.0);
 
@@ -31,7 +28,7 @@ void main(){
     
     wNormal  = normalize(TransformWorldNormal(inNormal));
     
-    lPosition = vec4(inPosition, 0.0);       
+    lPosition = modelSpacePos.xyz;     
     
     #ifdef USE_FOG
         fogDistance = distance(g_CameraPosition, (g_WorldMatrix * modelSpacePos).xyz);