Browse Source

Fixed vegetation wind effect on billboards.
Added unlit vegetation technique & example material.
Added alphamasked variation to Unlit shader.
Fixed billboard textures displayed upside down. Note: this is a breaking change for old scene content that manually specifies non-default billboard UV:s.

Lasse Öörni 12 years ago
parent
commit
04c3a45d92

+ 4 - 0
Bin/CoreData/Shaders/GLSL/Unlit.frag

@@ -12,6 +12,10 @@ void main()
 {
     #ifdef DIFFMAP
         vec4 diffColor = cMatDiffColor * texture2D(sDiffMap, vTexCoord);
+        #ifdef ALPHAMASK
+            if (diffColor.a < 0.5)
+                discard;
+        #endif
     #else
         vec4 diffColor = cMatDiffColor;
     #endif

+ 1 - 0
Bin/CoreData/Shaders/GLSL/Unlit.xml

@@ -9,5 +9,6 @@
     <shader type="ps">
         <option name="Diff" define="DIFFMAP" />
         <option name="VCol" define="VERTEXCOLOR" />
+        <option name="AlphaMask" define="ALPHAMASK" require="DIFFMAP" />
     </shader>
 </shaders>

+ 2 - 1
Bin/CoreData/Shaders/GLSL/Vegetation.vert

@@ -40,8 +40,9 @@ void main()
 {
     mat4 modelMatrix = iModelMatrix;
     vec3 worldPos = GetWorldPos(modelMatrix);
+    float height = worldPos.y - cModel[3][1];
 
-    float windStrength = max(iPos.y - cWindHeightPivot, 0.0) * cWindHeightFactor;
+    float windStrength = max(height - cWindHeightPivot, 0.0) * cWindHeightFactor;
     float windPeriod = cElapsedTime * cWindPeriod + dot(worldPos.xz, cWindWorldSpacing);
     worldPos.x += windStrength * sin(windPeriod);
     worldPos.z -= windStrength * cos(windPeriod);

+ 4 - 0
Bin/CoreData/Shaders/HLSL/Unlit.hlsl

@@ -45,6 +45,10 @@ void PS(float2 iTexCoord : TEXCOORD0,
 {
     #ifdef DIFFMAP
         float4 diffColor = cMatDiffColor * tex2D(sDiffMap, iTexCoord);
+        #ifdef ALPHAMASK
+            if (diffColor.a < 0.5)
+                discard;
+        #endif
     #else
         float4 diffColor = cMatDiffColor;
     #endif

+ 1 - 0
Bin/CoreData/Shaders/HLSL/Unlit.xml

@@ -9,5 +9,6 @@
     <shader type="ps">
         <option name="Diff" define="DIFFMAP" />
         <option name="VCol" define="VERTEXCOLOR" />
+        <option name="AlphaMask" define="ALPHAMASK" require="DIFFMAP" />
     </shader>
 </shaders>

+ 2 - 1
Bin/CoreData/Shaders/HLSL/Vegetation.hlsl

@@ -60,8 +60,9 @@ void VS(float4 iPos : POSITION,
 {
     float4x3 modelMatrix = iModelMatrix;
     float3 worldPos = GetWorldPos(modelMatrix);
+    float height = worldPos.y - cModel._m31;
 
-    float windStrength = max(iPos.y - cWindHeightPivot, 0.0) * cWindHeightFactor;
+    float windStrength = max(height - cWindHeightPivot, 0.0) * cWindHeightFactor;
     float windPeriod = cElapsedTime * cWindPeriod + dot(worldPos.xz, cWindWorldSpacing);
     worldPos.x += windStrength * sin(windPeriod);
     worldPos.z -= windStrength * cos(windPeriod);

+ 5 - 0
Bin/CoreData/Techniques/VegetationDiffUnlit.xml

@@ -0,0 +1,5 @@
+<technique>
+    <pass name="base" vs="Vegetation" ps="Unlit_Diff" />
+    <pass name="depth" vs="VegetationDepth" ps="Depth" />
+    <pass name="shadow" vs="VegetationShadow" ps="Shadow" />
+</technique>

+ 5 - 0
Bin/CoreData/Techniques/VegetationDiffUnlitAlphaMask.xml

@@ -0,0 +1,5 @@
+<technique>
+    <pass name="base" vs="Vegetation" ps="Unlit_DiffAlphaMask" />
+    <pass name="depth" vs="VegetationDepth" ps="Depth" />
+    <pass name="shadow" vs="VegetationShadow" ps="Shadow" />
+</technique>

+ 9 - 0
Bin/Data/Materials/MushroomWindUnlit.xml

@@ -0,0 +1,9 @@
+<material>
+    <technique name="Techniques/VegetationDiffUnlit.xml" />
+    <texture unit="diffuse" name="Textures/Mushroom.dds" />
+    <parameter name="MatSpecColor" value="0.1 0.1 0.1 16" />
+    <parameter name="WindPeriod" value="1" />
+    <parameter name="WindHeightFactor" value="0.2" />
+    <parameter name="WindHeightPivot" value="0.2" />
+    <parameter name="WindWorldSpacing" value="0.1 0.1" />
+</material>

+ 4 - 4
Source/Engine/Graphics/BillboardSet.cpp

@@ -443,25 +443,25 @@ void BillboardSet::UpdateVertexBuffer(const FrameInfo& frame)
         
         *dest++ = billboard.position_.x_; *dest++ = billboard.position_.y_; *dest++ = billboard.position_.z_;
         *((unsigned*)dest) = color; dest++;
-        *dest++ = billboard.uv_.min_.x_; *dest++ = billboard.uv_.max_.y_;
+        *dest++ = billboard.uv_.min_.x_; *dest++ = billboard.uv_.min_.y_;
         *dest++ = -size.x_ * rotationMatrix[0][0] + size.y_ * rotationMatrix[0][1];
         *dest++ = -size.x_ * rotationMatrix[1][0] + size.y_ * rotationMatrix[1][1];
         
         *dest++ = billboard.position_.x_; *dest++ = billboard.position_.y_; *dest++ = billboard.position_.z_;
         *((unsigned*)dest) = color; dest++;
-        *dest++ = billboard.uv_.max_.x_; *dest++ = billboard.uv_.max_.y_;
+        *dest++ = billboard.uv_.max_.x_; *dest++ = billboard.uv_.min_.y_;
         *dest++ = size.x_ * rotationMatrix[0][0] + size.y_ * rotationMatrix[0][1];
         *dest++ = size.x_ * rotationMatrix[1][0] + size.y_ * rotationMatrix[1][1];
         
         *dest++ = billboard.position_.x_; *dest++ = billboard.position_.y_; *dest++ = billboard.position_.z_;
         *((unsigned*)dest) = color; dest++;
-        *dest++ = billboard.uv_.max_.x_; *dest++ = billboard.uv_.min_.y_;
+        *dest++ = billboard.uv_.max_.x_; *dest++ = billboard.uv_.max_.y_;
         *dest++ = size.x_ * rotationMatrix[0][0] - size.y_ * rotationMatrix[0][1];
         *dest++ = size.x_ * rotationMatrix[1][0] - size.y_ * rotationMatrix[1][1];
         
         *dest++ = billboard.position_.x_; *dest++ = billboard.position_.y_; *dest++ = billboard.position_.z_;
         *((unsigned*)dest) = color; dest++;
-        *dest++ = billboard.uv_.min_.x_; *dest++ = billboard.uv_.min_.y_;
+        *dest++ = billboard.uv_.min_.x_; *dest++ = billboard.uv_.max_.y_;
         *dest++ = -size.x_ * rotationMatrix[0][0] - size.y_ * rotationMatrix[0][1];
         *dest++ = -size.x_ * rotationMatrix[1][0] - size.y_ * rotationMatrix[1][1];
     }