Browse Source

Fixed batch state sorting.
Tidied up lighting shader #ifdefs.

Lasse Öörni 14 years ago
parent
commit
af890623a8

+ 2 - 2
Engine/Graphics/Batch.cpp

@@ -43,13 +43,13 @@ inline bool CompareBatchesFrontToBack(Batch* lhs, Batch* rhs)
     if (lhs->sortKey_ == rhs->sortKey_)
         return lhs->distance_ < rhs->distance_;
     else
-        return lhs->sortKey_ < rhs->sortKey_;
+        return lhs->sortKey_ > rhs->sortKey_;
 }
 
 inline bool CompareBatchesBackToFront(Batch* lhs, Batch* rhs)
 {
     if (lhs->distance_ == rhs->distance_)
-        return lhs->sortKey_ < rhs->sortKey_;
+        return lhs->sortKey_ > rhs->sortKey_;
     else
         return lhs->distance_ > rhs->distance_;
 }

+ 31 - 39
SourceAssets/GLSLShaders/Forward.frag

@@ -48,7 +48,7 @@ void main()
         vec4 normalInput = texture2D(sNormalMap, vTexCoord);
     #endif
 
-    #if (!defined(VOLUMETRIC)) && ((defined(DIRLIGHT)) || (defined(POINTLIGHT)) || (defined(SPOTLIGHT)))
+    #if !defined(VOLUMETRIC) && defined(LIGHT)
 
         vec3 lightColor;
         vec3 lightDir;
@@ -117,52 +117,44 @@ void main()
             gl_FragColor = vec4(GetLitFog(finalColor, vLightVec.w), diffColor.a);
         #endif
 
-    #else
-
-        #if (defined(VOLUMETRIC)) && ((defined(DIRLIGHT)) || (defined(POINTLIGHT)) || (defined(SPOTLIGHT)))
-
-            vec3 lightColor;
-            vec3 lightVec;
-            float diff;
-
-            #ifdef DIRLIGHT
-                diff = GetDiffuseDirVolumetric();
-            #else
-                diff = GetDiffusePointOrSpotVolumetric(vLightVec.xyz);
-            #endif
-
-            #if defined(SPOTLIGHT)
-                lightColor = vSpotPos.w > 0.0 ? texture2DProj(sLightSpotMap, vSpotPos).rgb * cLightColor.rgb : vec3(0.0, 0.0, 0.0);
-            #elif defined(CUBEMASK)
-                lightColor = textureCube(sLightCubeMap, vCubeMaskVec).rgb * cLightColor.rgb;
-            #else
-                lightColor = cLightColor.rgb;
-            #endif
+    #elif defined(VOLUMETRIC) && defined(LIGHT)
 
-            vec3 finalColor = diff * lightColor * diffColor.rgb;
+        vec3 lightColor;
+        vec3 lightVec;
+        float diff;
 
-            #ifdef AMBIENT
-                finalColor += cAmbientColor * diffColor.rgb;
-                gl_FragColor = vec4(GetFog(finalColor, vLightVec.w), diffColor.a);
-            #else
-                gl_FragColor = vec4(GetLitFog(finalColor, vLightVec.w), diffColor.a);
-            #endif
+        #ifdef DIRLIGHT
+            diff = GetDiffuseDirVolumetric();
+        #else
+            diff = GetDiffusePointOrSpotVolumetric(vLightVec.xyz);
+        #endif
 
+        #if defined(SPOTLIGHT)
+            lightColor = vSpotPos.w > 0.0 ? texture2DProj(sLightSpotMap, vSpotPos).rgb * cLightColor.rgb : vec3(0.0, 0.0, 0.0);
+        #elif defined(CUBEMASK)
+            lightColor = textureCube(sLightCubeMap, vCubeMaskVec).rgb * cLightColor.rgb;
         #else
+            lightColor = cLightColor.rgb;
+        #endif
 
-            #ifdef UNLIT
-                gl_FragColor = vec4(GetFog(diffColor.rgb, vLightVec.w), diffColor.a);
-            #endif
+        vec3 finalColor = diff * lightColor * diffColor.rgb;
 
-            #ifdef ADDITIVE
-                gl_FragColor = vec4(GetLitFog(diffColor.rgb, vLightVec.w), diffColor.a);
-            #endif
+        #ifdef AMBIENT
+            finalColor += cAmbientColor * diffColor.rgb;
+            gl_FragColor = vec4(GetFog(finalColor, vLightVec.w), diffColor.a);
+        #else
+            gl_FragColor = vec4(GetLitFog(finalColor, vLightVec.w), diffColor.a);
+        #endif
 
-            #ifdef AMBIENT
-                vec3 finalColor = cAmbientColor * diffColor.rgb;
-                gl_FragColor = vec4(GetFog(finalColor, vLightVec.w), diffColor.a);
-            #endif
+    #else
 
+        #if defined(UNLIT)
+            gl_FragColor = vec4(GetFog(diffColor.rgb, vLightVec.w), diffColor.a);
+        #elif defined(ADDITIVE)
+            gl_FragColor = vec4(GetLitFog(diffColor.rgb, vLightVec.w), diffColor.a);
+        #elif defined(AMBIENT)
+            vec3 finalColor = cAmbientColor * diffColor.rgb;
+            gl_FragColor = vec4(GetFog(finalColor, vLightVec.w), diffColor.a);
         #endif
 
     #endif

+ 30 - 38
SourceAssets/HLSLShaders/Forward.hlsl

@@ -195,7 +195,7 @@ void PS(float2 iTexCoord : TEXCOORD0,
         float4 normalInput = tex2D(sNormalMap, iTexCoord);
     #endif
 
-    #if !defined(VOLUMETRIC) && (defined(DIRLIGHT) || defined(POINTLIGHT) || defined(SPOTLIGHT))
+    #if !defined(VOLUMETRIC) && defined(LIGHT)
 
         float3 lightColor;
         float3 lightDir;
@@ -264,51 +264,43 @@ void PS(float2 iTexCoord : TEXCOORD0,
             oColor = float4(GetLitFog(finalColor, iLightVec.w), diffColor.a);
         #endif
 
-    #else
-
-        #if defined(VOLUMETRIC) && (defined(DIRLIGHT) || defined(POINTLIGHT) || defined(SPOTLIGHT))
-
-            float3 lightColor;
-            float diff;
-
-            #ifdef DIRLIGHT
-                diff = GetDiffuseDirVolumetric();
-            #else
-                diff = GetDiffusePointOrSpotVolumetric(iLightVec.xyz);
-            #endif
-
-            #if defined(SPOTLIGHT)
-                lightColor = iSpotPos.w > 0.0 ? tex2Dproj(sLightSpotMap, iSpotPos).rgb * cLightColor.rgb : 0.0;
-            #elif defined(CUBEMASK)
-                lightColor = texCUBE(sLightCubeMap, iCubeMaskVec).rgb * cLightColor.rgb;
-            #else
-                lightColor = cLightColor.rgb;
-            #endif
+    #elif defined(VOLUMETRIC) && defined(LIGHT)
 
-            float3 finalColor = diff * lightColor * diffColor.rgb;
+        float3 lightColor;
+        float diff;
 
-            #ifdef AMBIENT
-                finalColor += cAmbientColor * diffColor.rgb;
-                oColor = float4(GetFog(finalColor, iLightVec.w), diffColor.a);
-            #else
-                oColor = float4(GetLitFog(finalColor, iLightVec.w), diffColor.a);
-            #endif
+        #ifdef DIRLIGHT
+            diff = GetDiffuseDirVolumetric();
+        #else
+            diff = GetDiffusePointOrSpotVolumetric(iLightVec.xyz);
+        #endif
 
+        #if defined(SPOTLIGHT)
+            lightColor = iSpotPos.w > 0.0 ? tex2Dproj(sLightSpotMap, iSpotPos).rgb * cLightColor.rgb : 0.0;
+        #elif defined(CUBEMASK)
+            lightColor = texCUBE(sLightCubeMap, iCubeMaskVec).rgb * cLightColor.rgb;
         #else
+            lightColor = cLightColor.rgb;
+        #endif
 
-            #ifdef UNLIT
-                oColor = float4(GetFog(diffColor.rgb, iLightVec.w), diffColor.a);
-            #endif
+        float3 finalColor = diff * lightColor * diffColor.rgb;
 
-            #ifdef ADDITIVE
-                oColor = float4(GetLitFog(diffColor.rgb, iLightVec.w), diffColor.a);
-            #endif
+        #ifdef AMBIENT
+            finalColor += cAmbientColor * diffColor.rgb;
+            oColor = float4(GetFog(finalColor, iLightVec.w), diffColor.a);
+        #else
+            oColor = float4(GetLitFog(finalColor, iLightVec.w), diffColor.a);
+        #endif
 
-            #ifdef AMBIENT
-                float3 finalColor = cAmbientColor * diffColor.rgb;
-                oColor = float4(GetFog(finalColor, iLightVec.w), diffColor.a);
-            #endif
+    #else
 
+        #if defined(UNLIT)
+            oColor = float4(GetFog(diffColor.rgb, iLightVec.w), diffColor.a);
+        #elif defined(ADDITIVE)
+            oColor = float4(GetLitFog(diffColor.rgb, iLightVec.w), diffColor.a);
+        #elif defined(AMBIENT)
+            float3 finalColor = cAmbientColor * diffColor.rgb;
+            oColor = float4(GetFog(finalColor, iLightVec.w), diffColor.a);
         #endif
 
     #endif