Browse Source

Added missing HLSL deferred shaders.

Lasse Öörni 14 years ago
parent
commit
43bff9083e

+ 117 - 0
SourceAssets/HLSLShaders/Deferred.hlsl

@@ -0,0 +1,117 @@
+#include "Uniforms.hlsl"
+#include "Samplers.hlsl"
+#include "Transform.hlsl"
+#include "Lighting.hlsl"
+#include "Fog.hlsl"
+
+void VS(float4 iPos : POSITION,
+    float3 iNormal : NORMAL,
+    #ifdef NORMALMAP
+        float4 iTangent : TANGENT0,
+    #endif
+    float2 iTexCoord : TEXCOORD0,
+    #ifdef VERTEXCOLOR
+        float4 iColor : COLOR0,
+    #endif
+    #ifdef SKINNED
+        float4 iBlendWeights : BLENDWEIGHT,
+        int4 iBlendIndices : BLENDINDICES,
+    #endif
+    #ifdef INSTANCED
+        float4x3 iModelInstance : TEXCOORD2,
+    #endif
+    out float2 oTexCoord : TEXCOORD0,
+    out float4 oVertexLighting : TEXCOORD1,
+    out float3 oNormal : TEXCOORD2,
+    #ifdef NORMALMAP
+        out float3 oTangent : TEXCOORD3,
+        out float3 oBitangent : TEXCOORD4,
+    #endif
+    #ifdef VERTEXCOLOR
+        out float4 oColor : COLOR0,
+    #endif
+    out float4 oPos : POSITION)
+{
+    float4x3 modelMatrix = iModelMatrix;
+    float3 worldPos = GetWorldPos(modelMatrix);
+    oPos = GetClipPos(worldPos);
+    oTexCoord = GetTexCoord(iTexCoord);
+
+    oVertexLighting = float4(GetAmbient(GetZonePos(worldPos)), GetDepth(oPos));
+    #ifdef NUMVERTEXLIGHTS
+    float3 normal = GetWorldNormal(modelMatrix);
+    for (int i = 0; i < NUMVERTEXLIGHTS; ++i)
+        oVertexLighting.rgb += GetVertexLight(i, worldPos, normal) * cVertexLights[i * 3].rgb;
+    #endif
+
+    oNormal = GetWorldNormal(modelMatrix);
+    #ifdef NORMALMAP
+        oTangent = GetWorldTangent(modelMatrix);
+        oBitangent = cross(oTangent, oNormal) * iTangent.w;
+    #endif
+    
+    #ifdef VERTEXCOLOR
+        oColor = iColor;
+    #endif
+}
+
+void PS(
+    float2 iTexCoord : TEXCOORD0,
+    float4 iVertexLighting : TEXCOORD1,
+    float3 iNormal : TEXCOORD2,
+    #ifdef NORMALMAP
+        float3 iTangent : TEXCOORD3,
+        float3 iBitangent : TEXCOORD4,
+    #endif
+    #ifdef VERTEXCOLOR
+        float4 iColor : COLOR0,
+    #endif
+    out float4 oAlbedo : COLOR1,
+    out float4 oNormal : COLOR2,
+    #ifndef HWDEPTH
+        out float4 oDepth : COLOR3,
+    #endif
+    out float4 oColor : COLOR0)
+{
+    #ifdef DIFFMAP
+        float4 diffInput = tex2D(sDiffMap, iTexCoord);
+        #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 NORMALMAP
+        float3x3 tbn = float3x3(iTangent, iBitangent, iNormal);
+        float3 normal = mul(DecodeNormal(tex2D(sNormalMap, iTexCoord)), tbn);
+    #else
+        float3 normal = iNormal;
+    #endif
+    
+    // If using SM2, light volume shader may not have instructions left to normalize the normal. Therefore do it here
+    #if !defined(SM3)
+        normal = normalize(normal);
+    #endif
+
+    #ifdef SPECMAP
+        float specIntensity = cMatSpecColor.g * tex2D(sSpecMap, iTexCoord).g;
+    #else
+        float specIntensity = cMatSpecColor.g;
+    #endif
+
+    float specPower = cMatSpecColor.a / 255.0;
+
+    oColor = float4(GetFog(iVertexLighting.rgb * diffColor, iVertexLighting.a), 1.0);
+    oAlbedo = GetFogFactor(iVertexLighting.a) * float4(diffColor, specIntensity);
+    oNormal = float4(normal * 0.5 + 0.5, specPower);
+    #ifndef HWDEPTH
+        oDepth = iVertexLighting.a;
+    #endif
+}

+ 26 - 0
SourceAssets/HLSLShaders/Deferred.xml

@@ -0,0 +1,26 @@
+<shaders>
+    <shader name="Deferred" type="vs">
+        <option name="Normal" define="NORMALMAP" />
+        <option name="VCol" define="VERTEXCOLOR" />
+        <option name="HW" define="HWDEPTH" />
+        <variation name="" />
+        <variation name="1VL" define="NUMVERTEXLIGHTS=1" />
+        <variation name="2VL" define="NUMVERTEXLIGHTS=2" />
+        <variation name="3VL" define="NUMVERTEXLIGHTS=3" />
+        <variation name="4VL" define="NUMVERTEXLIGHTS=4" />
+        <variation name="5VL" define="NUMVERTEXLIGHTS=5" />
+        <variation name="6VL" define="NUMVERTEXLIGHTS=6" />
+        <option name="" /> <!-- Dummy option to separate the two variation groups -->
+        <variation name="" />
+        <variation name="Skinned" define="SKINNED" />
+        <variation name="Instanced" define="INSTANCED" />
+    </shader>
+    <shader name="Deferred" type="ps">
+        <option name="Diff" define="DIFFMAP" />
+        <option name="Normal" define="NORMALMAP" require="DIFFMAP" />
+        <option name="SpecMap" define="SPECMAP" require="DIFFMAP" />
+        <option name="Mask" define="ALPHAMASK" require="DIFFMAP" />
+        <option name="VCol" define="VERTEXCOLOR" />
+        <option name="HW" define="HWDEPTH" />
+    </shader>
+</shaders>

+ 129 - 0
SourceAssets/HLSLShaders/DeferredLight.hlsl

@@ -0,0 +1,129 @@
+#include "Uniforms.hlsl"
+#include "Samplers.hlsl"
+#include "Transform.hlsl"
+#include "ScreenPos.hlsl"
+#include "Lighting.hlsl"
+
+void VS(float4 iPos : POSITION,
+    #ifdef DIRLIGHT
+        out float2 oScreenPos : TEXCOORD0,
+    #else
+        out float4 oScreenPos : TEXCOORD0,
+    #endif
+    out float3 oFarRay : TEXCOORD1,
+    #ifdef ORTHO
+        out float3 oNearRay : TEXCOORD2,
+    #endif
+    out float4 oPos : POSITION)
+{
+    float4x3 modelMatrix = iModelMatrix;
+    float3 worldPos = GetWorldPos(modelMatrix);
+    oPos = GetClipPos(worldPos);
+    #ifdef DIRLIGHT
+        oScreenPos = GetScreenPosPreDiv(oPos);
+        oFarRay = GetFarRay(oPos);
+        #ifdef ORTHO
+            oNearRay = GetNearRay(oPos);
+        #endif
+    #else
+        oScreenPos = GetScreenPos(oPos);
+        oFarRay = GetFarRay(oPos) * oPos.w;
+        #ifdef ORTHO
+            oNearRay = GetNearRay(oPos) * oPos.w;
+        #endif
+    #endif
+}
+
+void PS(
+    #ifdef DIRLIGHT
+        float2 iScreenPos : TEXCOORD0,
+    #else
+        float4 iScreenPos : TEXCOORD0,
+    #endif
+    float3 iFarRay : TEXCOORD1,
+    #ifdef ORTHO
+        float3 iNearRay : TEXCOORD2,
+    #endif
+    out float4 oColor : COLOR0)
+{
+    // If rendering a directional light quad, optimize out the w divide
+    #ifdef DIRLIGHT
+        #ifdef ORTHO
+            float depth = tex2D(sDepthBuffer, iScreenPos).r;
+            float3 worldPos = lerp(iNearRay, iFarRay, depth);
+        #else
+            #ifdef LINEAR
+                float depth = tex2D(sDepthBuffer, iScreenPos).r;
+            #else
+                float depth = ReconstructDepth(tex2D(sDepthBuffer, iScreenPos).r);
+            #endif
+            float3 worldPos = iFarRay * depth;
+        #endif
+        float4 albedoInput = tex2D(sAlbedoBuffer, iScreenPos);
+        float4 normalInput = tex2D(sNormalBuffer, iScreenPos);
+    #else
+        #ifdef ORTHO
+            float depth = tex2Dproj(sDepthBuffer, iScreenPos).r;
+            float3 worldPos = lerp(iNearRay, iFarRay, depth) / iScreenPos.w;
+        #else
+            #ifdef LINEAR
+                float depth = tex2Dproj(sDepthBuffer, iScreenPos).r;
+            #else
+                float depth = ReconstructDepth(tex2Dproj(sDepthBuffer, iScreenPos).r);
+            #endif
+            float3 worldPos = iFarRay * depth / iScreenPos.w;
+        #endif
+        float4 albedoInput = tex2Dproj(sAlbedoBuffer, iScreenPos);
+        float4 normalInput = tex2Dproj(sNormalBuffer, iScreenPos);
+    #endif
+
+    // With a cubemasked shadowed point light and hardware depth reconstruction, SM2 runs out of instructions,
+    // so skip normalization of normals in that case
+    #if defined(SM3) || defined(HWSHADOW) || !defined(POINTLIGHT) || !defined(SHADOW) || !defined(CUBEMASK)
+        float3 normal = normalize(normalInput.rgb * 2.0 - 1.0);
+    #else
+        float3 normal = normalInput.rgb * 2.0 - 1.0;
+    #endif
+
+    float4 projWorldPos = float4(worldPos, 1.0);
+    float3 lightColor;
+    float3 lightDir;
+    float diff;
+
+    #ifdef DIRLIGHT
+        lightDir = cLightDirPS;
+        diff = GetDiffuseDir(normal, lightDir);
+    #else
+        float3 lightVec = (cLightPosPS.xyz - worldPos) * cLightPosPS.w;
+        diff = GetDiffusePointOrSpot(normal, lightVec, lightDir);
+    #endif
+
+    #ifdef SHADOW
+        #if defined(DIRLIGHT)
+            float4 shadowPos = GetDirShadowPosDeferred(cLightMatricesPS, projWorldPos, depth);
+            diff *= saturate(GetShadow(shadowPos) + GetShadowFade(depth));
+        #elif defined(SPOTLIGHT)
+            float4 shadowPos = mul(projWorldPos, cLightMatricesPS[1]);
+            diff *= GetShadow(shadowPos);
+        #else
+            float3 shadowPos = worldPos - cLightPosPS.xyz;
+            diff *= GetCubeShadow(shadowPos);
+        #endif
+    #endif
+
+    #if defined(SPOTLIGHT)
+        float4 spotPos = mul(projWorldPos, cLightMatricesPS[0]);
+        lightColor = spotPos.w > 0.0 ? tex2Dproj(sLightSpotMap, spotPos).rgb * cLightColor.rgb : 0.0;
+    #elif defined(CUBEMASK)
+        lightColor = texCUBE(sLightCubeMap, mul(lightVec, (float3x3)cLightMatricesPS[0])).rgb * cLightColor.rgb;
+    #else
+        lightColor = cLightColor.rgb;
+    #endif
+
+    #ifdef SPECULAR
+        float spec = lightColor.g * GetSpecular(normal, -worldPos, lightDir, normalInput.a * 255.0);
+        oColor = diff * float4(lightColor * albedoInput.rgb + spec * cLightColor.a * albedoInput.aaa, 0.0);
+    #else
+        oColor = diff * float4(lightColor * albedoInput.rgb, 0.0);
+    #endif
+}

+ 18 - 0
SourceAssets/HLSLShaders/DeferredLight.xml

@@ -0,0 +1,18 @@
+<shaders>
+    <shader name="DeferredLight" type="vs">
+        <option name="Ortho" define="ORTHO" />
+        <option name="Dir" define="DIRLIGHT" />
+    </shader>
+    <shader name="DeferredLight" type="ps">
+        <option name="Linear" define="LINEAR" exclude="Ortho" />
+        <option name="Ortho" define="ORTHO" exclude="Linear" />
+        <variation name="Dir" define="DIRLIGHT" />
+        <variation name="Spot" define="SPOTLIGHT" />
+        <variation name="Point" define="POINTLIGHT" />
+        <option name="Mask" define="CUBEMASK" require="POINTLIGHT" />
+        <option name="Spec" define="SPECULAR" />
+        <option name="Shadow" define="SHADOW" />
+        <option name="LQ" define="LQSHADOW" require="HWSHADOW" />
+        <option name="HW" define="HWSHADOW" require="SHADOW" />
+    </shader>
+</shaders>

+ 0 - 0
SourceAssets/HLSLShaders/GBuffer.hlsl → SourceAssets/HLSLShaders/Prepass.hlsl


+ 2 - 2
SourceAssets/HLSLShaders/GBuffer.xml → SourceAssets/HLSLShaders/Prepass.xml

@@ -1,12 +1,12 @@
 <shaders>
-    <shader name="GBuffer" type="vs">
+    <shader name="Prepass" type="vs">
         <option name="Normal" define="NORMALMAP" />
         <option name="HW" define="HWDEPTH" />
         <variation name="" />
         <variation name="Skinned" define="SKINNED" />
         <variation name="Instanced" define="INSTANCED" />
     </shader>
-    <shader name="GBuffer" type="ps">
+    <shader name="Prepass" type="ps">
         <option name="Normal" define="NORMALMAP" />
         <option name="Mask" define="ALPHAMASK" />
         <option name="HW" define="HWDEPTH" />

+ 0 - 0
SourceAssets/HLSLShaders/LightVolume.hlsl → SourceAssets/HLSLShaders/PrepassLight.hlsl


+ 2 - 2
SourceAssets/HLSLShaders/LightVolume.xml → SourceAssets/HLSLShaders/PrepassLight.xml

@@ -1,9 +1,9 @@
 <shaders>
-    <shader name="LightVolume" type="vs">
+    <shader name="PrepassLight" type="vs">
         <option name="Ortho" define="ORTHO" />
         <option name="Dir" define="DIRLIGHT" />
     </shader>
-    <shader name="LightVolume" type="ps">
+    <shader name="PrepassLight" type="ps">
         <option name="Linear" define="LINEAR" exclude="Ortho" />
         <option name="Ortho" define="ORTHO" exclude="Linear" />
         <variation name="Dir" define="DIRLIGHT" />