Browse Source

Added emissive shader variations to LitSolid shader. Default emissive modulation color to white, similar to environment map color.

Lasse Öörni 12 years ago
parent
commit
5046508a9a

+ 6 - 0
Bin/CoreData/Shaders/GLSL/LitSolid.frag

@@ -132,6 +132,9 @@ void main()
         #ifdef LIGHTMAP
             finalColor += texture2D(sEmissiveMap, vTexCoord2).rgb * diffColor.rgb;
         #endif
+        #ifdef EMISSIVE
+            finalColor += cMatEmissiveColor * texture2D(sEmissiveMap, vTexCoord).rgb;
+        #endif
 
         gl_FragData[0] = vec4(GetFog(finalColor, vVertexLight.a), 1.0);
         gl_FragData[1] = GetFogFactor(vVertexLight.a) * vec4(diffColor.rgb, specIntensity);
@@ -165,6 +168,9 @@ void main()
         #ifdef LIGHTMAP
             finalColor += texture2D(sEmissiveMap, vTexCoord2).rgb * diffColor.rgb;
         #endif
+        #ifdef EMISSIVE
+            finalColor += cMatEmissiveColor * texture2D(sEmissiveMap, vTexCoord).rgb;
+        #endif
 
         gl_FragColor = vec4(GetFog(finalColor, vVertexLight.a), diffColor.a);
     #endif

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

@@ -33,29 +33,37 @@
         <option name="Packed" define="PACKEDNORMAL" require="NORMALMAP" />
         <option name="SpecMap" define="SPECMAP" require="DIFFMAP" />
         <option name="EnvCube" define="ENVCUBEMAP" />
-        <option name="LightMap" define="LIGHTMAP" />
+        <option name="LightMap" define="LIGHTMAP" require="DIFFMAP" exclude="Emissive" />
+        <option name="Emissive" define="EMISSIVE" exclude="LightMap" />
         <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="Emissive" />
             <define name="DIRLIGHT" />
             <define name="PERPIXEL" />
         </variation>
         <variation name="Spot">
             <exclude name="EnvCube" />
             <exclude name="LightMap" />
+            <exclude name="Emissive" />
             <define name="SPOTLIGHT" />
             <define name="PERPIXEL" />
         </variation>
         <variation name="Point">
             <exclude name="EnvCube" />
             <exclude name="LightMap" />
+            <exclude name="Emissive" />
             <define name="POINTLIGHT" />
             <define name="PERPIXEL" />
         </variation>
-        <variation name="Prepass" define="PREPASS" exclude="EnvCube" />
+        <variation name="Prepass" define="PREPASS">
+            <exclude name="EnvCube" />
+            <exclude name="LightMap" />
+            <exclude name="Emissive" />
+        </variation>
         <variation name="Material" define="MATERIAL" />
         <variation name="Deferred" define="DEFERRED" />
         <option name="Mask" define="CUBEMASK" require="POINTLIGHT" />

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

@@ -276,6 +276,9 @@ void PS(float2 iTexCoord : TEXCOORD0,
         #ifdef LIGHTMAP
             finalColor += tex2D(sEmissiveMap, iTexCoord2).rgb * diffColor.rgb;
         #endif
+        #ifdef EMISSIVE
+            finalColor += cMatEmissiveColor * tex2D(sEmissiveMap, iTexCoord).rgb;
+        #endif
 
         oColor = float4(GetFog(finalColor, iVertexLight.a), 1.0);
         oAlbedo = GetFogFactor(iVertexLight.a) * float4(diffColor.rgb, specIntensity);
@@ -307,6 +310,9 @@ void PS(float2 iTexCoord : TEXCOORD0,
         #ifdef LIGHTMAP
             finalColor += tex2D(sEmissiveMap, iTexCoord2).rgb * diffColor.rgb;
         #endif
+        #ifdef EMISSIVE
+            finalColor += cMatEmissiveColor * tex2D(sEmissiveMap, iTexCoord).rgb;
+        #endif
 
         oColor = float4(GetFog(finalColor, iVertexLight.a), diffColor.a);
     #endif

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

@@ -33,29 +33,37 @@
         <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" />
+        <option name="LightMap" define="LIGHTMAP" require="DIFFMAP" exclude="Emissive" />
+        <option name="Emissive" define="EMISSIVE" exclude="LightMap" />
         <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="Emissive" />
             <define name="DIRLIGHT" />
             <define name="PERPIXEL" />
         </variation>
         <variation name="Spot">
             <exclude name="EnvCube" />
             <exclude name="LightMap" />
+            <exclude name="Emissive" />
             <define name="SPOTLIGHT" />
             <define name="PERPIXEL" />
         </variation>
         <variation name="Point">
             <exclude name="EnvCube" />
             <exclude name="LightMap" />
+            <exclude name="Emissive" />
             <define name="POINTLIGHT" />
             <define name="PERPIXEL" />
         </variation>
-        <variation name="Prepass" define="PREPASS" exclude="EnvCube" />
+        <variation name="Prepass" define="PREPASS">
+            <exclude name="EnvCube" />
+            <exclude name="LightMap" />
+            <exclude name="Emissive" />
+        </variation>
         <variation name="Material" define="MATERIAL" />
         <variation name="Deferred" define="DEFERRED" />
         <option name="Mask" define="CUBEMASK" require="POINTLIGHT" />

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

@@ -0,0 +1,9 @@
+<technique>
+    <pass name="base" vs="LitSolid" ps="LitSolid_DiffEmissive" />
+    <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" ps="LitSolid_DiffEmissiveMaterial" depthtest="equal" depthwrite="false" />
+    <pass name="deferred" vs="LitSolid" ps="LitSolid_DiffEmissiveDeferred" />
+    <pass name="depth" vs="Depth" ps="Depth" />
+    <pass name="shadow" vs="Shadow" ps="Shadow" />
+</technique>

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

@@ -0,0 +1,5 @@
+<technique>
+    <pass name="alpha" vs="LitSolid" ps="LitSolid_DiffEmissive" depthwrite="false" blend="alpha" />
+    <pass name="litalpha" vs="LitSolid" ps="LitSolid_Diff" depthwrite="false" blend="addalpha" />
+    <pass name="shadow" vs="Shadow" ps="Shadow" />
+</technique>

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

@@ -0,0 +1,9 @@
+<technique>
+    <pass name="base" vs="LitSolid_Normal" ps="LitSolid_DiffNormalEmissive" />
+    <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_Normal" ps="LitSolid_DiffNormalEmissiveMaterial" depthtest="equal" depthwrite="false" />
+    <pass name="deferred" vs="LitSolid_Normal" ps="LitSolid_DiffNormalEmissiveDeferred" />
+    <pass name="depth" vs="Depth" ps="Depth" />
+    <pass name="shadow" vs="Shadow" ps="Shadow" />
+</technique>

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

@@ -0,0 +1,5 @@
+<technique>
+    <pass name="alpha" vs="LitSolid_Normal" ps="LitSolid_DiffNormalEmissive" depthwrite="false" blend="alpha" />
+    <pass name="litalpha" vs="LitSolid_Normal" ps="LitSolid_DiffNormal" depthwrite="false" blend="addalpha" />
+    <pass name="shadow" vs="Shadow" ps="Shadow" />
+</technique>

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

@@ -0,0 +1,9 @@
+<technique>
+    <pass name="base" vs="LitSolid_Normal" ps="LitSolid_DiffNormalPackedEmissive" />
+    <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_Normal" ps="LitSolid_DiffNormalPackedEmissiveMaterial" depthtest="equal" depthwrite="false" />
+    <pass name="deferred" vs="LitSolid_Normal" ps="LitSolid_DiffNormalPackedEmissiveDeferred" />
+    <pass name="depth" vs="Depth" ps="Depth" />
+    <pass name="shadow" vs="Shadow" ps="Shadow" />
+</technique>

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

@@ -0,0 +1,5 @@
+<technique>
+    <pass name="alpha" vs="LitSolid_Normal" ps="LitSolid_DiffNormalPackedEmissive" depthwrite="false" blend="alpha" />
+    <pass name="litalpha" vs="LitSolid_Normal" ps="LitSolid_DiffNormalPacked" depthwrite="false" blend="addalpha" />
+    <pass name="shadow" vs="Shadow" ps="Shadow" />
+</technique>

+ 1 - 1
Source/Engine/Graphics/Material.cpp

@@ -510,7 +510,7 @@ void Material::ResetToDefaults()
     SetShaderParameter("UOffset", Vector4(1.0f, 0.0f, 0.0f, 0.0f));
     SetShaderParameter("VOffset", Vector4(0.0f, 1.0f, 0.0f, 0.0f));
     SetShaderParameter("MatDiffColor", Vector4::ONE);
-    SetShaderParameter("MatEmissiveColor", Vector4::ZERO);
+    SetShaderParameter("MatEmissiveColor", Vector4::ONE);
     SetShaderParameter("MatEnvMapColor", Vector4::ONE);
     SetShaderParameter("MatSpecColor", Vector4(0.0f, 0.0f, 0.0f, 1.0f));