Browse Source

Freed up pixel shader uniforms.
Allow defining material specular color instead of just intensity.

Lasse Öörni 14 years ago
parent
commit
b9e62689f2

+ 1 - 1
Bin/CoreData/Materials/Default.xml

@@ -1,4 +1,4 @@
 <material>
     <technique name="Techniques/NoTexture.xml" />
-    <parameter name="MatSpecProperties" value="0.5 16" />
+    <parameter name="MatSpecColor" value="0.5 0.5 0.5 16" />
 </material>

+ 1 - 1
Bin/CoreData/Materials/DefaultGrey.xml

@@ -1,5 +1,5 @@
 <material>
     <technique name="Techniques/NoTexture.xml" />
     <parameter name="MatDiffColor" value="0.5 0.5 0.5 1" />
-    <parameter name="MatSpecProperties" value="0.5 16" />
+    <parameter name="MatSpecColor" value="0.5 0.5 0.5 16" />
 </material>

+ 1 - 1
Bin/Data/Materials/Jack.xml

@@ -1,4 +1,4 @@
 <material>
     <technique name="Techniques/NoTexture.xml" />
-    <parameter name="MatSpecProperties" value="0.5 16" />
+    <parameter name="MatSpecColor" value="0.5 0.5 0.5 16" />
 </material>

+ 1 - 1
Bin/Data/Materials/Mushroom.xml

@@ -1,5 +1,5 @@
 <material>
     <technique name="Techniques/Diff.xml" />
     <texture unit="diffuse" name="Textures/Mushroom.dds" />
-    <parameter name="MatSpecProperties" value="0.1 16" />
+    <parameter name="MatSpecColor" value="0.1 0.1 0.1 16" />
 </material>

+ 1 - 1
Bin/Data/Materials/Ninja.xml

@@ -1,5 +1,5 @@
 <material>
     <technique name="Techniques/Diff.xml" />
     <texture unit="diffuse" name="Textures/Ninja.dds" />
-    <parameter name="MatSpecProperties" value="0 0" />
+    <parameter name="MatSpecColor" value="0 0 0 1" />
 </material>

+ 1 - 1
Bin/Data/Materials/Potion.xml

@@ -1,5 +1,5 @@
 <material>
     <technique name="Techniques/NoTexture.xml" />
     <parameter name="MatDiffColor" value="1 0 0 1" />
-    <parameter name="MatSpecProperties" value="0.25 16" />
+    <parameter name="MatSpecColor" value="0.25 0.25 0.25 16" />
 </material>

+ 1 - 1
Bin/Data/Materials/Snow.xml

@@ -1,5 +1,5 @@
 <material>
     <technique name="Techniques/Diff.xml" />
     <texture unit="diffuse" name="Textures/Snow.dds" />
-    <parameter name="MatSpecProperties" value="0.25 16" />
+    <parameter name="MatSpecColor" value="0.25 0.25 0.25 16" />
 </material>

+ 1 - 1
Bin/Data/Materials/SnowCrate.xml

@@ -1,5 +1,5 @@
 <material>
     <technique name="Techniques/Diff.xml" />
     <texture unit="diffuse" name="Textures/SnowCrate.dds" />
-    <parameter name="MatSpecProperties" value="0.15 16" />
+    <parameter name="MatSpecColor" value="0.15 0.15 0.15 16" />
 </material>

+ 1 - 1
Bin/Data/Materials/Test.xml

@@ -3,5 +3,5 @@
     <technique name="Techniques/Diff.xml" quality="0" />
     <texture unit="diffuse" name="Textures/Diffuse.dds" />
     <texture unit="normal" name="Textures/Normal.dds" />
-    <parameter name="MatSpecProperties" value="0.5 16" />
+    <parameter name="MatSpecColor" value="0.5 0.5 0.5 16" />
 </material>

+ 2 - 2
Engine/Graphics/Batch.cpp

@@ -514,7 +514,7 @@ void Batch::Prepare(Graphics* graphics, Renderer* renderer, bool setModelTransfo
                 if (fadeStart > 0.0f && fadeEnd > 0.0f && fadeEnd > fadeStart)
                     intensity = Lerp(intensity, 1.0f, Clamp((light->GetDistance() - fadeStart) / (fadeEnd - fadeStart), 0.0f, 1.0f));
                 float pcfValues = (1.0f - intensity);
-                float samples = 4.0f;
+                float samples = renderer->GetShadowQuality() >= SHADOWQUALITY_HIGH_16BIT ? 4.0f : 1.0f;
                 float fallbackBias = 0.0f;
                 // Fallback mode requires manual depth biasing. We do not do proper slope scale biasing,
                 // instead just fudge the bias values together
@@ -524,7 +524,7 @@ void Batch::Prepare(Graphics* graphics, Renderer* renderer, bool setModelTransfo
                     fallbackBias = graphics->GetDepthConstantBias() + 2.0f * graphics->GetDepthSlopeScaledBias() *
                         graphics->GetDepthConstantBias();
                 }
-                graphics->SetShaderParameter(PSP_SHADOWINTENSITY, Vector4(pcfValues, pcfValues / samples, intensity, fallbackBias));
+                graphics->SetShaderParameter(PSP_SHADOWINTENSITY, Vector4(pcfValues / samples, intensity, fallbackBias, 0.0f));
             }
             
             if (graphics->NeedParameterUpdate(PSP_SHADOWSPLITS, light))

+ 2 - 1
Engine/Graphics/GraphicsDefs.cpp

@@ -55,7 +55,8 @@ StringHash PSP_LIGHTDIR("LightDirPS");
 StringHash PSP_LIGHTPOS("LightPosPS");
 StringHash PSP_MATDIFFCOLOR("MatDiffColor");
 StringHash PSP_MATEMISSIVECOLOR("MatEmissiveColor");
-StringHash PSP_MATSPECPROPERTIES("MatSpecProperties");
+StringHash PSP_MATENVMAPECOLOR("MatEnvMapColor");
+StringHash PSP_MATSPECCOLOR("MatSpecColor");
 StringHash PSP_SAMPLEOFFSETS("SampleOffsets");
 StringHash PSP_SHADOWCUBEADJUST("ShadowCubeAdjust");
 StringHash PSP_SHADOWDEPTHFADE("ShadowDepthFade");

+ 2 - 1
Engine/Graphics/GraphicsDefs.h

@@ -225,7 +225,8 @@ extern StringHash PSP_LIGHTDIR;
 extern StringHash PSP_LIGHTPOS;
 extern StringHash PSP_MATDIFFCOLOR;
 extern StringHash PSP_MATEMISSIVECOLOR;
-extern StringHash PSP_MATSPECPROPERTIES;
+extern StringHash PSP_MATENVMAPCOLOR;
+extern StringHash PSP_MATSPECCOLOR;
 extern StringHash PSP_SAMPLEOFFSETS;
 extern StringHash PSP_SHADOWCUBEADJUST;
 extern StringHash PSP_SHADOWDEPTHFADE;

+ 4 - 3
Engine/Graphics/Material.cpp

@@ -91,7 +91,8 @@ Material::Material(Context* context) :
     SetShaderParameter("VOffset", Vector4(0.0f, 1.0f, 0.0f, 0.0f));
     SetShaderParameter("MatDiffColor", Vector4::ONE);
     SetShaderParameter("MatEmissiveColor", Vector4::ZERO);
-    SetShaderParameter("MatSpecProperties", Vector4::ZERO);
+    SetShaderParameter("MatEnvMapColor", Vector4::ONE);
+    SetShaderParameter("MatSpecColor", Vector4(0.0f, 0.0f, 0.0f, 1.0f));
     
     CheckSpecular();
 }
@@ -409,9 +410,9 @@ void Material::CheckOcclusion()
 
 void Material::CheckSpecular()
 {
-    HashMap<StringHash, MaterialShaderParameter>::ConstIterator i = shaderParameters_.Find(PSP_MATSPECPROPERTIES);
+    HashMap<StringHash, MaterialShaderParameter>::ConstIterator i = shaderParameters_.Find(PSP_MATSPECCOLOR);
     if (i != shaderParameters_.End())
-        specular_ = i->second_.value_.x_ > 0.0f;
+        specular_ = i->second_.value_.x_ > 0.0f || i->second_.value_.y_ > 0.0f || i->second_.value_.z_ > 0.0f;
     else
         specular_ = false;
 }

+ 4 - 4
SourceAssets/GLSLShaders/ForwardLit.frag

@@ -85,12 +85,12 @@ void main()
 
     #ifdef SPECULAR
         #ifdef SPECMAP
-            float specStrength = cMatSpecProperties.x * texture2D(sSpecMap, vTexCoord.xy).g;
+            vec3 specColor = cMatSpecColor.rgb * texture2D(sSpecMap, vTexCoord.xy).g;
         #else
-            float specStrength = cMatSpecProperties.x;
+            vec3 specColor = cMatSpecColor.rgb;
         #endif
-        float spec = GetSpecular(normal, vEyeVec, lightDir, cMatSpecProperties.y);
-        finalColor = diff * lightColor * (diffColor.rgb + spec * specStrength * cLightColor.a);
+        float spec = GetSpecular(normal, vEyeVec, lightDir, cMatSpecColor.a);
+        finalColor = diff * lightColor * (diffColor.rgb + spec * specColor * cLightColor.a);
     #else
         finalColor = diff * lightColor * diffColor.rgb;
     #endif

+ 1 - 1
SourceAssets/GLSLShaders/GBuffer.frag

@@ -27,7 +27,7 @@ void main()
         vec3 normal = normalize(vNormal);
     #endif
 
-    float specPower = cMatSpecProperties.y / 255.0;
+    float specPower = cMatSpecColor.a / 255.0;
 
     #ifdef HWDEPTH
         gl_FragColor = vec4(normal * 0.5 + 0.5, specPower);

+ 2 - 2
SourceAssets/GLSLShaders/Lighting.frag

@@ -49,11 +49,11 @@ float GetShadow(vec4 shadowPos)
             shadow2DProj(sShadowMap, vec4(shadowPos.x, shadowPos.y + offsets.y, shadowPos.zw)).r,
             shadow2DProj(sShadowMap, vec4(shadowPos.xy + offsets.xy, shadowPos.zw)).r
         );
-        return cShadowIntensity.z + dot(inLight, vec4(cShadowIntensity.y));
+        return cShadowIntensity.y + dot(inLight, vec4(cShadowIntensity.x));
     #else
         // Take one sample
         float inLight = shadow2DProj(sShadowMap, shadowPos).r;
-        return cShadowIntensity.z + cShadowIntensity.x * inLight;
+        return cShadowIntensity.y + cShadowIntensity.x * inLight;
     #endif
 }
 

+ 3 - 3
SourceAssets/GLSLShaders/Material.frag

@@ -24,15 +24,15 @@ void main()
     #endif
 
     #ifdef SPECMAP
-        float specIntensity = cMatSpecProperties.x * texture2D(sSpecMap, vTexCoord.xy).g;
+        vec3 specColor = cMatSpecColor.rgb * texture2D(sSpecMap, vTexCoord.xy).g;
     #else
-        float specIntensity = cMatSpecProperties.x;
+        vec3 specColor = cMatSpecColor.rgb;
     #endif
 
     // Lights are accumulated at half intensity. Bring back to full intensity now
     vec4 lightInput = 2.0 * texture2DProj(sLightBuffer, vScreenPos);
     vec3 lightSpecColor = lightInput.a * max(lightInput.rgb / GetIntensity(lightInput.rgb), vec3(0.0, 0.0, 0.0));
 
-    vec3 finalColor = (vVertexLighting + lightInput.rgb) * diffColor + lightSpecColor * specIntensity;
+    vec3 finalColor = (vVertexLighting + lightInput.rgb) * diffColor + lightSpecColor * specColor;
     gl_FragColor = vec4(GetFog(finalColor, vTexCoord.z), 1.0);
 }

+ 3 - 2
SourceAssets/GLSLShaders/Uniforms.frag

@@ -8,10 +8,11 @@ uniform vec3 cLightDirPS;
 uniform vec4 cLightPosPS;
 uniform vec4 cMatDiffColor;
 uniform vec3 cMatEmissiveColor;
-uniform vec2 cMatSpecProperties;
+uniform vec3 cMatEnvMapColor;
+uniform vec4 cMatSpecColor;
 uniform vec2 cSampleOffsets;
 uniform vec4 cShadowCubeAdjust;
 uniform vec4 cShadowDepthFade;
-uniform vec4 cShadowIntensity;
+uniform vec3 cShadowIntensity;
 uniform vec4 cShadowSplits;
 uniform mat4 cLightMatricesPS[4];

+ 4 - 4
SourceAssets/HLSLShaders/ForwardLit.hlsl

@@ -192,12 +192,12 @@ void PS(float3 iTexCoord : TEXCOORD0,
 
     #ifdef SPECULAR
         #ifdef SPECMAP
-            float specStrength = cMatSpecProperties.x * tex2D(sSpecMap, iTexCoord.xy).g;
+            float3 specColor = cMatSpecColor.rgb * tex2D(sSpecMap, iTexCoord.xy).g;
         #else
-            float specStrength = cMatSpecProperties.x;
+            float3 specColor = cMatSpecColor.rgb;
         #endif
-        float spec = GetSpecular(normal, iEyeVec, lightDir, cMatSpecProperties.y);
-        finalColor = diff * lightColor * (diffColor.rgb + spec * specStrength * cLightColor.a);
+        float spec = GetSpecular(normal, iEyeVec, lightDir, cMatSpecColor.a);
+        finalColor = diff * lightColor * (diffColor.rgb + spec * specColor * cLightColor.a);
     #else
         finalColor = diff * lightColor * diffColor.rgb;
     #endif

+ 1 - 1
SourceAssets/HLSLShaders/GBuffer.hlsl

@@ -72,7 +72,7 @@ void PS(
         float3 normal = normalize(iNormal);
     #endif
 
-    float specPower = cMatSpecProperties.y / 255.0;
+    float specPower = cMatSpecColor.a / 255.0;
 
     oNormal = float4(normal * 0.5 + 0.5, specPower);
     #ifndef HWDEPTH

+ 28 - 25
SourceAssets/HLSLShaders/Lighting.hlsl

@@ -105,24 +105,24 @@ float GetShadow(float4 shadowPos)
                 tex2Dproj(sShadowMap, float4(shadowPos.xy + offsets.xy, shadowPos.zw)).r
             );
             #ifdef HWSHADOW
-                return cShadowIntensity.z + dot(inLight, cShadowIntensity.y);
+                return cShadowIntensity.y + dot(inLight, cShadowIntensity.x);
             #else
                 #ifndef POINTLIGHT
-                    return cShadowIntensity.z + dot(inLight * shadowPos.w > shadowPos.z, cShadowIntensity.y);
+                    return cShadowIntensity.y + dot(inLight * shadowPos.w > shadowPos.z, cShadowIntensity.x);
                 #else
-                    return cShadowIntensity.z + dot(inLight > shadowPos.z, cShadowIntensity.y);
+                    return cShadowIntensity.y + dot(inLight > shadowPos.z, cShadowIntensity.x);
                 #endif
             #endif
         #else
             // Take one sample
             float inLight = tex2Dproj(sShadowMap, shadowPos).r;
             #ifdef HWSHADOW
-                return cShadowIntensity.z + cShadowIntensity.x * inLight;
+                return cShadowIntensity.y + cShadowIntensity.x * inLight;
             #else
                 #ifndef POINTLIGHT
-                    return cShadowIntensity.z + cShadowIntensity.x * (inLight * shadowPos.w > shadowPos.z);
+                    return cShadowIntensity.y + cShadowIntensity.x * (inLight * shadowPos.w > shadowPos.z);
                 #else
-                    return cShadowIntensity.z + cShadowIntensity.x * (inLight > shadowPos.z);
+                    return cShadowIntensity.y + cShadowIntensity.x * (inLight > shadowPos.z);
                 #endif
             #endif
         #endif
@@ -138,9 +138,9 @@ float GetShadow(float4 shadowPos)
             DecodeDepth(tex2Dproj(sShadowMap, float4(shadowPos.x + offsets.x, shadowPos.yzw)).rg)
         );
         #ifndef POINTLIGHT
-            return cShadowIntensity.z + dot(inLight * shadowPos.w > shadowPos.z, cShadowIntensity.y);
+            return cShadowIntensity.y + dot(inLight * shadowPos.w > shadowPos.z, cShadowIntensity.x);
         #else
-            return cShadowIntensity.z + dot(inLight > shadowPos.z, cShadowIntensity.y);
+            return cShadowIntensity.y + dot(inLight > shadowPos.z, cShadowIntensity.x);
         #endif
     #endif
 }
@@ -182,24 +182,27 @@ float4 GetDirShadowPos(const float4 iShadowPos[4], float depth)
         return iShadowPos[3];
 }
 
+#ifdef SM3
 float4x4 GetDirShadowMatrix(float depth, const float4x4 matrices[4])
 {
-    #ifdef SM3
-        if (depth < cShadowSplits.x)
-            return matrices[0];
-        else if (depth < cShadowSplits.y)
-            return matrices[1];
-        else if (depth < cShadowSplits.z)
-            return matrices[2];
-        else
-            return matrices[3];
-    #else
-        if (depth < cShadowSplits.x)
-            return matrices[0];
-        else if (depth < cShadowSplits.y)
-            return matrices[1];
-        else
-            return matrices[2];
-    #endif
+    if (depth < cShadowSplits.x)
+        return matrices[0];
+    else if (depth < cShadowSplits.y)
+        return matrices[1];
+    else if (depth < cShadowSplits.z)
+        return matrices[2];
+    else
+        return matrices[3];
+}
+#else
+float4x4 GetDirShadowMatrix(float depth, const float4x4 matrices[3])
+{
+    if (depth < cShadowSplits.x)
+        return matrices[0];
+    else if (depth < cShadowSplits.y)
+        return matrices[1];
+    else
+        return matrices[2];
 }
 #endif
+#endif

+ 3 - 3
SourceAssets/HLSLShaders/Material.hlsl

@@ -65,15 +65,15 @@ void PS(float3 iTexCoord : TEXCOORD0,
     #endif
 
     #ifdef SPECMAP
-        float specIntensity = cMatSpecProperties.x * tex2D(sSpecMap, iTexCoord.xy).g;
+        float3 specColor = cMatSpecColor.rgb * tex2D(sSpecMap, iTexCoord.xy).g;
     #else
-        float specIntensity = cMatSpecProperties.x;
+        float3 specColor = cMatSpecColor.rgb;
     #endif
 
     // Lights are accumulated at half intensity. Bring back to full intensity now
     float4 lightInput = 2.0 * tex2Dproj(sLightBuffer, iScreenPos);
     float3 lightSpecColor = lightInput.a * (lightInput.rgb / GetIntensity(lightInput.rgb));
 
-    float3 finalColor = (iVertexLighting + lightInput.rgb) * diffColor + lightSpecColor * specIntensity;
+    float3 finalColor = (iVertexLighting + lightInput.rgb) * diffColor + lightSpecColor * specColor;
     oColor = float4(GetFog(finalColor, iTexCoord.z), 1.0);
 }

+ 1 - 1
SourceAssets/HLSLShaders/Shadow.hlsl

@@ -47,7 +47,7 @@ void PS(
     #endif
 
     #ifdef FALLBACK
-        float depth = min(iClipPos.z / iClipPos.w + cShadowIntensity.w, 1.0);
+        float depth = min(iClipPos.z / iClipPos.w + cShadowIntensity.z, 1.0);
         oColor = float4(EncodeDepth(depth), 1.0, alpha);
     #else
         oColor = alpha;

+ 14 - 9
SourceAssets/HLSLShaders/Uniforms.hlsl

@@ -1,4 +1,4 @@
-// Vertex shader parameters
+// Vertex shader uniforms
 uniform float3 cAmbientStartColor : register(C0);
 uniform float3 cAmbientEndColor : register(C1);
 uniform float3 cCameraPos : register(C2);
@@ -19,7 +19,7 @@ uniform float4x4 cLightMatrices[4] : register(C25);
 uniform float4x3 cSkinMatrices[64] : register(C41);
 uniform float4 cVertexLights[6*3] : register(C233);
 
-// Pixel shader parameters
+// Pixel shader uniforms
 uniform float3 cAmbientColor : register(C0);
 uniform float2 cDepthReconstruct : register(C1);
 uniform float3 cEdgeFilterParams : register(C2);
@@ -30,10 +30,15 @@ uniform float4 cLightPosPS : register(C6);
 uniform float3 cLightDirPS : register(C7);
 uniform float4 cMatDiffColor : register(C8);
 uniform float3 cMatEmissiveColor : register(C9);
-uniform float2 cMatSpecProperties : register(C10);
-uniform float2 cSampleOffsets : register(C11);
-uniform float4 cShadowCubeAdjust : register(C12);
-uniform float4 cShadowDepthFade : register(C13);
-uniform float4 cShadowIntensity : register(C14);
-uniform float4 cShadowSplits : register(C15);
-uniform float4x4 cLightMatricesPS[4] :  register(C16);
+uniform float3 cMatEnvMapColor : register(C10);
+uniform float4 cMatSpecColor : register(C11);
+uniform float2 cSampleOffsets : register(C12);
+uniform float4 cShadowCubeAdjust : register(C13);
+uniform float4 cShadowDepthFade : register(C14);
+uniform float3 cShadowIntensity : register(C15);
+uniform float4 cShadowSplits : register(C16);
+#ifdef SM3
+    uniform float4x4 cLightMatricesPS[4] : register(C17);
+#else
+    uniform float4x4 cLightMatricesPS[3] : register(C17);
+#endif