Pārlūkot izejas kodu

Added vertex color techniques for deferred & light prepass rendering.

Lasse Öörni 14 gadi atpakaļ
vecāks
revīzija
20cfc26070

+ 9 - 0
Bin/CoreData/Techniques/DiffVCol.xml

@@ -0,0 +1,9 @@
+<technique>
+    <pass name="deferred" vs="Deferred/GBuffer_VCol" ps="Deferred/GBuffer_DiffVCol" />
+    <pass name="prepass" vs="Prepass/GBuffer" ps="Prepass/GBuffer" />
+    <pass name="material" vs="Prepass/Material_VCol" ps="Prepass/Material_DiffVCol" depthwrite="false" depthtest="equal" />
+    <pass name="base" vs="Forward_VCol" ps="Forward_DiffVColAmbient" />
+    <pass name="litbase" vs="Forward_VCol" ps="Forward_DiffVColAmbient" />
+    <pass name="light" vs="Forward_VCol" ps="Forward_DiffVCol" depthwrite="false" depthtest="equal" blend="add" />
+    <pass name="shadow" vs="Shadow" ps="Shadow" />
+</technique>

+ 9 - 0
Bin/CoreData/Techniques/NoTextureVCol.xml

@@ -0,0 +1,9 @@
+<technique>
+    <pass name="deferred" vs="Deferred/GBuffer_VCol" ps="Deferred/GBuffer_VCol" />
+    <pass name="prepass" vs="Prepass/GBuffer" ps="Prepass/GBuffer" />
+    <pass name="material" vs="Prepass/Material_VCol" ps="Prepass/Material_VCol" depthwrite="false" depthtest="equal" />
+    <pass name="base" vs="Forward_VCol" ps="Forward_VColAmbient" />
+    <pass name="litbase" vs="Forward_VCol" ps="Forward_VColAmbient" />
+    <pass name="light" vs="Forward_VCol" ps="Forward_VCol" depthwrite="false" depthtest="equal" blend="add" />
+    <pass name="shadow" vs="Shadow" ps="Shadow" />
+</technique>

+ 1 - 1
Engine/Graphics/Renderer.h

@@ -48,7 +48,7 @@ class Zone;
 
 static const int SHADOW_MIN_PIXELS = 64;
 static const int NUM_SHADOWMAP_RESOLUTIONS = 3;
-static const int MIN_INSTANCES = 2;
+static const int MIN_INSTANCES = 3;
 static const int INSTANCING_BUFFER_DEFAULT_SIZE = 1024;
 
 /// Light vertex shader variations

+ 18 - 3
SourceAssets/Shaders/Deferred/GBuffer.hlsl

@@ -22,6 +22,10 @@ void VS(float4 iPos : POSITION,
     #else
         out float3 oNormal : TEXCOORD2,
     #endif
+    #ifdef VERTEXCOLOR
+        float4 iColor : COLOR0,
+        out float4 oColor : COLOR0,
+    #endif
     out float4 oPos : POSITION)
 {
     #if (!defined(SKINNED)) && (!defined(INSTANCED))
@@ -46,12 +50,16 @@ void VS(float4 iPos : POSITION,
         #endif
     #endif
 
-    oTexCoord = GetTexCoord(iTexCoord);
-    oDepth = GetDepth(oPos);
-    
     #ifdef NORMALMAP
         oBitangent = cross(oTangent, oNormal) * iTangent.w;
     #endif
+
+    #ifdef VERTEXCOLOR
+        oColor = iColor;
+    #endif
+    
+    oTexCoord = GetTexCoord(iTexCoord);
+    oDepth = GetDepth(oPos);
 }
 
 void PS(
@@ -64,6 +72,9 @@ void PS(
     #else
         float3 iNormal : TEXCOORD2,
     #endif
+    #ifdef VERTEXCOLOR
+        float4 iColor : COLOR0,
+    #endif
     out float4 oDiff : COLOR0,
     out float4 oNormal : COLOR1,
     out float4 oDepth : COLOR2)
@@ -79,6 +90,10 @@ void PS(
         float3 diffColor = cMatDiffColor.rgb;
     #endif
 
+    #ifdef VERTEXCOLOR
+        diffColor *= iColor.rgb;
+    #endif
+    
     #ifdef NORMALMAP
         float3x3 tbn = float3x3(iTangent, iBitangent, iNormal);
         float3 normal = normalize(mul(UnpackNormal(tex2D(sNormalMap, iTexCoord)), tbn));

+ 2 - 0
SourceAssets/Shaders/Deferred/GBuffer.xml

@@ -1,6 +1,7 @@
 <shaders>
     <shader name="GBuffer" type="vs">
         <option name="Normal" define="NORMALMAP" />
+        <option name="VCol" define="VERTEXCOLOR" />
         <variation name="" />
         <variation name="Skinned" define="SKINNED" />
         <variation name="Instanced" define="INSTANCED" />
@@ -9,6 +10,7 @@
         <option name="Diff" define="DIFFMAP" />
         <option name="Normal" define="NORMALMAP" />
         <option name="Spec" define="SPECMAP" />
+        <option name="VCol" define="VERTEXCOLOR" />        
         <option name="Mask" define="ALPHAMASK" include="Diff" />
     </shader>
 </shaders>

+ 0 - 1
SourceAssets/Shaders/Forward.hlsl

@@ -119,7 +119,6 @@ void PS(float2 iTexCoord : TEXCOORD0,
         diffColor *= iColor;
     #endif
 
-
     #if (!defined(VOLUMETRIC)) && ((defined(DIRLIGHT)) || (defined(POINTLIGHT)) || (defined(SPOTLIGHT)))
 
         float3 lightColor;

+ 16 - 1
SourceAssets/Shaders/Prepass/Material.hlsl

@@ -8,6 +8,10 @@ void VS(float4 iPos : POSITION,
     #ifdef INSTANCED
         float4x3 iModelInstance : TEXCOORD2,
     #endif
+    #ifdef VERTEXCOLOR
+        float4 iColor : COLOR0,
+        out float4 oColor : COLOR0,
+    #endif
     float2 iTexCoord : TEXCOORD0,
     out float2 oTexCoord : TEXCOORD0,
     out float4 oWorldPos : TEXCOORD1,
@@ -25,6 +29,10 @@ void VS(float4 iPos : POSITION,
         pos = GetPositionInstanced(iPos, iModelInstance, oPos);
     #endif
 
+    #ifdef VERTEXCOLOR
+        oColor = iColor;
+    #endif
+
     // Store world-oriented view position in case it is needed
     oWorldPos = float4(pos.xyz - cCameraPos, GetDepth(oPos));
     oScreenPos = GetScreenPos(oPos);
@@ -34,19 +42,26 @@ void VS(float4 iPos : POSITION,
 void PS(float2 iTexCoord : TEXCOORD0,
     float4 iWorldPos : TEXCOORD1,
     float4 iScreenPos : TEXCOORD2,
+    #ifdef VERTEXCOLOR
+        float4 iColor : COLOR0,
+    #endif
     out float4 oColor : COLOR0)
 {
     #ifdef DIFFMAP
         float4 diffInput = tex2D(sDiffMap, iTexCoord);
-        float3 diffColor = cMatDiffColor.rgb * diffInput.rgb;
         #ifdef ALPHAMASK
             if (diffInput.a < 0.5)
                 discard;
         #endif
+        float3 diffColor = cMatDiffColor.rgb * diffInput.rgb;
     #else
         float3 diffColor = cMatDiffColor.rgb;
     #endif
 
+    #ifdef VERTEXCOLOR
+        diffColor *= iColor.rgb;
+    #endif
+
     #ifdef SPECMAP
         float specStrength = cMatSpecProperties.x * tex2D(sSpecMap, iTexCoord).g;
     #else

+ 2 - 0
SourceAssets/Shaders/Prepass/Material.xml

@@ -1,5 +1,6 @@
 <shaders>
     <shader name="Material" type="vs">
+        <option name="VCol" define="VERTEXCOLOR" />
         <variation name="" />
         <variation name="Skinned" define="SKINNED" />
         <variation name="Instanced" define="INSTANCED" />
@@ -7,6 +8,7 @@
     <shader name="Material" type="ps">
         <option name="Diff" define="DIFFMAP" />
         <option name="Spec" define="SPECMAP" />
+        <option name="VCol" define="VERTEXCOLOR" />        
         <option name="Mask" define="ALPHAMASK" include="Diff" />
     </shader>
 </shaders>