Browse Source

Vegetation shader and technique bugfixes (#2659)

* Vegetation shader and technique bugfixes

* GLSL bug fix for vegetation shader

* pivot fixed

* Shaders fixed

* Text formatting
gleblebedev 5 years ago
parent
commit
c4a8e9b098

+ 9 - 1
bin/CoreData/Shaders/GLSL/PBRVegetation.glsl

@@ -13,6 +13,9 @@ uniform float cWindHeightFactor;
 uniform float cWindHeightPivot;
 uniform float cWindPeriod;
 uniform vec2 cWindWorldSpacing;
+#ifdef WINDSTEMAXIS
+    uniform vec3 cWindStemAxis;
+#endif
 
 #if defined(NORMALMAP)
     varying vec4 vTexCoord;
@@ -55,7 +58,12 @@ void VS()
     mat4 modelMatrix = iModelMatrix;
     vec3 worldPos = GetWorldPos(modelMatrix);
 
-    float windStrength = max(iPos.y - cWindHeightPivot, 0.0) * cWindHeightFactor;
+    #ifdef WINDSTEMAXIS
+        float stemDistance = dot(iPos.xyz, cWindStemAxis);
+    #else
+        float stemDistance = iPos.y;
+    #endif
+    float windStrength = max(stemDistance - cWindHeightPivot, 0.0) * cWindHeightFactor;
     float windPeriod = cElapsedTime * cWindPeriod + dot(worldPos.xz, cWindWorldSpacing);
     worldPos.x += windStrength * sin(windPeriod);
     worldPos.z -= windStrength * cos(windPeriod);

+ 9 - 1
bin/CoreData/Shaders/GLSL/Vegetation.glsl

@@ -7,6 +7,9 @@ uniform float cWindHeightFactor;
 uniform float cWindHeightPivot;
 uniform float cWindPeriod;
 uniform vec2 cWindWorldSpacing;
+#ifdef WINDSTEMAXIS
+    uniform vec3 cWindStemAxis;
+#endif
 
 #ifdef NORMALMAP
     varying vec4 vTexCoord;
@@ -49,7 +52,12 @@ void VS()
     mat4 modelMatrix = iModelMatrix;
     vec3 worldPos = GetWorldPos(modelMatrix);
 
-    float windStrength = max(iPos.y - cWindHeightPivot, 0.0) * cWindHeightFactor;
+    #ifdef WINDSTEMAXIS
+        float stemDistance = dot(iPos.xyz, cWindStemAxis);
+    #else
+        float stemDistance = iPos.y;
+    #endif
+    float windStrength = max(stemDistance - cWindHeightPivot, 0.0) * cWindHeightFactor;
     float windPeriod = cElapsedTime * cWindPeriod + dot(worldPos.xz, cWindWorldSpacing);
     worldPos.x += windStrength * sin(windPeriod);
     worldPos.z -= windStrength * cos(windPeriod);

+ 9 - 1
bin/CoreData/Shaders/GLSL/VegetationDepth.glsl

@@ -5,6 +5,9 @@ uniform float cWindHeightFactor;
 uniform float cWindHeightPivot;
 uniform float cWindPeriod;
 uniform vec2 cWindWorldSpacing;
+#ifdef WINDSTEMAXIS
+    uniform vec3 cWindStemAxis;
+#endif
 
 varying vec3 vTexCoord;
 
@@ -13,7 +16,12 @@ void VS()
     mat4 modelMatrix = iModelMatrix;
     vec3 worldPos = GetWorldPos(modelMatrix);
     
-    float windStrength = max(iPos.y - cWindHeightPivot, 0.0) * cWindHeightFactor;
+    #ifdef WINDSTEMAXIS
+        float stemDistance = dot(iPos.xyz, cWindStemAxis);
+    #else
+        float stemDistance = iPos.y;
+    #endif
+    float windStrength = max(stemDistance - cWindHeightPivot, 0.0) * cWindHeightFactor;
     float windPeriod = cElapsedTime * cWindPeriod + dot(worldPos.xz, cWindWorldSpacing);
     worldPos.x += windStrength * sin(windPeriod);
     worldPos.z -= windStrength * cos(windPeriod);

+ 14 - 7
bin/CoreData/Shaders/GLSL/VegetationShadow.glsl

@@ -5,6 +5,9 @@ uniform float cWindHeightFactor;
 uniform float cWindHeightPivot;
 uniform float cWindPeriod;
 uniform vec2 cWindWorldSpacing;
+#ifdef WINDSTEMAXIS
+    uniform vec3 cWindStemAxis;
+#endif
 
 #ifdef VSM_SHADOW
     varying vec4 vTexCoord;
@@ -17,17 +20,21 @@ void VS()
     mat4 modelMatrix = iModelMatrix;
     vec3 worldPos = GetWorldPos(modelMatrix);
     
-    float windStrength = max(iPos.y - cWindHeightPivot, 0.0) * cWindHeightFactor;
+    #ifdef WINDSTEMAXIS
+        float stemDistance = dot(iPos.xyz, cWindStemAxis);
+    #else
+        float stemDistance = iPos.y;
+    #endif
+    float windStrength = max(stemDistance - cWindHeightPivot, 0.0) * cWindHeightFactor;
     float windPeriod = cElapsedTime * cWindPeriod + dot(worldPos.xz, cWindWorldSpacing);
     worldPos.x += windStrength * sin(windPeriod);
     worldPos.z -= windStrength * cos(windPeriod);
 
     gl_Position = GetClipPos(worldPos);
-    
-#ifdef VSM_SHADOW
-    vTexCoord = vec4(GetTexCoord(iTexCoord), gl_Position.z, gl_Position.w);
-#else
-    vTexCoord = GetTexCoord(iTexCoord);
-#endif
+    #ifdef VSM_SHADOW
+        vTexCoord = vec4(GetTexCoord(iTexCoord), gl_Position.z, gl_Position.w);
+    #else
+        vTexCoord = GetTexCoord(iTexCoord);
+    #endif
 }
 

+ 12 - 1
bin/CoreData/Shaders/HLSL/PBRVegetation.hlsl

@@ -15,6 +15,9 @@ uniform float cWindHeightFactor;
 uniform float cWindHeightPivot;
 uniform float cWindPeriod;
 uniform float2 cWindWorldSpacing;
+#ifdef WINDSTEMAXIS
+    uniform float3 cWindStemAxis;
+#endif
 
 #else
 
@@ -25,6 +28,9 @@ cbuffer CustomVS : register(b6)
     float cWindHeightPivot;
     float cWindPeriod;
     float2 cWindWorldSpacing;
+    #ifdef WINDSTEMAXIS
+        float3 cWindStemAxis;
+    #endif
 }
 
 #endif
@@ -99,7 +105,12 @@ void VS(float4 iPos : POSITION,
     const float4x3 modelMatrix = iModelMatrix;
     float3 worldPos = GetWorldPos(modelMatrix);
     
-    float windStrength = max(iPos.y - cWindHeightPivot, 0.0) * cWindHeightFactor;
+    #ifdef WINDSTEMAXIS
+        float stemDistance = dot(iPos, cWindStemAxis);
+    #else
+        float stemDistance = iPos.y;
+    #endif
+    float windStrength = max(stemDistance - cWindHeightPivot, 0.0) * cWindHeightFactor;
     float windPeriod = cElapsedTime * cWindPeriod + dot(worldPos.xz, cWindWorldSpacing);
     worldPos.x += windStrength * sin(windPeriod);
     worldPos.z -= windStrength * cos(windPeriod);

+ 12 - 1
bin/CoreData/Shaders/HLSL/Vegetation.hlsl

@@ -12,6 +12,9 @@ uniform float cWindHeightFactor;
 uniform float cWindHeightPivot;
 uniform float cWindPeriod;
 uniform float2 cWindWorldSpacing;
+#ifdef WINDSTEMAXIS
+    uniform float3 cWindStemAxis;
+#endif
 
 #else
 
@@ -22,6 +25,9 @@ cbuffer CustomVS : register(b6)
     float cWindHeightPivot;
     float cWindPeriod;
     float2 cWindWorldSpacing;
+    #ifdef WINDSTEMAXIS
+        float3 cWindStemAxis;
+    #endif
 }
 
 #endif
@@ -96,7 +102,12 @@ void VS(float4 iPos : POSITION,
     float4x3 modelMatrix = iModelMatrix;
     float3 worldPos = GetWorldPos(modelMatrix);
     
-    float windStrength = max(iPos.y - cWindHeightPivot, 0.0) * cWindHeightFactor;
+    #ifdef WINDSTEMAXIS
+        float stemDistance = dot(iPos, cWindStemAxis);
+    #else
+        float stemDistance = iPos.y;
+    #endif
+    float windStrength = max(stemDistance - cWindHeightPivot, 0.0) * cWindHeightFactor;
     float windPeriod = cElapsedTime * cWindPeriod + dot(worldPos.xz, cWindWorldSpacing);
     worldPos.x += windStrength * sin(windPeriod);
     worldPos.z -= windStrength * cos(windPeriod);

+ 12 - 1
bin/CoreData/Shaders/HLSL/VegetationDepth.hlsl

@@ -9,6 +9,9 @@ uniform float cWindHeightFactor;
 uniform float cWindHeightPivot;
 uniform float cWindPeriod;
 uniform float2 cWindWorldSpacing;
+#ifdef WINDSTEMAXIS
+    uniform float3 cWindStemAxis;
+#endif
 
 #else
 
@@ -19,6 +22,9 @@ cbuffer CustomVS : register(b6)
     float cWindHeightPivot;
     float cWindPeriod;
     float2 cWindWorldSpacing;
+    #ifdef WINDSTEMAXIS
+        float3 cWindStemAxis;
+    #endif
 }
 
 #endif
@@ -38,7 +44,12 @@ void VS(float4 iPos : POSITION,
     float4x3 modelMatrix = iModelMatrix;
     float3 worldPos = GetWorldPos(modelMatrix);
 
-    float windStrength = max(iPos.y - cWindHeightPivot, 0.0) * cWindHeightFactor;
+    #ifdef WINDSTEMAXIS
+        float stemDistance = dot(iPos, cWindStemAxis);
+    #else
+        float stemDistance = iPos.y;
+    #endif
+    float windStrength = max(stemDistance - cWindHeightPivot, 0.0) * cWindHeightFactor;
     float windPeriod = cElapsedTime * cWindPeriod + dot(worldPos.xz, cWindWorldSpacing);
     worldPos.x += windStrength * sin(windPeriod);
     worldPos.z -= windStrength * cos(windPeriod);

+ 12 - 1
bin/CoreData/Shaders/HLSL/VegetationShadow.hlsl

@@ -9,6 +9,9 @@ uniform float cWindHeightFactor;
 uniform float cWindHeightPivot;
 uniform float cWindPeriod;
 uniform float2 cWindWorldSpacing;
+#ifdef WINDSTEMAXIS
+    uniform float3 cWindStemAxis;
+#endif
 
 #else
 
@@ -19,6 +22,9 @@ cbuffer CustomVS : register(b6)
     float cWindHeightPivot;
     float cWindPeriod;
     float2 cWindWorldSpacing;
+    #ifdef WINDSTEMAXIS
+        float3 cWindStemAxis;
+    #endif
 }
 
 #endif
@@ -42,7 +48,12 @@ void VS(float4 iPos : POSITION,
     float4x3 modelMatrix = iModelMatrix;
     float3 worldPos = GetWorldPos(modelMatrix);
 
-    float windStrength = max(iPos.y - cWindHeightPivot, 0.0) * cWindHeightFactor;
+    #ifdef WINDSTEMAXIS
+        float stemDistance = dot(iPos, cWindStemAxis);
+    #else
+        float stemDistance = iPos.y;
+    #endif
+    float windStrength = max(stemDistance - cWindHeightPivot, 0.0) * cWindHeightFactor;
     float windPeriod = cElapsedTime * cWindPeriod + dot(worldPos.xz, cWindWorldSpacing);
     worldPos.x += windStrength * sin(windPeriod);
     worldPos.z -= windStrength * cos(windPeriod);