Răsfoiți Sursa

Added ambient occlusion LitSolid permutations. These read the emissive texture and use the second texcoord, like lightmapped permutations. Closes #79.

Lasse Öörni 12 ani în urmă
părinte
comite
d113be3bb2

+ 10 - 2
Bin/CoreData/Shaders/GLSL/LitSolid.frag

@@ -32,7 +32,7 @@ varying vec2 vTexCoord;
     #ifdef ENVCUBEMAP
         varying vec3 vReflectionVec;
     #endif
-    #ifdef LIGHTMAP
+    #if defined(LIGHTMAP) || defined(AO)
         varying vec2 vTexCoord2;
     #endif
 #endif
@@ -124,6 +124,10 @@ void main()
         float specPower = cMatSpecColor.a / 255.0;
 
         vec3 finalColor = vVertexLight.rgb * diffColor.rgb;
+        #ifdef AO
+            // If using AO, the vertex light ambient is black, calculate occluded ambient here
+            finalColor += texture2D(sEmissiveMap, vTexCoord2).rgb * cAmbientColor * diffColor.rgb;
+        #endif
 
         #ifdef ENVCUBEMAP
             normal = normalize(normal);
@@ -145,7 +149,11 @@ void main()
     #else
         // Ambient & per-vertex lighting
         vec3 finalColor = vVertexLight.rgb * diffColor.rgb;
-
+        #ifdef AO
+            // If using AO, the vertex light ambient is black, calculate occluded ambient here
+            finalColor += texture2D(sEmissiveMap, vTexCoord2).rgb * cAmbientColor * diffColor.rgb;
+        #endif
+        
         #ifdef MATERIAL
             // Add light pre-pass accumulation result
             // Lights are accumulated at half intensity. Bring back to full intensity now

+ 5 - 4
Bin/CoreData/Shaders/GLSL/LitSolid.vert

@@ -32,7 +32,7 @@ varying vec2 vTexCoord;
     #ifdef ENVCUBEMAP
         varying vec3 vReflectionVec;
     #endif
-    #ifdef LIGHTMAP
+    #if defined(LIGHTMAP) || defined(AO)
         varying vec2 vTexCoord2;
     #endif
 #endif
@@ -97,12 +97,13 @@ void main()
         #endif
     #else
         // Ambient & per-vertex lighting
-        #ifndef LIGHTMAP
-            vVertexLight = vec4(GetAmbient(GetZonePos(worldPos)), GetDepth(gl_Position));
-        #else
+        #if defined(LIGHTMAP) || defined(AO)
             // If using lightmap, disregard zone ambient light
+            // If using AO, calculate ambient in the PS
             vVertexLight = vec4(0.0, 0.0, 0.0, GetDepth(gl_Position));
             vTexCoord2 = iTexCoord2;
+        #else
+            vVertexLight = vec4(GetAmbient(GetZonePos(worldPos)), GetDepth(gl_Position));
         #endif
         
         #ifdef NUMVERTEXLIGHTS

+ 10 - 3
Bin/CoreData/Shaders/GLSL/LitSolid.xml

@@ -2,7 +2,8 @@
     <shader type="vs">
         <option name="Normal" define="NORMALMAP" />
         <option name="EnvCube" define="ENVCUBEMAP" />
-        <option name="LightMap" define="LIGHTMAP" />
+        <option name="LightMap" define="LIGHTMAP" exclude="AO" />
+        <option name="AO" define="AO" exclude="LightMap" />
         <variation name="" define="AMBIENT" />
         <variation name="1VL" define="NUMVERTEXLIGHTS=1" />
         <variation name="2VL" define="NUMVERTEXLIGHTS=2" />
@@ -33,14 +34,17 @@
         <option name="Packed" define="PACKEDNORMAL" require="NORMALMAP" />
         <option name="SpecMap" define="SPECMAP" require="DIFFMAP" />
         <option name="EnvCube" define="ENVCUBEMAP" />
-        <option name="LightMap" define="LIGHTMAP" require="DIFFMAP" exclude="Emissive" />
-        <option name="Emissive" define="EMISSIVE" exclude="LightMap" />
+        <variation name="" />
+        <variation name="LightMap" define="LIGHTMAP" />
+        <variation name="AO" define="AO" />
+        <variation name="Emissive" define="EMISSIVE" />
         <option name="AlphaMask" define="ALPHAMASK" require="DIFFMAP" />
         <option name="Ambient" define="AMBIENT" require="PERPIXEL" />
         <variation name="" define="AMBIENT" />
         <variation name="Dir">
             <exclude name="EnvCube" />
             <exclude name="LightMap" />
+            <exclude name="AO" />
             <exclude name="Emissive" />
             <define name="DIRLIGHT" />
             <define name="PERPIXEL" />
@@ -48,6 +52,7 @@
         <variation name="Spot">
             <exclude name="EnvCube" />
             <exclude name="LightMap" />
+            <exclude name="AO" />
             <exclude name="Emissive" />
             <define name="SPOTLIGHT" />
             <define name="PERPIXEL" />
@@ -55,6 +60,7 @@
         <variation name="Point">
             <exclude name="EnvCube" />
             <exclude name="LightMap" />
+            <exclude name="AO" />
             <exclude name="Emissive" />
             <define name="POINTLIGHT" />
             <define name="PERPIXEL" />
@@ -62,6 +68,7 @@
         <variation name="Prepass" define="PREPASS">
             <exclude name="EnvCube" />
             <exclude name="LightMap" />
+            <exclude name="AO" />
             <exclude name="Emissive" />
         </variation>
         <variation name="Material" define="MATERIAL" />

+ 15 - 6
Bin/CoreData/Shaders/HLSL/LitSolid.hlsl

@@ -13,7 +13,7 @@
 void VS(float4 iPos : POSITION,
     float3 iNormal : NORMAL,
     float2 iTexCoord : TEXCOORD0,
-    #ifdef LIGHTMAP
+    #if defined(LIGHTMAP) || defined(AO)
         float2 iTexCoord2 : TEXCOORD1,
     #endif
     #ifdef NORMALMAP
@@ -58,7 +58,7 @@ void VS(float4 iPos : POSITION,
         #ifdef ENVCUBEMAP
             out float3 oReflectionVec : TEXCOORD6,
         #endif
-        #ifdef LIGHTMAP
+        #if defined(LIGHTMAP) || defined(AO)
             out float2 oTexCoord2 : TEXCOORD7,
         #endif
     #endif
@@ -116,12 +116,13 @@ void VS(float4 iPos : POSITION,
         #endif
     #else
         // Ambient & per-vertex lighting
-        #ifndef LIGHTMAP
-            oVertexLight = float4(GetAmbient(GetZonePos(worldPos)), GetDepth(oPos));
-        #else
+        #if defined(LIGHTMAP) || defined(AO)
             // If using lightmap, disregard zone ambient light
+            // If using AO, calculate ambient in the PS
             oVertexLight = float4(0.0, 0.0, 0.0, GetDepth(oPos));
             oTexCoord2 = iTexCoord2;
+        #else
+            oVertexLight = float4(GetAmbient(GetZonePos(worldPos)), GetDepth(oPos));
         #endif
 
         #ifdef NUMVERTEXLIGHTS
@@ -166,7 +167,7 @@ void PS(float2 iTexCoord : TEXCOORD0,
         #ifdef ENVCUBEMAP
             float3 iReflectionVec : TEXCOORD6,
         #endif
-        #ifdef LIGHTMAP
+        #if defined(LIGHTMAP) || defined(AO)
             float2 iTexCoord2 : TEXCOORD7,
         #endif
     #endif
@@ -270,6 +271,10 @@ void PS(float2 iTexCoord : TEXCOORD0,
         float specPower = cMatSpecColor.a / 255.0;
 
         float3 finalColor = iVertexLight.rgb * diffColor.rgb;
+        #ifdef AO
+            // If using AO, the vertex light ambient is black, calculate occluded ambient here
+            finalColor += tex2D(sEmissiveMap, iTexCoord2).rgb * cAmbientColor * diffColor.rgb;
+        #endif
         #ifdef ENVCUBEMAP
             finalColor += cMatEnvMapColor * texCUBE(sEnvCubeMap, reflect(iReflectionVec, normal)).rgb;
         #endif
@@ -287,6 +292,10 @@ void PS(float2 iTexCoord : TEXCOORD0,
     #else
         // Ambient & per-vertex lighting
         float3 finalColor = iVertexLight.rgb * diffColor.rgb;
+        #ifdef AO
+            // If using AO, the vertex light ambient is black, calculate occluded ambient here
+            finalColor += tex2D(sEmissiveMap, iTexCoord2).rgb * cAmbientColor * diffColor.rgb;
+        #endif
 
         #ifdef MATERIAL
             // Add light pre-pass accumulation result

+ 10 - 3
Bin/CoreData/Shaders/HLSL/LitSolid.xml

@@ -2,7 +2,8 @@
     <shader type="vs">
         <option name="Normal" define="NORMALMAP" />
         <option name="EnvCube" define="ENVCUBEMAP" />
-        <option name="LightMap" define="LIGHTMAP" />
+        <option name="LightMap" define="LIGHTMAP" exclude="AO" />
+        <option name="AO" define="AO" exclude="LightMap" />
         <variation name="" define="AMBIENT" />
         <variation name="1VL" define="NUMVERTEXLIGHTS=1" />
         <variation name="2VL" define="NUMVERTEXLIGHTS=2" />
@@ -33,14 +34,17 @@
         <option name="Packed" define="PACKEDNORMAL" require="NORMALMAP" />
         <option name="SpecMap" define="SPECMAP" require="DIFFMAP" />
         <option name="EnvCube" define="ENVCUBEMAP" />
-        <option name="LightMap" define="LIGHTMAP" require="DIFFMAP" exclude="Emissive" />
-        <option name="Emissive" define="EMISSIVE" exclude="LightMap" />
+        <variation name="" />
+        <variation name="LightMap" define="LIGHTMAP" />
+        <variation name="AO" define="AO" />
+        <variation name="Emissive" define="EMISSIVE" />
         <option name="AlphaMask" define="ALPHAMASK" require="DIFFMAP" />
         <option name="Ambient" define="AMBIENT" require="PERPIXEL" />
         <variation name="" define="AMBIENT" />
         <variation name="Dir">
             <exclude name="EnvCube" />
             <exclude name="LightMap" />
+            <exclude name="AO" />
             <exclude name="Emissive" />
             <define name="DIRLIGHT" />
             <define name="PERPIXEL" />
@@ -48,6 +52,7 @@
         <variation name="Spot">
             <exclude name="EnvCube" />
             <exclude name="LightMap" />
+            <exclude name="AO" />
             <exclude name="Emissive" />
             <define name="SPOTLIGHT" />
             <define name="PERPIXEL" />
@@ -55,6 +60,7 @@
         <variation name="Point">
             <exclude name="EnvCube" />
             <exclude name="LightMap" />
+            <exclude name="AO" />
             <exclude name="Emissive" />
             <define name="POINTLIGHT" />
             <define name="PERPIXEL" />
@@ -62,6 +68,7 @@
         <variation name="Prepass" define="PREPASS">
             <exclude name="EnvCube" />
             <exclude name="LightMap" />
+            <exclude name="AO" />
             <exclude name="Emissive" />
         </variation>
         <variation name="Material" define="MATERIAL" />

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

@@ -0,0 +1,9 @@
+<technique>
+    <pass name="base" vs="LitSolid_AO" ps="LitSolid_DiffAO" />
+    <pass name="light" vs="LitSolid" ps="LitSolid_Diff" depthtest="equal" depthwrite="false" blend="add" />
+    <pass name="prepass" vs="LitSolid" ps="LitSolid_DiffPrepass" />
+    <pass name="material" vs="LitSolid_AO" ps="LitSolid_DiffAOMaterial" depthtest="equal" depthwrite="false" />
+    <pass name="deferred" vs="LitSolid_AO" ps="LitSolid_DiffAODeferred" />
+    <pass name="depth" vs="Depth" ps="Depth" />
+    <pass name="shadow" vs="Shadow" ps="Shadow" />
+</technique>

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

@@ -0,0 +1,9 @@
+<technique>
+    <pass name="base" vs="LitSolid_AO" ps="LitSolid_DiffAO" />
+    <pass name="light" vs="LitSolid_Normal" ps="LitSolid_DiffNormal" depthtest="equal" depthwrite="false" blend="add" />
+    <pass name="prepass" vs="LitSolid_Normal" ps="LitSolid_DiffNormalPrepass" />
+    <pass name="material" vs="LitSolid_AO" ps="LitSolid_DiffAOMaterial" depthtest="equal" depthwrite="false" />
+    <pass name="deferred" vs="LitSolid_NormalAO" ps="LitSolid_DiffNormalAODeferred" />
+    <pass name="depth" vs="Depth" ps="Depth" />
+    <pass name="shadow" vs="Shadow" ps="Shadow" />
+</technique>

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

@@ -0,0 +1,9 @@
+<technique>
+    <pass name="base" vs="LitSolid_AO" ps="LitSolid_DiffAO" />
+    <pass name="light" vs="LitSolid_Normal" ps="LitSolid_DiffNormalPacked" depthtest="equal" depthwrite="false" blend="add" />
+    <pass name="prepass" vs="LitSolid_Normal" ps="LitSolid_DiffNormalPackedPrepass" />
+    <pass name="material" vs="LitSolid_AO" ps="LitSolid_DiffAOMaterial" depthtest="equal" depthwrite="false" />
+    <pass name="deferred" vs="LitSolid_NormalAO" ps="LitSolid_DiffNormalPackedAODeferred" />
+    <pass name="depth" vs="Depth" ps="Depth" />
+    <pass name="shadow" vs="Shadow" ps="Shadow" />
+</technique>

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

@@ -0,0 +1,9 @@
+<technique>
+    <pass name="base" vs="LitSolid_AO" ps="LitSolid_DiffAO" />
+    <pass name="light" vs="LitSolid_Normal" ps="LitSolid_DiffNormalPackedSpecMap" depthtest="equal" depthwrite="false" blend="add" />
+    <pass name="prepass" vs="LitSolid_Normal" ps="LitSolid_DiffNormalPackedSpecMapPrepass" />
+    <pass name="material" vs="LitSolid_AO" ps="LitSolid_DiffSpecMapAOMaterial" depthtest="equal" depthwrite="false" />
+    <pass name="deferred" vs="LitSolid_NormalAO" ps="LitSolid_DiffNormalPackedSpecMapAODeferred" />
+    <pass name="depth" vs="Depth" ps="Depth" />
+    <pass name="shadow" vs="Shadow" ps="Shadow" />
+</technique>

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

@@ -0,0 +1,9 @@
+<technique>
+    <pass name="base" vs="LitSolid_AO" ps="LitSolid_DiffAO" />
+    <pass name="light" vs="LitSolid_Normal" ps="LitSolid_DiffNormalSpecMap" depthtest="equal" depthwrite="false" blend="add" />
+    <pass name="prepass" vs="LitSolid_Normal" ps="LitSolid_DiffNormalSpecMapPrepass" />
+    <pass name="material" vs="LitSolid_AO" ps="LitSolid_DiffSpecMapAOMaterial" depthtest="equal" depthwrite="false" />
+    <pass name="deferred" vs="LitSolid_NormalAO" ps="LitSolid_DiffNormalSpecMapAODeferred" />
+    <pass name="depth" vs="Depth" ps="Depth" />
+    <pass name="shadow" vs="Shadow" ps="Shadow" />
+</technique>