diff --git a/jme3-core/src/main/resources/Common/MatDefs/Light/PBRLighting.vert b/jme3-core/src/main/resources/Common/MatDefs/Light/PBRLighting.vert index 5e574fa8fc..23427c0795 100644 --- a/jme3-core/src/main/resources/Common/MatDefs/Light/PBRLighting.vert +++ b/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 diff --git a/jme3-core/src/main/resources/Common/ShaderLib/TangentUtils.glsllib b/jme3-core/src/main/resources/Common/ShaderLib/TangentUtils.glsllib index 6b3be2fb40..b07c9c197c 100644 --- a/jme3-core/src/main/resources/Common/ShaderLib/TangentUtils.glsllib +++ b/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 \ No newline at end of file +#endif 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 diff --git a/jme3-core/src/main/resources/Common/ShaderLib/module/pbrlighting/PBRLightingUtils.glsllib b/jme3-core/src/main/resources/Common/ShaderLib/module/pbrlighting/PBRLightingUtils.glsllib index d943e8df67..f5136cbe74 100644 --- a/jme3-core/src/main/resources/Common/ShaderLib/module/pbrlighting/PBRLightingUtils.glsllib +++ b/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 diff --git a/jme3-terrain/src/main/resources/Common/MatDefs/Terrain/PBRTerrain.vert b/jme3-terrain/src/main/resources/Common/MatDefs/Terrain/PBRTerrain.vert index 0763ff5fec..8096ca9724 100644 --- a/jme3-terrain/src/main/resources/Common/MatDefs/Terrain/PBRTerrain.vert +++ b/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);