瀏覽代碼

Shader refactoring. Renamed the lit object ubershader as LitSolid; it now handles also deferred rendering.
Reduced max. vertex light count to 4 to prevent excessive shader permutations.

Lasse Öörni 13 年之前
父節點
當前提交
e8d549ef7e
共有 58 個文件被更改,包括 1061 次插入1545 次删除
  1. 0 31
      Bin/CoreData/Shaders/GLSL/Ambient.frag
  2. 0 28
      Bin/CoreData/Shaders/GLSL/Ambient.vert
  3. 0 21
      Bin/CoreData/Shaders/GLSL/Ambient.xml
  4. 0 51
      Bin/CoreData/Shaders/GLSL/Deferred.frag
  5. 0 39
      Bin/CoreData/Shaders/GLSL/Deferred.vert
  6. 0 23
      Bin/CoreData/Shaders/GLSL/Deferred.xml
  7. 0 109
      Bin/CoreData/Shaders/GLSL/ForwardLit.frag
  8. 0 96
      Bin/CoreData/Shaders/GLSL/ForwardLit.vert
  9. 0 29
      Bin/CoreData/Shaders/GLSL/ForwardLit.xml
  10. 41 33
      Bin/CoreData/Shaders/GLSL/Lighting.vert
  11. 41 30
      Bin/CoreData/Shaders/GLSL/LitParticle.frag
  12. 35 19
      Bin/CoreData/Shaders/GLSL/LitParticle.vert
  13. 31 8
      Bin/CoreData/Shaders/GLSL/LitParticle.xml
  14. 168 0
      Bin/CoreData/Shaders/GLSL/LitSolid.frag
  15. 120 0
      Bin/CoreData/Shaders/GLSL/LitSolid.vert
  16. 56 0
      Bin/CoreData/Shaders/GLSL/LitSolid.xml
  17. 0 42
      Bin/CoreData/Shaders/GLSL/Material.frag
  18. 0 31
      Bin/CoreData/Shaders/GLSL/Material.vert
  19. 0 21
      Bin/CoreData/Shaders/GLSL/Material.xml
  20. 0 38
      Bin/CoreData/Shaders/GLSL/Prepass.frag
  21. 0 31
      Bin/CoreData/Shaders/GLSL/Prepass.vert
  22. 0 13
      Bin/CoreData/Shaders/GLSL/Prepass.xml
  23. 1 3
      Bin/CoreData/Shaders/GLSL/Shadow.frag
  24. 2 7
      Bin/CoreData/Shaders/GLSL/Shadow.vert
  25. 0 1
      Bin/CoreData/Shaders/GLSL/Shadow.xml
  26. 1 1
      Bin/CoreData/Shaders/GLSL/Uniforms.vert
  27. 0 76
      Bin/CoreData/Shaders/HLSL/Ambient.hlsl
  28. 0 22
      Bin/CoreData/Shaders/HLSL/Ambient.xml
  29. 0 117
      Bin/CoreData/Shaders/HLSL/Deferred.hlsl
  30. 0 26
      Bin/CoreData/Shaders/HLSL/Deferred.xml
  31. 0 216
      Bin/CoreData/Shaders/HLSL/ForwardLit.hlsl
  32. 0 31
      Bin/CoreData/Shaders/HLSL/ForwardLit.xml
  33. 44 35
      Bin/CoreData/Shaders/HLSL/Lighting.hlsl
  34. 69 48
      Bin/CoreData/Shaders/HLSL/LitParticle.hlsl
  35. 31 8
      Bin/CoreData/Shaders/HLSL/LitParticle.xml
  36. 311 0
      Bin/CoreData/Shaders/HLSL/LitSolid.hlsl
  37. 58 0
      Bin/CoreData/Shaders/HLSL/LitSolid.xml
  38. 0 86
      Bin/CoreData/Shaders/HLSL/Material.hlsl
  39. 0 22
      Bin/CoreData/Shaders/HLSL/Material.xml
  40. 0 81
      Bin/CoreData/Shaders/HLSL/Prepass.hlsl
  41. 0 14
      Bin/CoreData/Shaders/HLSL/Prepass.xml
  42. 4 11
      Bin/CoreData/Shaders/HLSL/Shadow.hlsl
  43. 0 1
      Bin/CoreData/Shaders/HLSL/Shadow.xml
  44. 1 1
      Bin/CoreData/Shaders/HLSL/Uniforms.hlsl
  45. 6 6
      Bin/CoreData/Techniques/Diff.xml
  46. 2 2
      Bin/CoreData/Techniques/DiffAlpha.xml
  47. 7 7
      Bin/CoreData/Techniques/DiffAlphaMask.xml
  48. 1 1
      Bin/CoreData/Techniques/DiffLitParticleAlpha.xml
  49. 6 6
      Bin/CoreData/Techniques/DiffNormal.xml
  50. 2 2
      Bin/CoreData/Techniques/DiffNormalAlpha.xml
  51. 7 7
      Bin/CoreData/Techniques/DiffNormalAlphaMask.xml
  52. 6 6
      Bin/CoreData/Techniques/NoTexture.xml
  53. 2 2
      Bin/CoreData/Techniques/NoTextureAlpha.xml
  54. 1 1
      Docs/Reference.dox
  55. 1 1
      Engine/Graphics/Drawable.h
  56. 0 1
      Engine/Graphics/Renderer.cpp
  57. 0 2
      Engine/Graphics/Renderer.h
  58. 6 1
      Tools/ShaderCompiler/ShaderCompiler.cpp

+ 0 - 31
Bin/CoreData/Shaders/GLSL/Ambient.frag

@@ -1,31 +0,0 @@
-#include "Uniforms.frag"
-#include "Samplers.frag"
-#include "Fog.frag"
-#include "Lighting.frag"
-
-varying vec2 vTexCoord;
-#ifdef VERTEXCOLOR
-    varying vec4 vColor;
-#endif
-varying vec4 vVertexLighting;
-
-void main()
-{
-    #ifdef DIFFMAP
-        vec4 diffInput = texture2D(sDiffMap, vTexCoord);
-        #ifdef ALPHAMASK
-            if (diffInput.a < 0.5)
-                discard;
-        #endif
-        vec4 diffColor = cMatDiffColor * diffInput;
-    #else
-        vec4 diffColor = cMatDiffColor;
-    #endif
-
-    #ifdef VERTEXCOLOR
-        diffColor *= vColor;
-    #endif
-
-    vec3 finalColor = vVertexLighting.rgb * diffColor.rgb;
-    gl_FragColor = vec4(GetFog(finalColor, vVertexLighting.a), diffColor.a);
-}

+ 0 - 28
Bin/CoreData/Shaders/GLSL/Ambient.vert

@@ -1,28 +0,0 @@
-#include "Uniforms.vert"
-#include "Transform.vert"
-#include "Lighting.vert"
-
-varying vec2 vTexCoord;
-#ifdef VERTEXCOLOR
-    varying vec4 vColor;
-#endif
-varying vec4 vVertexLighting;
-
-void main()
-{
-    mat4 modelMatrix = iModelMatrix;
-    vec3 worldPos = GetWorldPos(modelMatrix);
-    gl_Position = GetClipPos(worldPos);
-    vTexCoord = GetTexCoord(iTexCoord);
-
-    vVertexLighting = vec4(GetAmbient(GetZonePos(worldPos)), GetDepth(gl_Position));
-    #ifdef NUMVERTEXLIGHTS
-    vec3 normal = GetWorldNormal(modelMatrix);
-    for (int i = 0; i < NUMVERTEXLIGHTS; ++i)
-        vVertexLighting.rgb += GetVertexLight(i, worldPos, normal) * cVertexLights[i * 3].rgb;
-    #endif
-
-    #ifdef VERTEXCOLOR
-        vColor = iColor;
-    #endif
-}

+ 0 - 21
Bin/CoreData/Shaders/GLSL/Ambient.xml

@@ -1,21 +0,0 @@
-<shaders>
-    <shader type="vs">
-        <option name="VCol" define="VERTEXCOLOR" />
-        <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="Billboard" define="BILLBOARD" />
-    </shader>
-    <shader type="ps">
-        <option name="Diff" define="DIFFMAP" />
-        <option name="AlphaMask" define="ALPHAMASK" require="DIFFMAP" />
-        <option name="VCol" define="VERTEXCOLOR" />
-    </shader>
-</shaders>

+ 0 - 51
Bin/CoreData/Shaders/GLSL/Deferred.frag

@@ -1,51 +0,0 @@
-#include "Uniforms.frag"
-#include "Samplers.frag"
-#include "Fog.frag"
-
-varying vec2 vTexCoord;
-varying vec4 vVertexLighting;
-varying vec3 vNormal;
-#ifdef NORMALMAP
-    varying vec3 vTangent;
-    varying vec3 vBitangent;
-#endif
-
-void main()
-{
-    #ifdef DIFFMAP
-        vec4 diffInput = texture2D(sDiffMap, vTexCoord);
-        #ifdef ALPHAMASK
-            if (diffInput.a < 0.5)
-                discard;
-        #endif
-        vec3 diffColor = cMatDiffColor.rgb * diffInput.rgb;
-    #else
-        vec3 diffColor = cMatDiffColor.rgb;
-    #endif
-
-    #ifdef VERTEXCOLOR
-        diffColor *= vColor.rgb;
-    #endif
-
-    #ifdef NORMALMAP
-        mat3 tbn = mat3(vTangent, vBitangent, vNormal);
-        vec3 normal = tbn * DecodeNormal(texture2D(sNormalMap, vTexCoord));
-    #else
-        vec3 normal = vNormal;
-    #endif
-
-    #ifdef SPECMAP
-        float specIntensity = cMatSpecColor.g * texture2D(sSpecMap, vTexCoord).g;
-    #else
-        float specIntensity = cMatSpecColor.g;
-    #endif
-
-    float specPower = cMatSpecColor.a / 255.0;
-
-    gl_FragData[0] = vec4(GetFog(vVertexLighting.rgb * diffColor, vVertexLighting.a), 1.0);
-    gl_FragData[1] = GetFogFactor(vVertexLighting.a) * vec4(diffColor, specIntensity);
-    gl_FragData[2] = vec4(normal * 0.5 + 0.5, specPower);
-    #ifndef HWDEPTH
-        gl_FragData[3] = vec4(EncodeDepth(vVertexLighting.a), 0.0);
-    #endif
-}

+ 0 - 39
Bin/CoreData/Shaders/GLSL/Deferred.vert

@@ -1,39 +0,0 @@
-#include "Uniforms.vert"
-#include "Transform.vert"
-#include "Lighting.vert"
-
-varying vec2 vTexCoord;
-#ifdef VERTEXCOLOR
-    varying vec4 vColor;
-#endif
-varying vec4 vVertexLighting;
-varying vec3 vNormal;
-#ifdef NORMALMAP
-    varying vec3 vTangent;
-    varying vec3 vBitangent;
-#endif
-
-void main()
-{
-    mat4 modelMatrix = iModelMatrix;
-    vec3 worldPos = GetWorldPos(modelMatrix);
-    gl_Position = GetClipPos(worldPos);
-    vTexCoord = GetTexCoord(iTexCoord);
-
-    vNormal = GetWorldNormal(modelMatrix);
-    #ifdef NORMALMAP
-        vTangent = GetWorldTangent(modelMatrix);
-        vBitangent = cross(vTangent, vNormal) * iTangent.w;
-    #endif
-    
-    vVertexLighting = vec4(GetAmbient(GetZonePos(worldPos)), GetDepth(gl_Position));
-    #ifdef NUMVERTEXLIGHTS
-    vec3 normal = GetWorldNormal(modelMatrix);
-    for (int i = 0; i < NUMVERTEXLIGHTS; ++i)
-        vVertexLighting.rgb += GetVertexLight(i, worldPos, normal) * cVertexLights[i * 3].rgb;
-    #endif
-    
-    #ifdef VERTEXCOLOR
-        vColor = iColor;
-    #endif
-}

+ 0 - 23
Bin/CoreData/Shaders/GLSL/Deferred.xml

@@ -1,23 +0,0 @@
-<shaders>
-    <shader type="vs">
-        <option name="Normal" define="NORMALMAP" />
-        <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" />
-    </shader>
-    <shader type="ps">
-        <option name="Diff" define="DIFFMAP" />
-        <option name="Normal" define="NORMALMAP" require="DIFFMAP" />
-        <option name="SpecMap" define="SPECMAP" require="DIFFMAP" />
-        <option name="AlphaMask" define="ALPHAMASK" require="DIFFMAP" />
-        <option name="HW" define="HWDEPTH" />
-    </shader>
-</shaders>

+ 0 - 109
Bin/CoreData/Shaders/GLSL/ForwardLit.frag

@@ -1,109 +0,0 @@
-#include "Uniforms.frag"
-#include "Samplers.frag"
-#include "Lighting.frag"
-#include "Fog.frag"
-
-varying vec2 vTexCoord;
-#ifdef VERTEXCOLOR
-    varying vec4 vColor;
-#endif
-varying vec4 vLightVec;
-#ifdef SPECULAR
-    varying vec3 vEyeVec;
-#endif
-#ifndef NORMALMAP
-    varying vec3 vNormal;
-#endif
-#ifdef SHADOW
-    #if defined(DIRLIGHT)
-        varying vec4 vShadowPos[4];
-    #elif defined(SPOTLIGHT)
-        varying vec4 vShadowPos;
-    #else
-        varying vec3 vShadowPos;
-    #endif
-#endif
-#ifdef SPOTLIGHT
-    varying vec4 vSpotPos;
-#endif
-#ifdef POINTLIGHT
-    varying vec3 vCubeMaskVec;
-#endif
-
-void main()
-{
-    #ifdef DIFFMAP
-        vec4 diffInput = texture2D(sDiffMap, vTexCoord);
-        #ifdef ALPHAMASK
-            if (diffInput.a < 0.5)
-                discard;
-        #endif
-        vec4 diffColor = cMatDiffColor * diffInput;
-    #else
-        vec4 diffColor = cMatDiffColor;
-    #endif
-
-    #ifdef VERTEXCOLOR
-        diffColor *= vColor;
-    #endif
-
-    vec3 lightColor;
-    vec3 lightDir;
-    vec3 finalColor;
-    float diff;
-
-    #ifdef NORMALMAP
-        vec3 normal = DecodeNormal(texture2D(sNormalMap, vTexCoord));
-    #else
-        vec3 normal = normalize(vNormal);
-    #endif
-
-    #ifdef DIRLIGHT
-        #ifdef NORMALMAP
-            lightDir = normalize(vLightVec.xyz);
-        #else
-            lightDir = vLightVec.xyz;
-        #endif
-        diff = GetDiffuseDir(normal, lightDir);
-    #else
-        diff = GetDiffusePointOrSpot(normal, vLightVec.xyz, lightDir);
-    #endif
-
-    #ifdef SHADOW
-        #if defined(DIRLIGHT)
-            vec4 shadowPos = GetDirShadowPos(vShadowPos, vLightVec.w);
-            diff *= min(GetShadow(shadowPos) + GetShadowFade(vLightVec.w), 1.0);
-        #elif defined(SPOTLIGHT)
-            diff *= GetShadow(vShadowPos);
-        #else
-            diff *= GetCubeShadow(vShadowPos);
-        #endif
-    #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 SPECULAR
-        #ifdef SPECMAP
-            vec3 specColor = cMatSpecColor.rgb * texture2D(sSpecMap, vTexCoord).g;
-        #else
-            vec3 specColor = cMatSpecColor.rgb;
-        #endif
-        float spec = GetSpecular(normal, vEyeVec, lightDir, cMatSpecColor.a);
-        finalColor = diff * lightColor * (diffColor.rgb + spec * specColor * cLightColor.a);
-    #else
-        finalColor = diff * lightColor * diffColor.rgb;
-    #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
-}

+ 0 - 96
Bin/CoreData/Shaders/GLSL/ForwardLit.vert

@@ -1,96 +0,0 @@
-#include "Uniforms.vert"
-#include "Transform.vert"
-
-varying vec2 vTexCoord;
-#ifdef VERTEXCOLOR
-    varying vec4 vColor;
-#endif
-varying vec4 vLightVec;
-#ifdef SPECULAR
-    varying vec3 vEyeVec;
-#endif
-#ifndef NORMALMAP
-    varying vec3 vNormal;
-#endif
-#ifdef SHADOW
-    #if defined(DIRLIGHT)
-        varying vec4 vShadowPos[4];
-    #elif defined(SPOTLIGHT)
-        varying vec4 vShadowPos;
-    #else
-        varying vec3 vShadowPos;
-    #endif
-#endif
-#ifdef SPOTLIGHT
-    varying vec4 vSpotPos;
-#endif
-#ifdef POINTLIGHT
-    varying vec3 vCubeMaskVec;
-#endif
-
-void main()
-{
-    mat4 modelMatrix = iModelMatrix;
-    vec3 worldPos = GetWorldPos(modelMatrix);
-    gl_Position = GetClipPos(worldPos);
-    vTexCoord = GetTexCoord(iTexCoord);
-
-    #ifdef VERTEXCOLOR
-        vColor = iColor;
-    #endif
-
-    #ifdef NORMALMAP
-        vec3 vNormal;
-        vec3 vTangent;
-        vec3 vBitangent;
-    #endif
-
-    vNormal = GetWorldNormal(modelMatrix);
-    vec4 projWorldPos = vec4(worldPos, 1.0);
-
-    #ifdef SHADOW
-        // Shadow projection: transform from world space to shadow space
-        #if defined(DIRLIGHT)
-            vShadowPos[0] = cLightMatrices[0] * projWorldPos;
-            vShadowPos[1] = cLightMatrices[1] * projWorldPos;
-            vShadowPos[2] = cLightMatrices[2] * projWorldPos;
-            vShadowPos[3] = cLightMatrices[3] * projWorldPos;
-        #elif defined(SPOTLIGHT)
-            vShadowPos = cLightMatrices[1] * projWorldPos;
-        #else
-            vShadowPos = worldPos - cLightPos.xyz;
-        #endif
-    #endif
-
-    #ifdef SPOTLIGHT
-        // Spotlight projection: transform from world space to projector texture coordinates
-        vSpotPos = cLightMatrices[0] * projWorldPos;
-    #endif
-
-    #ifdef POINTLIGHT
-        vCubeMaskVec = mat3(cLightMatrices[0][0].xyz, cLightMatrices[0][1].xyz, cLightMatrices[0][2].xyz) * (cLightPos.xyz - worldPos);
-    #endif
-
-    #ifdef NORMALMAP
-        vTangent = GetWorldTangent(modelMatrix);
-        vBitangent = cross(vTangent, vNormal) * iTangent.w;
-        mat3 tbn = mat3(vTangent, vBitangent, vNormal);
-        #ifdef DIRLIGHT
-            vLightVec = vec4(cLightDir * tbn, GetDepth(gl_Position));
-        #else
-            vLightVec = vec4((cLightPos.xyz - worldPos) * tbn * cLightPos.w, GetDepth(gl_Position));
-        #endif
-        #ifdef SPECULAR
-            vEyeVec = (cCameraPos - worldPos) * tbn;
-        #endif
-    #else
-        #ifdef DIRLIGHT
-            vLightVec = vec4(cLightDir, GetDepth(gl_Position));
-        #else
-            vLightVec = vec4((cLightPos.xyz - worldPos) * cLightPos.w, GetDepth(gl_Position));
-        #endif
-        #ifdef SPECULAR
-            vEyeVec = cCameraPos - worldPos;
-        #endif
-    #endif
-}

+ 0 - 29
Bin/CoreData/Shaders/GLSL/ForwardLit.xml

@@ -1,29 +0,0 @@
-<shaders>
-    <shader type="vs">
-        <option name="Normal" define="NORMALMAP" />
-        <option name="VCol" define="VERTEXCOLOR" />
-        <variation name="Dir" define="DIRLIGHT" />
-        <variation name="Spot" define="SPOTLIGHT" />
-        <variation name="Point" define="POINTLIGHT" />
-        <option name="Spec" define="SPECULAR" />
-        <option name="Shadow" define="SHADOW" />
-        <variation name="" />
-        <variation name="Skinned" define="SKINNED" />
-        <variation name="Billboard" define="BILLBOARD" />
-    </shader>
-    <shader type="ps">
-        <option name="Diff" define="DIFFMAP" />
-        <option name="Normal" define="NORMALMAP" require="DIFFMAP" />
-        <option name="SpecMap" define="SPECMAP" require="DIFFMAP" />
-        <option name="AlphaMask" define="ALPHAMASK" require="DIFFMAP" />           
-        <option name="VCol" define="VERTEXCOLOR" />
-        <option name="Ambient" define="AMBIENT" />
-        <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="SHADOW" />
-    </shader>
-</shaders>

+ 41 - 33
Bin/CoreData/Shaders/GLSL/Lighting.vert

@@ -13,38 +13,46 @@ float GetVertexLight(int index, vec3 worldPos, vec3 normal)
     float invCutoff = cVertexLights[index * 3 + 2].w;
 
     // Directional light
-    #ifndef BILLBOARD
-        if (invRange == 0.0)
-        {
-            float NdotL = max(dot(normal, lightDir), 0.0);
-            return NdotL;
-        }
-        // Point/spot light
-        else
-        {
-            vec3 lightVec = (lightPos - worldPos) * invRange;
-            float lightDist = length(lightVec);
-            vec3 localDir = lightVec / lightDist;
-            float NdotL = max(dot(normal, localDir), 0.0);
-            float atten = clamp(1.0 - lightDist * lightDist, 0.0, 1.0);
-            float spotEffect = dot(localDir, lightDir);
-            float spotAtten = clamp((spotEffect - cutoff) * invCutoff, 0.0, 1.0);
-            return NdotL * atten * spotAtten;
-        }
-    #else
-        if (invRange == 0.0)
-            return 1.0;
-        // Point/spot light
-        else
-        {
-            vec3 lightVec = (lightPos - worldPos) * invRange;
-            float lightDist = length(lightVec);
-            vec3 localDir = lightVec / lightDist;
-            float atten = clamp(1.0 - lightDist * lightDist, 0.0, 1.0);
-            float spotEffect = dot(localDir, lightDir);
-            float spotAtten = clamp((spotEffect - cutoff) * invCutoff, 0.0, 1.0);
-            return atten * spotAtten;
-        }
-    #endif
+    if (invRange == 0.0)
+    {
+        float NdotL = max(dot(normal, lightDir), 0.0);
+        return NdotL;
+    }
+    // Point/spot light
+    else
+    {
+        vec3 lightVec = (lightPos - worldPos) * invRange;
+        float lightDist = length(lightVec);
+        vec3 localDir = lightVec / lightDist;
+        float NdotL = max(dot(normal, localDir), 0.0);
+        float atten = clamp(1.0 - lightDist * lightDist, 0.0, 1.0);
+        float spotEffect = dot(localDir, lightDir);
+        float spotAtten = clamp((spotEffect - cutoff) * invCutoff, 0.0, 1.0);
+        return NdotL * atten * spotAtten;
+    }
+}
+
+float GetVertexLightVolumetric(int index, vec3 worldPos)
+{
+    vec3 lightDir = cVertexLights[index * 3 + 1].xyz;
+    vec3 lightPos = cVertexLights[index * 3 + 2].xyz;
+    float invRange = cVertexLights[index * 3].w;
+    float cutoff = cVertexLights[index * 3 + 1].w;
+    float invCutoff = cVertexLights[index * 3 + 2].w;
+
+    // Directional light
+    if (invRange == 0.0)
+        return 1.0;
+    // Point/spot light
+    else
+    {
+        vec3 lightVec = (lightPos - worldPos) * invRange;
+        float lightDist = length(lightVec);
+        vec3 localDir = lightVec / lightDist;
+        float atten = clamp(1.0 - lightDist * lightDist, 0.0, 1.0);
+        float spotEffect = dot(localDir, lightDir);
+        float spotAtten = clamp((spotEffect - cutoff) * invCutoff, 0.0, 1.0);
+        return atten * spotAtten;
+    }
 }
 #endif

+ 41 - 30
Bin/CoreData/Shaders/GLSL/LitParticle.frag

@@ -7,16 +7,21 @@ varying vec2 vTexCoord;
 #ifdef VERTEXCOLOR
     varying vec4 vColor;
 #endif
-varying vec4 vLightVec;
-#ifdef SPOTLIGHT
-    varying vec4 vSpotPos;
-#endif
-#ifdef POINTLIGHT
-    varying vec3 vCubeMaskVec;
+#ifdef PERPIXEL
+    varying vec4 vLightVec;
+    #ifdef SPOTLIGHT
+        varying vec4 vSpotPos;
+    #endif
+    #ifdef POINTLIGHT
+        varying vec3 vCubeMaskVec;
+    #endif
+#else
+    varying vec4 vVertexLight;
 #endif
 
 void main()
 {
+    // Get material diffuse albedo
     #ifdef DIFFMAP
         vec4 diffInput = texture2D(sDiffMap, vTexCoord);
         #ifdef ALPHAMASK
@@ -32,31 +37,37 @@ void main()
         diffColor *= vColor;
     #endif
 
-    vec3 lightColor;
-    vec3 lightVec;
-    vec3 finalColor;
-    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
-
-    finalColor = diff * lightColor * diffColor.rgb;
+    #ifdef PERPIXEL
+        // Per-pixel forward lighting
+        vec3 lightColor;
+        vec3 finalColor;
+        float diff;
+    
+        #ifdef DIRLIGHT
+            diff = GetDiffuseDirVolumetric();
+        #else
+            diff = GetDiffusePointOrSpotVolumetric(vLightVec.xyz);
+        #endif
     
-    #ifdef AMBIENT
-        finalColor += cAmbientColor * diffColor.rgb;
-        gl_FragColor = vec4(GetFog(finalColor, vLightVec.w), diffColor.a);
+        #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
+    
+        finalColor = diff * lightColor * diffColor.rgb;
+        
+        #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
     #else
-        gl_FragColor = vec4(GetLitFog(finalColor, vLightVec.w), diffColor.a);
+        // Ambient & per-vertex lighting
+        vec3 finalColor = vVertexLight.rgb * diffColor.rgb;
+        gl_FragColor = vec4(GetFog(finalColor, vVertexLight.a), diffColor.a);
     #endif
 }

+ 35 - 19
Bin/CoreData/Shaders/GLSL/LitParticle.vert

@@ -1,16 +1,21 @@
 #include "Uniforms.vert"
 #include "Transform.vert"
+#include "Lighting.vert"
 
 varying vec2 vTexCoord;
 #ifdef VERTEXCOLOR
     varying vec4 vColor;
 #endif
-varying vec4 vLightVec;
-#ifdef SPOTLIGHT
-    varying vec4 vSpotPos;
-#endif
-#ifdef POINTLIGHT
-    varying vec3 vCubeMaskVec;
+#ifdef PERPIXEL
+    varying vec4 vLightVec;
+    #ifdef SPOTLIGHT
+        varying vec4 vSpotPos;
+    #endif
+    #ifdef POINTLIGHT
+        varying vec3 vCubeMaskVec;
+    #endif
+#else
+    varying vec4 vVertexLight;
 #endif
 
 void main()
@@ -24,20 +29,31 @@ void main()
         vColor = iColor;
     #endif
 
-    vec4 projWorldPos = vec4(worldPos, 1.0);
-
-    #ifdef DIRLIGHT
-        vLightVec = vec4(cLightDir, GetDepth(gl_Position));
+    #if PERPIXEL
+        // Per-pixel forward lighting
+        vec4 projWorldPos = vec4(worldPos, 1.0);
+    
+        #ifdef DIRLIGHT
+            vLightVec = vec4(cLightDir, GetDepth(gl_Position));
+        #else
+            vLightVec = vec4((cLightPos.xyz - worldPos) * cLightPos.w, GetDepth(gl_Position));
+        #endif
+    
+        #ifdef SPOTLIGHT
+            // Spotlight projection: transform from world space to projector texture coordinates
+            vSpotPos = cLightMatrices[0] * projWorldPos;
+        #endif
+    
+        #ifdef POINTLIGHT
+            vCubeMaskVec = mat3(cLightMatrices[0][0].xyz, cLightMatrices[0][1].xyz, cLightMatrices[0][2].xyz) * vLightVec.xyz;
+        #endif
     #else
-        vLightVec = vec4((cLightPos.xyz - worldPos) * cLightPos.w, GetDepth(gl_Position));
-    #endif
+        // Ambient & per-vertex lighting
+        vVertexLight = vec4(GetAmbient(GetZonePos(worldPos)), GetDepth(gl_Position));
 
-    #ifdef SPOTLIGHT
-        // Spotlight projection: transform from world space to projector texture coordinates
-        vSpotPos = cLightMatrices[0] * projWorldPos;
-    #endif
-
-    #ifdef POINTLIGHT
-        vCubeMaskVec = mat3(cLightMatrices[0][0].xyz, cLightMatrices[0][1].xyz, cLightMatrices[0][2].xyz) * vLightVec.xyz;
+        #ifdef NUMVERTEXLIGHTS
+            for (int i = 0; i < NUMVERTEXLIGHTS; ++i)
+                vVertexLight.rgb += GetVertexLightVolumetric(i, worldPos) * cVertexLights[i * 3].rgb;
+        #endif
     #endif
 }

+ 31 - 8
Bin/CoreData/Shaders/GLSL/LitParticle.xml

@@ -1,9 +1,23 @@
 <shaders>
     <shader type="vs">
         <option name="VCol" define="VERTEXCOLOR" />
-        <variation name="Dir" define="DIRLIGHT" />
-        <variation name="Spot" define="SPOTLIGHT" />
-        <variation name="Point" define="POINTLIGHT" />
+        <variation name="" define="AMBIENT" />
+        <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="Dir">
+            <define name="DIRLIGHT" />
+            <define name="PERPIXEL" />
+        </variation>
+        <variation name="Spot">
+            <define name="SPOTLIGHT" />
+            <define name="PERPIXEL" />
+        </variation>
+        <variation name="Point">
+            <define name="POINTLIGHT" />
+            <define name="PERPIXEL" />
+        </variation>
         <option name="" /> <!-- Dummy option to separate the two variation groups -->
         <variation name="" />
         <variation name="Skinned" define="SKINNED" />
@@ -11,12 +25,21 @@
     </shader>
     <shader type="ps">
         <option name="Diff" define="DIFFMAP" />
-        <option name="AlphaMask" define="ALPHAMASK" require="DIFFMAP" />           
+        <option name="AlphaMask" define="ALPHAMASK" require="DIFFMAP" />
         <option name="VCol" define="VERTEXCOLOR" />
-        <option name="Ambient" define="AMBIENT" />
-        <variation name="Dir" define="DIRLIGHT" />
-        <variation name="Spot" define="SPOTLIGHT" />
-        <variation name="Point" define="POINTLIGHT" />
+        <variation name="" define="AMBIENT" />
+        <variation name="Dir">
+            <define name="DIRLIGHT" />
+            <define name="PERPIXEL" />
+        </variation>
+        <variation name="Spot">
+            <define name="SPOTLIGHT" />
+            <define name="PERPIXEL" />
+        </variation>
+        <variation name="Point">
+            <define name="POINTLIGHT" />
+            <define name="PERPIXEL" />
+        </variation>
         <option name="Mask" define="CUBEMASK" require="POINTLIGHT" />
     </shader>
 </shaders>

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

@@ -0,0 +1,168 @@
+#include "Uniforms.frag"
+#include "Samplers.frag"
+#include "Lighting.frag"
+#include "Fog.frag"
+
+varying vec2 vTexCoord;
+#ifdef PERPIXEL
+    varying vec4 vLightVec;
+    #ifdef SPECULAR
+        varying vec3 vEyeVec;
+    #endif
+    #ifndef NORMALMAP
+        varying vec3 vNormal;
+    #endif
+    #ifdef SHADOW
+        #if defined(DIRLIGHT)
+            varying vec4 vShadowPos[4];
+        #elif defined(SPOTLIGHT)
+            varying vec4 vShadowPos;
+        #else
+            varying vec3 vShadowPos;
+        #endif
+    #endif
+    #ifdef SPOTLIGHT
+        varying vec4 vSpotPos;
+    #endif
+    #ifdef POINTLIGHT
+        varying vec3 vCubeMaskVec;
+    #endif
+#else
+    varying vec4 vVertexLight;
+    varying vec3 vNormal;
+    #ifdef NORMALMAP
+        varying vec3 vTangent;
+        varying vec3 vBitangent;
+    #else
+        varying vec4 vScreenPos;
+    #endif
+#endif
+
+void main()
+{
+    // Get material diffuse albedo
+    #ifdef DIFFMAP
+        vec4 diffInput = texture2D(sDiffMap, vTexCoord);
+        #ifdef ALPHAMASK
+            if (diffInput.a < 0.5)
+                discard;
+        #endif
+        vec4 diffColor = cMatDiffColor * diffInput;
+    #else
+        vec4 diffColor = cMatDiffColor;
+    #endif
+    
+    // Get material specular albedo
+    #ifdef SPECMAP
+        vec3 specColor = cMatSpecColor.rgb * texture2D(sSpecMap, vTexCoord).rgb;
+    #else
+        vec3 specColor = cMatSpecColor.rgb;
+    #endif
+
+    #if defined(PERPIXEL)
+        // Per-pixel forward lighting
+        vec3 lightColor;
+        vec3 lightDir;
+        vec3 finalColor;
+        float diff;
+
+        #ifdef NORMALMAP
+            vec3 normal = DecodeNormal(texture2D(sNormalMap, vTexCoord));
+        #else
+            vec3 normal = normalize(vNormal);
+        #endif
+    
+        #ifdef DIRLIGHT
+            #ifdef NORMALMAP
+                lightDir = normalize(vLightVec.xyz);
+            #else
+                lightDir = vLightVec.xyz;
+            #endif
+            diff = GetDiffuseDir(normal, lightDir);
+        #else
+            diff = GetDiffusePointOrSpot(normal, vLightVec.xyz, lightDir);
+        #endif
+    
+        #ifdef SHADOW
+            #if defined(DIRLIGHT)
+                vec4 shadowPos = GetDirShadowPos(vShadowPos, vLightVec.w);
+                diff *= min(GetShadow(shadowPos) + GetShadowFade(vLightVec.w), 1.0);
+            #elif defined(SPOTLIGHT)
+                diff *= GetShadow(vShadowPos);
+            #else
+                diff *= GetCubeShadow(vShadowPos);
+            #endif
+        #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 SPECULAR
+            float spec = GetSpecular(normal, vEyeVec, lightDir, cMatSpecColor.a);
+            finalColor = diff * lightColor * (diffColor.rgb + spec * specColor * cLightColor.a);
+        #else
+            finalColor = diff * lightColor * diffColor.rgb;
+        #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
+    #elif defined(PREPASS)
+        // Fill light pre-pass G-Buffer
+        #ifdef NORMALMAP
+            mat3 tbn = mat3(vTangent, vBitangent, vNormal);
+            vec3 normal = tbn * DecodeNormal(texture2D(sNormalMap, vTexCoord.xy));
+        #else
+            vec3 normal = vNormal;
+        #endif
+    
+        float specPower = cMatSpecColor.a / 255.0;
+    
+        #ifdef HWDEPTH
+            gl_FragColor = vec4(normal * 0.5 + 0.5, specPower);
+        #else
+            gl_FragData[0] = vec4(normal * 0.5 + 0.5, specPower);
+            gl_FragData[1] = vec4(EncodeDepth(vVertexLight.a), 0.0);
+        #endif
+    #elif defined(DEFERRED)
+        // Fill deferred G-buffer
+        #ifdef NORMALMAP
+            mat3 tbn = mat3(vTangent, vBitangent, vNormal);
+            vec3 normal = tbn * DecodeNormal(texture2D(sNormalMap, vTexCoord));
+        #else
+            vec3 normal = vNormal;
+        #endif
+
+        float specIntensity = specColor.g;
+        float specPower = cMatSpecColor.a / 255.0;
+
+        gl_FragData[0] = vec4(GetFog(vVertexLight.rgb * diffColor.rgb, vVertexLight.a), 1.0);
+        gl_FragData[1] = GetFogFactor(vVertexLight.a) * vec4(diffColor.rgb, specIntensity);
+        gl_FragData[2] = vec4(normal * 0.5 + 0.5, specPower);
+        #ifndef HWDEPTH
+            gl_FragData[3] = vec4(EncodeDepth(vVertexLight.a), 0.0);
+        #endif
+    #else
+        // Ambient & per-vertex lighting
+        vec3 finalColor = vVertexLight.rgb * diffColor.rgb;
+
+        #ifdef MATERIAL
+            // Add light pre-pass accumulation result
+            // Lights are accumulated at half intensity. Bring back to full intensity now
+            vec4 lightInput = 2.0 * texture2DProj(sLightBuffer, vScreenPos);
+            vec3 lightSpecColor = lightInput.a * lightInput.rgb / max(GetIntensity(lightInput.rgb), 0.001);
+
+            finalColor += lightInput.rgb * diffColor.rgb + lightSpecColor * specColor;
+        #endif
+
+        gl_FragColor = vec4(GetFog(finalColor, vVertexLight.a), diffColor.a);
+    #endif
+}

+ 120 - 0
Bin/CoreData/Shaders/GLSL/LitSolid.vert

@@ -0,0 +1,120 @@
+#include "Uniforms.vert"
+#include "Transform.vert"
+#include "ScreenPos.vert"
+#include "Lighting.vert"
+
+varying vec2 vTexCoord;
+#ifdef PERPIXEL
+    varying vec4 vLightVec;
+    #ifdef SPECULAR
+        varying vec3 vEyeVec;
+    #endif
+    #ifndef NORMALMAP
+        varying vec3 vNormal;
+    #endif
+    #ifdef SHADOW
+        #if defined(DIRLIGHT)
+            varying vec4 vShadowPos[4];
+        #elif defined(SPOTLIGHT)
+            varying vec4 vShadowPos;
+        #else
+            varying vec3 vShadowPos;
+        #endif
+    #endif
+    #ifdef SPOTLIGHT
+        varying vec4 vSpotPos;
+    #endif
+    #ifdef POINTLIGHT
+        varying vec3 vCubeMaskVec;
+    #endif
+#else
+    varying vec4 vVertexLight;
+    varying vec3 vNormal;
+    #ifdef NORMALMAP
+        varying vec3 vTangent;
+        varying vec3 vBitangent;
+    #else
+        varying vec4 vScreenPos;
+    #endif
+#endif
+
+void main()
+{
+    mat4 modelMatrix = iModelMatrix;
+    vec3 worldPos = GetWorldPos(modelMatrix);
+    gl_Position = GetClipPos(worldPos);
+    vTexCoord = GetTexCoord(iTexCoord);
+
+    #if defined(PERPIXEL) && defined(NORMALMAP)
+        vec3 vNormal;
+        vec3 vTangent;
+        vec3 vBitangent;
+    #endif
+
+    vNormal = GetWorldNormal(modelMatrix);
+    #ifdef NORMALMAP
+        vTangent = GetWorldTangent(modelMatrix);
+        vBitangent = cross(vTangent, vNormal) * iTangent.w;
+    #endif
+    
+    #ifdef PERPIXEL
+        // Per-pixel forward lighting
+        vec4 projWorldPos = vec4(worldPos, 1.0);
+    
+        #ifdef SHADOW
+            // Shadow projection: transform from world space to shadow space
+            #if defined(DIRLIGHT)
+                vShadowPos[0] = cLightMatrices[0] * projWorldPos;
+                vShadowPos[1] = cLightMatrices[1] * projWorldPos;
+                vShadowPos[2] = cLightMatrices[2] * projWorldPos;
+                vShadowPos[3] = cLightMatrices[3] * projWorldPos;
+            #elif defined(SPOTLIGHT)
+                vShadowPos = cLightMatrices[1] * projWorldPos;
+            #else
+                vShadowPos = worldPos - cLightPos.xyz;
+            #endif
+        #endif
+    
+        #ifdef SPOTLIGHT
+            // Spotlight projection: transform from world space to projector texture coordinates
+            vSpotPos = cLightMatrices[0] * projWorldPos;
+        #endif
+    
+        #ifdef POINTLIGHT
+            vCubeMaskVec = mat3(cLightMatrices[0][0].xyz, cLightMatrices[0][1].xyz, cLightMatrices[0][2].xyz) * (cLightPos.xyz - worldPos);
+        #endif
+    
+        #ifdef NORMALMAP
+            mat3 tbn = mat3(vTangent, vBitangent, vNormal);
+            #ifdef DIRLIGHT
+                vLightVec = vec4(cLightDir * tbn, GetDepth(gl_Position));
+            #else
+                vLightVec = vec4((cLightPos.xyz - worldPos) * tbn * cLightPos.w, GetDepth(gl_Position));
+            #endif
+            #ifdef SPECULAR
+                vEyeVec = (cCameraPos - worldPos) * tbn;
+            #endif
+        #else
+            #ifdef DIRLIGHT
+                vLightVec = vec4(cLightDir, GetDepth(gl_Position));
+            #else
+                vLightVec = vec4((cLightPos.xyz - worldPos) * cLightPos.w, GetDepth(gl_Position));
+            #endif
+            #ifdef SPECULAR
+                vEyeVec = cCameraPos - worldPos;
+            #endif
+        #endif
+    #else
+        // Ambient & per-vertex lighting
+        vVertexLight = vec4(GetAmbient(GetZonePos(worldPos)), GetDepth(gl_Position));
+
+        #ifdef NUMVERTEXLIGHTS
+            for (int i = 0; i < NUMVERTEXLIGHTS; ++i)
+                vVertexLight.rgb += GetVertexLight(i, worldPos, vNormal) * cVertexLights[i * 3].rgb;
+        #endif
+        
+        #ifndef NORMALMAP
+            vScreenPos = GetScreenPos(gl_Position);
+        #endif
+    #endif
+}

+ 56 - 0
Bin/CoreData/Shaders/GLSL/LitSolid.xml

@@ -0,0 +1,56 @@
+<shaders>
+    <shader type="vs">
+        <option name="Normal" define="NORMALMAP" />
+        <variation name="" define="AMBIENT" />
+        <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="Dir">
+            <define name="DIRLIGHT" />
+            <define name="PERPIXEL" />
+        </variation>
+        <variation name="Spot">
+            <define name="SPOTLIGHT" />
+            <define name="PERPIXEL" />
+        </variation>
+        <variation name="Point">
+            <define name="POINTLIGHT" />
+            <define name="PERPIXEL" />
+        </variation>
+        <option name="Spec" define="SPECULAR" require="PERPIXEL" />
+        <option name="Shadow" define="SHADOW" require="PERPIXEL" />
+        <variation name="" />
+        <variation name="Skinned" define="SKINNED" />
+        <variation name="Billboard" define="BILLBOARD" />
+    </shader>
+    <shader type="ps">
+        <option name="Diff" define="DIFFMAP" />
+        <option name="Normal" define="NORMALMAP" require="DIFFMAP" />
+        <option name="SpecMap" define="SPECMAP" require="DIFFMAP" />
+        <option name="AlphaMask" define="ALPHAMASK" require="DIFFMAP" />        
+        <option name="Ambient" define="AMBIENT" require="PERPIXEL" />
+        <variation name="" define="AMBIENT" />        
+        <variation name="Dir">
+            <define name="DIRLIGHT" />
+            <define name="PERPIXEL" />
+        </variation>
+        <variation name="Spot">
+            <define name="SPOTLIGHT" />
+            <define name="PERPIXEL" />
+        </variation>
+        <variation name="Point">
+            <define name="POINTLIGHT" />
+            <define name="PERPIXEL" />
+        </variation>
+        <variation name="Prepass" define="PREPASS" />
+        <variation name="Material" define="MATERIAL" exclude="Normal" />
+        <variation name="Deferred" define="DEFERRED" />
+        <option name="HW" define="HWDEPTH" require="PREPASS" />
+        <option name="HW" define="HWDEPTH" require="DEFERRED" />
+        <option name="Mask" define="CUBEMASK" require="POINTLIGHT" />
+        <option name="Spec" define="SPECULAR" require="PERPIXEL" />
+        <option name="Shadow" define="SHADOW" require="PERPIXEL" />
+        <option name="LQ" define="LQSHADOW" require="SHADOW" />
+    </shader>
+</shaders>

+ 0 - 42
Bin/CoreData/Shaders/GLSL/Material.frag

@@ -1,42 +0,0 @@
-#include "Uniforms.frag"
-#include "Samplers.frag"
-#include "Lighting.frag"
-#include "Fog.frag"
-
-varying vec2 vTexCoord;
-#ifdef VERTEXCOLOR
-    varying vec4 vColor;
-#endif
-varying vec4 vVertexLighting;
-varying vec4 vScreenPos;
-
-void main()
-{
-    #ifdef DIFFMAP
-        vec4 diffInput = texture2D(sDiffMap, vTexCoord);
-        #ifdef ALPHAMASK
-            if (diffInput.a < 0.5)
-                discard;
-        #endif
-        vec3 diffColor = cMatDiffColor.rgb * diffInput.rgb;
-    #else
-        vec3 diffColor = cMatDiffColor.rgb;
-    #endif
-
-    #ifdef VERTEXCOLOR
-        diffColor *= vColor.rgb;
-    #endif
-    
-    #ifdef SPECMAP
-        vec3 specColor = cMatSpecColor.rgb * texture2D(sSpecMap, vTexCoord).g;
-    #else
-        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 * lightInput.rgb / max(GetIntensity(lightInput.rgb), 0.001);
-
-    vec3 finalColor = (vVertexLighting.rgb + lightInput.rgb) * diffColor + lightSpecColor * specColor;
-    gl_FragColor = vec4(GetFog(finalColor, vVertexLighting.a), 1.0);
-}

+ 0 - 31
Bin/CoreData/Shaders/GLSL/Material.vert

@@ -1,31 +0,0 @@
-#include "Uniforms.vert"
-#include "Transform.vert"
-#include "ScreenPos.vert"
-#include "Lighting.vert"
-
-varying vec2 vTexCoord;
-#ifdef VERTEXCOLOR
-    varying vec4 vColor;
-#endif
-varying vec4 vVertexLighting;
-varying vec4 vScreenPos;
-
-void main()
-{
-    mat4 modelMatrix = iModelMatrix;
-    vec3 worldPos = GetWorldPos(modelMatrix);
-    gl_Position = GetClipPos(worldPos);
-    vTexCoord = GetTexCoord(iTexCoord);
-    vScreenPos = GetScreenPos(gl_Position);
-
-    vVertexLighting = vec4(GetAmbient(GetZonePos(worldPos)), GetDepth(gl_Position));
-    #ifdef NUMVERTEXLIGHTS
-    vec3 normal = GetWorldNormal(modelMatrix);
-    for (int i = 0; i < NUMVERTEXLIGHTS; ++i)
-        vVertexLighting.rgb += GetVertexLight(i, worldPos, normal) * cVertexLights[i * 3].rgb;
-    #endif
-
-    #ifdef VERTEXCOLOR
-        vColor = iColor;
-    #endif
-}

+ 0 - 21
Bin/CoreData/Shaders/GLSL/Material.xml

@@ -1,21 +0,0 @@
-<shaders>
-    <shader type="vs">
-        <option name="VCol" define="VERTEXCOLOR" />
-        <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" />
-    </shader>
-    <shader type="ps">
-        <option name="Diff" define="DIFFMAP" />
-        <option name="SpecMap" define="SPECMAP" />
-        <option name="AlphaMask" define="ALPHAMASK" require="DIFFMAP" />
-        <option name="VCol" define="VERTEXCOLOR" /> 
-    </shader>
-</shaders>

+ 0 - 38
Bin/CoreData/Shaders/GLSL/Prepass.frag

@@ -1,38 +0,0 @@
-#include "Uniforms.frag"
-#include "Samplers.frag"
-
-#ifdef HWDEPTH
-    varying vec2 vTexCoord;
-#else
-    varying vec3 vTexCoord;
-#endif
-varying vec3 vNormal;
-#ifdef NORMALMAP
-    varying vec3 vTangent;
-    varying vec3 vBitangent;
-#endif
-
-void main()
-{
-    #ifdef ALPHAMASK
-        vec4 diffInput = texture2D(sDiffMap, vTexCoord.xy);
-        if (diffInput.a < 0.5)
-            discard;
-    #endif
-
-    #ifdef NORMALMAP
-        mat3 tbn = mat3(vTangent, vBitangent, vNormal);
-        vec3 normal = tbn * DecodeNormal(texture2D(sNormalMap, vTexCoord.xy));
-    #else
-        vec3 normal = vNormal;
-    #endif
-
-    float specPower = cMatSpecColor.a / 255.0;
-
-    #ifdef HWDEPTH
-        gl_FragColor = vec4(normal * 0.5 + 0.5, specPower);
-    #else
-        gl_FragData[0] = vec4(normal * 0.5 + 0.5, specPower);
-        gl_FragData[1] = vec4(EncodeDepth(vTexCoord.z), 0.0);
-    #endif
-}

+ 0 - 31
Bin/CoreData/Shaders/GLSL/Prepass.vert

@@ -1,31 +0,0 @@
-#include "Uniforms.vert"
-#include "Transform.vert"
-
-#ifdef HWDEPTH
-    varying vec2 vTexCoord;
-#else
-    varying vec3 vTexCoord;
-#endif
-varying vec3 vNormal;
-#ifdef NORMALMAP
-    varying vec3 vTangent;
-    varying vec3 vBitangent;
-#endif
-
-void main()
-{
-    mat4 modelMatrix = iModelMatrix;
-    vec3 worldPos = GetWorldPos(modelMatrix);
-    gl_Position = GetClipPos(worldPos);
-    #ifdef HWDEPTH
-        vTexCoord = GetTexCoord(iTexCoord);
-    #else
-        vTexCoord = vec3(GetTexCoord(iTexCoord), GetDepth(gl_Position));
-    #endif
-    
-    vNormal = GetWorldNormal(modelMatrix);
-    #ifdef NORMALMAP
-        vTangent = GetWorldTangent(modelMatrix);
-        vBitangent = cross(vTangent, vNormal) * iTangent.w;
-    #endif
-}

+ 0 - 13
Bin/CoreData/Shaders/GLSL/Prepass.xml

@@ -1,13 +0,0 @@
-<shaders>
-    <shader type="vs">
-        <option name="Normal" define="NORMALMAP" />
-        <option name="HW" define="HWDEPTH" />
-        <variation name="" />
-        <variation name="Skinned" define="SKINNED" />
-    </shader>
-    <shader type="ps">
-        <option name="Normal" define="NORMALMAP" />
-        <option name="AlphaMask" define="ALPHAMASK" />
-        <option name="HW" define="HWDEPTH" />
-    </shader>
-</shaders>

+ 1 - 3
Bin/CoreData/Shaders/GLSL/Shadow.frag

@@ -1,9 +1,7 @@
 #include "Uniforms.frag"
 #include "Samplers.frag"
 
-#ifdef ALPHAMASK
-    varying vec2 vTexCoord;
-#endif
+varying vec2 vTexCoord;
 
 void main()
 {

+ 2 - 7
Bin/CoreData/Shaders/GLSL/Shadow.vert

@@ -1,18 +1,13 @@
 #include "Uniforms.vert"
 #include "Transform.vert"
 
-#ifdef ALPHAMASK
-    varying vec2 vTexCoord;
-#endif
+varying vec2 vTexCoord;
 
 void main()
 {
     mat4 modelMatrix = iModelMatrix;
     vec3 worldPos = GetWorldPos(modelMatrix);
     gl_Position = GetClipPos(worldPos);
-
-    #ifdef ALPHAMASK
-        vTexCoord = GetTexCoord(iTexCoord);
-    #endif
+    vTexCoord = GetTexCoord(iTexCoord);
 }
 

+ 0 - 1
Bin/CoreData/Shaders/GLSL/Shadow.xml

@@ -1,6 +1,5 @@
 <shaders>
     <shader type="vs">
-        <option name="Mask" define="ALPHAMASK" />
         <variation name="" />
         <variation name="Skinned" define="SKINNED" />
     </shader>

+ 1 - 1
Bin/CoreData/Shaders/GLSL/Uniforms.vert

@@ -16,4 +16,4 @@ uniform vec3 cViewUpVector;
 uniform mat4 cZone;
 uniform mat4 cLightMatrices[4];
 uniform vec4 cSkinMatrices[64*3];
-uniform vec4 cVertexLights[6*3];
+uniform vec4 cVertexLights[4*3];

+ 0 - 76
Bin/CoreData/Shaders/HLSL/Ambient.hlsl

@@ -1,76 +0,0 @@
-#pragma warning(disable:3557)
-
-#include "Uniforms.hlsl"
-#include "Samplers.hlsl"
-#include "Transform.hlsl"
-#include "Lighting.hlsl"
-#include "Fog.hlsl"
-
-void VS(float4 iPos : POSITION,
-    #ifdef NUMVERTEXLIGHTS
-        float3 iNormal : NORMAL,
-    #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
-    #ifdef BILLBOARD
-        float2 iSize : TEXCOORD1,
-    #endif
-    out float2 oTexCoord : TEXCOORD0,
-    out float4 oVertexLighting : TEXCOORD1,
-    #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
-
-    #ifdef VERTEXCOLOR
-        oColor = iColor;
-    #endif
-}
-
-void PS(float2 iTexCoord : TEXCOORD0,
-    float4 iVertexLighting : TEXCOORD1,
-    #ifdef VERTEXCOLOR
-        float4 iColor : COLOR0,
-    #endif
-    out float4 oColor : COLOR0)
-{
-    #ifdef DIFFMAP
-        float4 diffInput = tex2D(sDiffMap, iTexCoord);
-        #ifdef ALPHAMASK
-            if (diffInput.a < 0.5)
-                discard;
-        #endif
-        float4 diffColor = cMatDiffColor * diffInput;
-    #else
-        float4 diffColor = cMatDiffColor;
-    #endif
-
-    #ifdef VERTEXCOLOR
-        diffColor *= iColor;
-    #endif
-
-    float3 finalColor = iVertexLighting.rgb * diffColor.rgb;
-
-    oColor = float4(GetFog(finalColor, iVertexLighting.a), diffColor.a);
-}

+ 0 - 22
Bin/CoreData/Shaders/HLSL/Ambient.xml

@@ -1,22 +0,0 @@
-<shaders>
-    <shader type="vs">
-        <option name="VCol" define="VERTEXCOLOR" />
-        <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" require="SM3" />
-        <variation name="Billboard" define="BILLBOARD" />
-    </shader>
-    <shader type="ps">
-        <option name="Diff" define="DIFFMAP" />
-        <option name="AlphaMask" define="ALPHAMASK" require="DIFFMAP" />
-        <option name="VCol" define="VERTEXCOLOR" />
-    </shader>
-</shaders>

+ 0 - 117
Bin/CoreData/Shaders/HLSL/Deferred.hlsl

@@ -1,117 +0,0 @@
-#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
-}

+ 0 - 26
Bin/CoreData/Shaders/HLSL/Deferred.xml

@@ -1,26 +0,0 @@
-<shaders>
-    <shader 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 type="ps">
-        <option name="Diff" define="DIFFMAP" />
-        <option name="Normal" define="NORMALMAP" require="DIFFMAP" />
-        <option name="SpecMap" define="SPECMAP" require="DIFFMAP" />
-        <option name="AlphaMask" define="ALPHAMASK" require="DIFFMAP" />
-        <option name="VCol" define="VERTEXCOLOR" />
-        <option name="HW" define="HWDEPTH" />
-    </shader>
-</shaders>

+ 0 - 216
Bin/CoreData/Shaders/HLSL/ForwardLit.hlsl

@@ -1,216 +0,0 @@
-#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
-    #ifdef BILLBOARD
-        float2 iSize : TEXCOORD1,
-    #endif
-    out float2 oTexCoord : TEXCOORD0,
-    out float4 oLightVec : TEXCOORD1,
-    #ifndef NORMALMAP
-        out float3 oNormal : TEXCOORD2,
-    #endif
-    #ifdef SPECULAR
-        out float3 oEyeVec : TEXCOORD3,
-    #endif
-    #ifdef SHADOW
-        #if defined(DIRLIGHT)
-            out float4 oShadowPos[4] : TEXCOORD4,
-        #elif defined(SPOTLIGHT)
-            out float4 oShadowPos : TEXCOORD4,
-        #else
-            out float3 oShadowPos : TEXCOORD4,
-        #endif
-    #endif
-    #ifdef SPOTLIGHT
-        out float4 oSpotPos : TEXCOORD5,
-    #endif
-    #ifdef POINTLIGHT
-        out float3 oCubeMaskVec : TEXCOORD5,
-    #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);
-
-    #ifdef VERTEXCOLOR
-        oColor = iColor;
-    #endif
-
-    #ifdef NORMALMAP
-        float3 oNormal;
-        float3 oTangent;
-        float3 oBitangent;
-    #endif
-
-    oNormal = GetWorldNormal(modelMatrix);
-    float4 projWorldPos = float4(worldPos, 1.0);
-
-    #ifdef DIRLIGHT
-        oLightVec = float4(cLightDir, GetDepth(oPos));
-    #else
-        oLightVec = float4((cLightPos.xyz - worldPos) * cLightPos.w, GetDepth(oPos));
-    #endif
-
-    #ifdef SHADOW
-        // Shadow projection: transform from world space to shadow space
-        #if defined(DIRLIGHT)
-            oShadowPos[0] = mul(projWorldPos, cLightMatrices[0]);
-            oShadowPos[1] = mul(projWorldPos, cLightMatrices[1]);
-            oShadowPos[2] = mul(projWorldPos, cLightMatrices[2]);
-            oShadowPos[3] = mul(projWorldPos, cLightMatrices[3]);
-        #elif defined(SPOTLIGHT)
-            oShadowPos = mul(projWorldPos, cLightMatrices[1]);
-        #else
-            oShadowPos = worldPos - cLightPos.xyz;
-        #endif
-    #endif
-
-    #ifdef SPOTLIGHT
-        // Spotlight projection: transform from world space to projector texture coordinates
-        oSpotPos = mul(projWorldPos, cLightMatrices[0]);
-    #endif
-
-    #ifdef POINTLIGHT
-        oCubeMaskVec = mul(oLightVec.xyz, (float3x3)cLightMatrices[0]);
-    #endif
-
-    #ifdef NORMALMAP
-        oTangent = GetWorldTangent(modelMatrix);
-        oBitangent = cross(oTangent, oNormal) * iTangent.w;
-        float3x3 tbn = float3x3(oTangent, oBitangent, oNormal);
-        oLightVec.xyz = mul(tbn, oLightVec.xyz);
-        #ifdef SPECULAR
-            oEyeVec = mul(tbn, cCameraPos - worldPos);
-        #endif
-    #elif defined(SPECULAR)
-        oEyeVec = cCameraPos - worldPos;
-    #endif
-}
-
-void PS(float2 iTexCoord : TEXCOORD0,
-    float4 iLightVec : TEXCOORD1,
-    #ifndef NORMALMAP
-        float3 iNormal : TEXCOORD2,
-    #endif
-    #ifdef SPECULAR
-        float3 iEyeVec : TEXCOORD3,
-    #endif
-    #ifdef SHADOW
-        #if defined(DIRLIGHT)
-            float4 iShadowPos[4] : TEXCOORD4,
-        #elif defined(SPOTLIGHT)
-            float4 iShadowPos : TEXCOORD4,
-        #else
-            float3 iShadowPos : TEXCOORD4,
-        #endif
-    #endif
-    #ifdef SPOTLIGHT
-        float4 iSpotPos : TEXCOORD5,
-    #endif
-    #ifdef CUBEMASK
-        float3 iCubeMaskVec : TEXCOORD5,
-    #endif
-    #ifdef VERTEXCOLOR
-        float4 iColor : COLOR0,
-    #endif
-    out float4 oColor : COLOR0)
-{
-    #ifdef DIFFMAP
-        float4 diffInput = tex2D(sDiffMap, iTexCoord);
-        #ifdef ALPHAMASK
-            if (diffInput.a < 0.5)
-                discard;
-        #endif
-        float4 diffColor = cMatDiffColor * diffInput;
-    #else
-        float4 diffColor = cMatDiffColor;
-    #endif
-
-    #ifdef VERTEXCOLOR
-        diffColor *= iColor;
-    #endif
-
-    #ifdef NORMALMAP
-        float3 normal = DecodeNormal(tex2D(sNormalMap, iTexCoord));
-    #else
-        float3 normal = normalize(iNormal);
-    #endif
-
-    float3 lightDir;
-    float3 lightColor;
-    float3 finalColor;
-    float diff;
-
-    #ifdef DIRLIGHT
-        #ifdef NORMALMAP
-            lightDir = normalize(iLightVec.xyz);
-        #else
-            lightDir = iLightVec.xyz;
-        #endif
-        diff = GetDiffuseDir(normal, lightDir);
-    #else
-        diff = GetDiffusePointOrSpot(normal, iLightVec.xyz, lightDir);
-    #endif
-
-    #ifdef SHADOW
-        #if defined(DIRLIGHT)
-            float4 shadowPos = GetDirShadowPos(iShadowPos, iLightVec.w);
-            diff *= saturate(GetShadow(shadowPos) + GetShadowFade(iLightVec.w));
-        #elif defined(SPOTLIGHT)
-            diff *= GetShadow(iShadowPos);
-        #else
-            diff *= GetCubeShadow(iShadowPos);
-        #endif
-    #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 SPECULAR
-        #ifdef SPECMAP
-            float3 specColor = cMatSpecColor.rgb * tex2D(sSpecMap, iTexCoord).g;
-        #else
-            float3 specColor = cMatSpecColor.rgb;
-        #endif
-        float spec = GetSpecular(normal, iEyeVec, lightDir, cMatSpecColor.a);
-        finalColor = diff * lightColor * (diffColor.rgb + spec * specColor * cLightColor.a);
-    #else
-        finalColor = diff * lightColor * diffColor.rgb;
-    #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
-}

+ 0 - 31
Bin/CoreData/Shaders/HLSL/ForwardLit.xml

@@ -1,31 +0,0 @@
-<shaders>
-    <shader type="vs">
-        <option name="Normal" define="NORMALMAP" />
-        <option name="VCol" define="VERTEXCOLOR" />
-        <variation name="Dir" define="DIRLIGHT" />
-        <variation name="Spot" define="SPOTLIGHT" />
-        <variation name="Point" define="POINTLIGHT" />
-        <option name="Spec" define="SPECULAR" />
-        <option name="Shadow" define="SHADOW" />
-        <variation name="" />
-        <variation name="Skinned" define="SKINNED" />
-        <variation name="Instanced" define="INSTANCED" require="SM3" />
-        <variation name="Billboard" define="BILLBOARD" />
-    </shader>
-    <shader type="ps">
-        <option name="Diff" define="DIFFMAP" />
-        <option name="Normal" define="NORMALMAP" require="DIFFMAP" />
-        <option name="SpecMap" define="SPECMAP" require="DIFFMAP" />
-        <option name="AlphaMask" define="ALPHAMASK" require="DIFFMAP" />        
-        <option name="VCol" define="VERTEXCOLOR" />
-        <option name="Ambient" define="AMBIENT" />
-        <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>

+ 44 - 35
Bin/CoreData/Shaders/HLSL/Lighting.hlsl

@@ -48,41 +48,50 @@ float GetVertexLight(int index, float3 worldPos, float3 normal)
     float cutoff = cVertexLights[index * 3 + 1].w;
     float invCutoff = cVertexLights[index * 3 + 2].w;
 
-    #ifndef BILLBOARD
-        // Directional light
-        if (invRange == 0.0)
-        {
-            float NdotL = max(dot(normal, lightDir), 0.0);
-            return NdotL;
-        }
-        // Point/spot light
-        else
-        {
-            float3 lightVec = (lightPos - worldPos) * invRange;
-            float lightDist = length(lightVec);
-            float3 localDir = lightVec / lightDist;
-            float NdotL = max(dot(normal, localDir), 0.0);
-            float atten = saturate(1.0 - lightDist * lightDist);
-            float spotEffect = dot(localDir, lightDir);
-            float spotAtten = saturate((spotEffect - cutoff) * invCutoff);
-            return NdotL * atten * spotAtten;
-        }
-    #else
-        // Directional light
-        if (invRange == 0.0)
-            return 1.0;
-        // Point/spot light
-        else
-        {
-            float3 lightVec = (lightPos - worldPos) * invRange;
-            float lightDist = length(lightVec);
-            float3 localDir = lightVec / lightDist;
-            float atten = saturate(1.0 - lightDist * lightDist);
-            float spotEffect = dot(localDir, lightDir);
-            float spotAtten = saturate((spotEffect - cutoff) * invCutoff);
-            return atten * spotAtten;
-        }
-    #endif
+    // Directional light
+    if (invRange == 0.0)
+    {
+        float NdotL = max(dot(normal, lightDir), 0.0);
+        return NdotL;
+    }
+    // Point/spot light
+    else
+    {
+        float3 lightVec = (lightPos - worldPos) * invRange;
+        float lightDist = length(lightVec);
+        float3 localDir = lightVec / lightDist;
+        float NdotL = max(dot(normal, localDir), 0.0);
+        float atten = saturate(1.0 - lightDist * lightDist);
+        float spotEffect = dot(localDir, lightDir);
+        float spotAtten = saturate((spotEffect - cutoff) * invCutoff);
+        return NdotL * atten * spotAtten;
+    }
+}
+
+float GetVertexLightVolumetric(int index, float3 worldPos)
+{
+    float3 lightDir = cVertexLights[index * 3 + 1].xyz;
+    float3 lightPos = cVertexLights[index * 3 + 2].xyz;
+    float invRange = cVertexLights[index * 3].w;
+    float cutoff = cVertexLights[index * 3 + 1].w;
+    float invCutoff = cVertexLights[index * 3 + 2].w;
+
+    // Directional light
+    if (invRange == 0.0)
+    {
+        return 1.0;
+    }
+    // Point/spot light
+    else
+    {
+        float3 lightVec = (lightPos - worldPos) * invRange;
+        float lightDist = length(lightVec);
+        float3 localDir = lightVec / lightDist;
+        float atten = saturate(1.0 - lightDist * lightDist);
+        float spotEffect = dot(localDir, lightDir);
+        float spotAtten = saturate((spotEffect - cutoff) * invCutoff);
+        return atten * spotAtten;
+    }
 }
 #endif
 

+ 69 - 48
Bin/CoreData/Shaders/HLSL/LitParticle.hlsl

@@ -21,12 +21,16 @@ void VS(float4 iPos : POSITION,
         float2 iSize : TEXCOORD1,
     #endif
     out float2 oTexCoord : TEXCOORD0,
-    out float4 oLightVec : TEXCOORD1,
-    #ifdef SPOTLIGHT
-        out float4 oSpotPos : TEXCOORD2,
-    #endif
-    #ifdef POINTLIGHT
-        out float3 oCubeMaskVec : TEXCOORD2,
+    #if PERPIXEL
+        out float4 oLightVec : TEXCOORD1,
+        #ifdef SPOTLIGHT
+            out float4 oSpotPos : TEXCOORD2,
+        #endif
+        #ifdef POINTLIGHT
+            out float3 oCubeMaskVec : TEXCOORD2,
+        #endif
+    #else
+        out float4 oVertexLight : TEXCOORD1,
     #endif
     #ifdef VERTEXCOLOR
         out float4 oColor : COLOR0,
@@ -42,37 +46,53 @@ void VS(float4 iPos : POSITION,
         oColor = iColor;
     #endif
 
-    float4 projWorldPos = float4(worldPos, 1.0);
-
-    #ifdef DIRLIGHT
-        oLightVec = float4(cLightDir, GetDepth(oPos));
+    #ifdef PERPIXEL
+        // Per-pixel forward lighting
+        float4 projWorldPos = float4(worldPos, 1.0);
+    
+        #ifdef DIRLIGHT
+            oLightVec = float4(cLightDir, GetDepth(oPos));
+        #else
+            oLightVec = float4((cLightPos.xyz - worldPos) * cLightPos.w, GetDepth(oPos));
+        #endif
+    
+        #ifdef SPOTLIGHT
+            // Spotlight projection: transform from world space to projector texture coordinates
+            oSpotPos = mul(projWorldPos, cLightMatrices[0]);
+        #endif
+    
+        #ifdef POINTLIGHT
+            oCubeMaskVec = mul(oLightVec.xyz, (float3x3)cLightMatrices[0]);
+        #endif
     #else
-        oLightVec = float4((cLightPos.xyz - worldPos) * cLightPos.w, GetDepth(oPos));
-    #endif
+        // Ambient & per-vertex lighting
+        oVertexLight = float4(GetAmbient(GetZonePos(worldPos)), GetDepth(oPos));
 
-    #ifdef SPOTLIGHT
-        // Spotlight projection: transform from world space to projector texture coordinates
-        oSpotPos = mul(projWorldPos, cLightMatrices[0]);
-    #endif
-
-    #ifdef POINTLIGHT
-        oCubeMaskVec = mul(oLightVec.xyz, (float3x3)cLightMatrices[0]);
+        #ifdef NUMVERTEXLIGHTS
+            for (int i = 0; i < NUMVERTEXLIGHTS; ++i)
+                oVertexLight.rgb += GetVertexLightVolumetric(i, worldPos) * cVertexLights[i * 3].rgb;
+        #endif
     #endif
 }
 
 void PS(float2 iTexCoord : TEXCOORD0,
-    float4 iLightVec : TEXCOORD1,
-    #ifdef SPOTLIGHT
-        float4 iSpotPos : TEXCOORD2,
-    #endif
-    #ifdef CUBEMASK
-        float3 iCubeMaskVec : TEXCOORD2,
+    #ifdef PERPIXEL
+        float4 iLightVec : TEXCOORD1,
+        #ifdef SPOTLIGHT
+            float4 iSpotPos : TEXCOORD2,
+        #endif
+        #ifdef CUBEMASK
+            float3 iCubeMaskVec : TEXCOORD2,
+        #endif
+    #else
+        float4 iVertexLight : TEXCOORD1,
     #endif
     #ifdef VERTEXCOLOR
         float4 iColor : COLOR0,
     #endif
     out float4 oColor : COLOR0)
 {
+    // Get material diffuse albedo
     #ifdef DIFFMAP
         float4 diffInput = tex2D(sDiffMap, iTexCoord);
         #ifdef ALPHAMASK
@@ -88,30 +108,31 @@ void PS(float2 iTexCoord : TEXCOORD0,
         diffColor *= iColor;
     #endif
 
-    float3 lightColor;
-    float3 finalColor;
-    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
-
-    finalColor = diff * lightColor * diffColor.rgb;
+    #if PERPIXEL
+        // Per-pixel forward lighting
+        float3 lightColor;
+        float3 finalColor;
+        float diff;
     
-    #ifdef AMBIENT
-        finalColor += cAmbientColor * diffColor.rgb;
-        oColor = float4(GetFog(finalColor, iLightVec.w), diffColor.a);
-    #else
+        #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
+    
+        finalColor = diff * lightColor * diffColor.rgb;
         oColor = float4(GetLitFog(finalColor, iLightVec.w), diffColor.a);
+    #else
+        // Ambient & per-vertex lighting
+        float3 finalColor = iVertexLight.rgb * diffColor.rgb;
+        oColor = float4(GetFog(finalColor, iVertexLight.a), diffColor.a);
     #endif
 }

+ 31 - 8
Bin/CoreData/Shaders/HLSL/LitParticle.xml

@@ -1,9 +1,23 @@
 <shaders>
     <shader type="vs">
         <option name="VCol" define="VERTEXCOLOR" />
-        <variation name="Dir" define="DIRLIGHT" />
-        <variation name="Spot" define="SPOTLIGHT" />
-        <variation name="Point" define="POINTLIGHT" />
+        <variation name="" define="AMBIENT" />
+        <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="Dir">
+            <define name="DIRLIGHT" />
+            <define name="PERPIXEL" />
+        </variation>
+        <variation name="Spot">
+            <define name="SPOTLIGHT" />
+            <define name="PERPIXEL" />
+        </variation>
+        <variation name="Point">
+            <define name="POINTLIGHT" />
+            <define name="PERPIXEL" />
+        </variation>
         <option name="" /> <!-- Dummy option to separate the two variation groups -->
         <variation name="" />
         <variation name="Skinned" define="SKINNED" />
@@ -12,12 +26,21 @@
     </shader>
     <shader type="ps">
         <option name="Diff" define="DIFFMAP" />
-        <option name="AlphaMask" define="ALPHAMASK" require="DIFFMAP" />        
+        <option name="AlphaMask" define="ALPHAMASK" require="DIFFMAP" />
         <option name="VCol" define="VERTEXCOLOR" />
-        <option name="Ambient" define="AMBIENT" />
-        <variation name="Dir" define="DIRLIGHT" />
-        <variation name="Spot" define="SPOTLIGHT" />
-        <variation name="Point" define="POINTLIGHT" />
+        <variation name="" define="AMBIENT" />
+        <variation name="Dir">
+            <define name="DIRLIGHT" />
+            <define name="PERPIXEL" />
+        </variation>
+        <variation name="Spot">
+            <define name="SPOTLIGHT" />
+            <define name="PERPIXEL" />
+        </variation>
+        <variation name="Point">
+            <define name="POINTLIGHT" />
+            <define name="PERPIXEL" />
+        </variation>
         <option name="Mask" define="CUBEMASK" require="POINTLIGHT" />
     </shader>
 </shaders>

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

@@ -0,0 +1,311 @@
+#include "Uniforms.hlsl"
+#include "Samplers.hlsl"
+#include "Transform.hlsl"
+#include "ScreenPos.hlsl"
+#include "Lighting.hlsl"
+#include "Fog.hlsl"
+
+void VS(float4 iPos : POSITION,
+    float3 iNormal : NORMAL,
+    float2 iTexCoord : TEXCOORD0,
+    #ifdef NORMALMAP
+        float4 iTangent : TANGENT,
+    #endif
+    #ifdef SKINNED
+        float4 iBlendWeights : BLENDWEIGHT,
+        int4 iBlendIndices : BLENDINDICES,
+    #endif
+    #ifdef INSTANCED
+        float4x3 iModelInstance : TEXCOORD2,
+    #endif
+    #ifdef BILLBOARD
+        float2 iSize : TEXCOORD1,
+    #endif
+    out float2 oTexCoord : TEXCOORD0,
+    #ifdef PERPIXEL
+        out float4 oLightVec : TEXCOORD1,
+        #ifndef NORMALMAP
+            out float3 oNormal : TEXCOORD2,
+        #endif
+        #ifdef SPECULAR
+            out float3 oEyeVec : TEXCOORD3,
+        #endif
+        #ifdef SHADOW
+            #if defined(DIRLIGHT)
+                out float4 oShadowPos[4] : TEXCOORD4,
+            #elif defined(SPOTLIGHT)
+                out float4 oShadowPos : TEXCOORD4,
+            #else
+                out float3 oShadowPos : TEXCOORD4,
+            #endif
+        #endif
+        #ifdef SPOTLIGHT
+            out float4 oSpotPos : TEXCOORD5,
+        #endif
+        #ifdef POINTLIGHT
+            out float3 oCubeMaskVec : TEXCOORD5,
+        #endif
+    #else
+        out float4 oVertexLight : TEXCOORD1,
+        out float3 oNormal : TEXCOORD2,
+        #ifdef NORMALMAP
+            out float3 oTangent : TEXCOORD3,
+            out float3 oBitangent : TEXCOORD4,
+        #else
+            out float4 oScreenPos : TEXCOORD3,
+        #endif
+    #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);
+
+    #if defined(PERPIXEL) && defined(NORMALMAP)
+        float3 oNormal;
+        float3 oTangent;
+        float3 oBitangent;
+    #endif
+
+    oNormal = GetWorldNormal(modelMatrix);
+    #ifdef NORMALMAP
+        oTangent = GetWorldTangent(modelMatrix);
+        oBitangent = cross(oTangent, oNormal) * iTangent.w;
+    #endif
+
+    #ifdef PERPIXEL
+        // Per-pixel forward lighting
+        float4 projWorldPos = float4(worldPos, 1.0);
+
+        #ifdef DIRLIGHT
+            oLightVec = float4(cLightDir, GetDepth(oPos));
+        #else
+            oLightVec = float4((cLightPos.xyz - worldPos) * cLightPos.w, GetDepth(oPos));
+        #endif
+    
+        #ifdef SHADOW
+            // Shadow projection: transform from world space to shadow space
+            #if defined(DIRLIGHT)
+                oShadowPos[0] = mul(projWorldPos, cLightMatrices[0]);
+                oShadowPos[1] = mul(projWorldPos, cLightMatrices[1]);
+                oShadowPos[2] = mul(projWorldPos, cLightMatrices[2]);
+                oShadowPos[3] = mul(projWorldPos, cLightMatrices[3]);
+            #elif defined(SPOTLIGHT)
+                oShadowPos = mul(projWorldPos, cLightMatrices[1]);
+            #else
+                oShadowPos = worldPos - cLightPos.xyz;
+            #endif
+        #endif
+
+        #ifdef SPOTLIGHT
+            // Spotlight projection: transform from world space to projector texture coordinates
+            oSpotPos = mul(projWorldPos, cLightMatrices[0]);
+        #endif
+
+        #ifdef POINTLIGHT
+            oCubeMaskVec = mul(oLightVec.xyz, (float3x3)cLightMatrices[0]);
+        #endif
+
+        #ifdef NORMALMAP
+            float3x3 tbn = float3x3(oTangent, oBitangent, oNormal);
+            oLightVec.xyz = mul(tbn, oLightVec.xyz);
+            #ifdef SPECULAR
+                oEyeVec = mul(tbn, cCameraPos - worldPos);
+            #endif
+        #elif defined(SPECULAR)
+            oEyeVec = cCameraPos - worldPos;
+        #endif
+    #else
+        // Ambient & per-vertex lighting
+        oVertexLight = float4(GetAmbient(GetZonePos(worldPos)), GetDepth(oPos));
+
+        #ifdef NUMVERTEXLIGHTS
+            for (int i = 0; i < NUMVERTEXLIGHTS; ++i)
+                oVertexLight.rgb += GetVertexLight(i, worldPos, oNormal) * cVertexLights[i * 3].rgb;
+        #endif
+        
+        #ifndef NORMALMAP
+            oScreenPos = GetScreenPos(oPos);
+        #endif
+    #endif
+}
+
+void PS(float2 iTexCoord : TEXCOORD0,
+    #ifdef PERPIXEL
+        float4 iLightVec : TEXCOORD1,
+        #ifndef NORMALMAP
+            float3 iNormal : TEXCOORD2,
+        #endif
+        #ifdef SPECULAR
+            float3 iEyeVec : TEXCOORD3,
+        #endif
+        #ifdef SHADOW
+            #if defined(DIRLIGHT)
+                float4 iShadowPos[4] : TEXCOORD4,
+            #elif defined(SPOTLIGHT)
+                float4 iShadowPos : TEXCOORD4,
+            #else
+                float3 iShadowPos : TEXCOORD4,
+            #endif
+        #endif
+        #ifdef SPOTLIGHT
+            float4 iSpotPos : TEXCOORD5,
+        #endif
+        #ifdef CUBEMASK
+            float3 iCubeMaskVec : TEXCOORD5,
+        #endif
+    #else
+        float4 iVertexLight : TEXCOORD1,
+        float3 iNormal : TEXCOORD2,
+        #ifdef NORMALMAP
+            float3 iTangent : TEXCOORD3,
+            float3 iBitangent : TEXCOORD4,
+        #else
+            float4 iScreenPos : TEXCOORD3,
+        #endif
+    #endif
+    #if defined(PREPASS) && !defined(HWDEPTH)
+        out float4 oDepth : COLOR1,
+    #endif
+    #ifdef DEFERRED
+        out float4 oAlbedo : COLOR1,
+        out float4 oNormal : COLOR2,
+        #ifndef HWDEPTH
+            out float4 oDepth : COLOR3,
+        #endif
+    #endif
+    out float4 oColor : COLOR0)
+{
+    // Get material diffuse albedo
+    #ifdef DIFFMAP
+        float4 diffInput = tex2D(sDiffMap, iTexCoord);
+        #ifdef ALPHAMASK
+            if (diffInput.a < 0.5)
+                discard;
+        #endif
+        float4 diffColor = cMatDiffColor * diffInput;
+    #else
+        float4 diffColor = cMatDiffColor;
+    #endif
+    
+    // Get material specular albedo
+    #ifdef SPECMAP
+        float3 specColor = cMatSpecColor.rgb * tex2D(sSpecMap, iTexCoord).rgb;
+    #else
+        float3 specColor = cMatSpecColor.rgb;
+    #endif
+
+    #if defined(PERPIXEL)
+        // Per-pixel forward lighting
+        float3 lightDir;
+        float3 lightColor;
+        float3 finalColor;
+        float diff;
+
+        #ifdef NORMALMAP
+            float3 normal = DecodeNormal(tex2D(sNormalMap, iTexCoord));
+        #else
+            float3 normal = normalize(iNormal);
+        #endif
+
+        #ifdef DIRLIGHT
+            #ifdef NORMALMAP
+                lightDir = normalize(iLightVec.xyz);
+            #else
+                lightDir = iLightVec.xyz;
+            #endif
+            diff = GetDiffuseDir(normal, lightDir);
+        #else
+            diff = GetDiffusePointOrSpot(normal, iLightVec.xyz, lightDir);
+        #endif
+    
+        #ifdef SHADOW
+            #if defined(DIRLIGHT)
+                float4 shadowPos = GetDirShadowPos(iShadowPos, iLightVec.w);
+                diff *= saturate(GetShadow(shadowPos) + GetShadowFade(iLightVec.w));
+            #elif defined(SPOTLIGHT)
+                diff *= GetShadow(iShadowPos);
+            #else
+                diff *= GetCubeShadow(iShadowPos);
+            #endif
+        #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 SPECULAR
+            float spec = GetSpecular(normal, iEyeVec, lightDir, cMatSpecColor.a);
+            finalColor = diff * lightColor * (diffColor.rgb + spec * specColor * cLightColor.a);
+        #else
+            finalColor = diff * lightColor * diffColor.rgb;
+        #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
+    #elif defined(PREPASS)
+        // Fill light pre-pass G-Buffer
+        #ifdef NORMALMAP
+            float3x3 tbn = float3x3(iTangent, iBitangent, iNormal);
+            float3 normal = mul(DecodeNormal(tex2D(sNormalMap, iTexCoord.xy)), tbn);
+        #else
+            float3 normal = iNormal;
+        #endif
+
+        float specPower = cMatSpecColor.a / 255.0;
+
+        oColor = float4(normal * 0.5 + 0.5, specPower);
+        #ifndef HWDEPTH
+            oDepth = iVertexLight.a;
+        #endif
+    #elif defined(DEFERRED)
+        // Fill deferred G-buffer
+        #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
+
+        float specIntensity = specColor.g;
+        float specPower = cMatSpecColor.a / 255.0;
+
+        oColor = float4(GetFog(iVertexLight.rgb * diffColor.rgb, iVertexLight.a), 1.0);
+        oAlbedo = GetFogFactor(iVertexLight.a) * float4(diffColor.rgb, specIntensity);
+        oNormal = float4(normal * 0.5 + 0.5, specPower);
+        #ifndef HWDEPTH
+            oDepth = iVertexLight.a;
+        #endif
+    #else
+        // Ambient & per-vertex lighting
+        float3 finalColor = iVertexLight.rgb * diffColor.rgb;
+
+        #ifdef MATERIAL
+            // Add light pre-pass accumulation result
+            // 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));
+
+            finalColor += lightInput.rgb * diffColor.rgb + lightSpecColor * specColor;
+        #endif
+
+        oColor = float4(GetFog(finalColor, iVertexLight.a), diffColor.a);
+    #endif
+}

+ 58 - 0
Bin/CoreData/Shaders/HLSL/LitSolid.xml

@@ -0,0 +1,58 @@
+<shaders>
+    <shader type="vs">
+        <option name="Normal" define="NORMALMAP" />
+        <variation name="" define="AMBIENT" />
+        <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="Dir">
+            <define name="DIRLIGHT" />
+            <define name="PERPIXEL" />
+        </variation>
+        <variation name="Spot">
+            <define name="SPOTLIGHT" />
+            <define name="PERPIXEL" />
+        </variation>
+        <variation name="Point">
+            <define name="POINTLIGHT" />
+            <define name="PERPIXEL" />
+        </variation>
+        <option name="Spec" define="SPECULAR" require="PERPIXEL" />
+        <option name="Shadow" define="SHADOW" require="PERPIXEL" />
+        <variation name="" />
+        <variation name="Skinned" define="SKINNED" />
+        <variation name="Instanced" define="INSTANCED" require="SM3" />
+        <variation name="Billboard" define="BILLBOARD" />
+    </shader>
+    <shader type="ps">
+        <option name="Diff" define="DIFFMAP" />
+        <option name="Normal" define="NORMALMAP" require="DIFFMAP" />
+        <option name="SpecMap" define="SPECMAP" require="DIFFMAP" />
+        <option name="AlphaMask" define="ALPHAMASK" require="DIFFMAP" />        
+        <option name="Ambient" define="AMBIENT" require="PERPIXEL" />
+        <variation name="" define="AMBIENT" />        
+        <variation name="Dir">
+            <define name="DIRLIGHT" />
+            <define name="PERPIXEL" />
+        </variation>
+        <variation name="Spot">
+            <define name="SPOTLIGHT" />
+            <define name="PERPIXEL" />
+        </variation>
+        <variation name="Point">
+            <define name="POINTLIGHT" />
+            <define name="PERPIXEL" />
+        </variation>
+        <variation name="Prepass" define="PREPASS" />
+        <variation name="Material" define="MATERIAL" exclude="Normal" />
+        <variation name="Deferred" define="DEFERRED" />
+        <option name="HW" define="HWDEPTH" require="PREPASS" />
+        <option name="HW" define="HWDEPTH" require="DEFERRED" />
+        <option name="Mask" define="CUBEMASK" require="POINTLIGHT" />
+        <option name="Spec" define="SPECULAR" require="PERPIXEL" />
+        <option name="Shadow" define="SHADOW" require="PERPIXEL" />
+        <option name="LQ" define="LQSHADOW" require="HWSHADOW" />
+        <option name="HW" define="HWSHADOW" require="SHADOW" />
+    </shader>
+</shaders>

+ 0 - 86
Bin/CoreData/Shaders/HLSL/Material.hlsl

@@ -1,86 +0,0 @@
-#pragma warning(disable:3557)
-
-#include "Uniforms.hlsl"
-#include "Samplers.hlsl"
-#include "Transform.hlsl"
-#include "ScreenPos.hlsl"
-#include "Lighting.hlsl"
-#include "Fog.hlsl"
-
-void VS(float4 iPos : POSITION,   
-    #ifdef NUMVERTEXLIGHTS
-        float3 iNormal : NORMAL,
-    #endif
-    #ifdef VERTEXCOLOR
-        float4 iColor : COLOR0,
-    #endif
-    #ifdef SKINNED
-        float4 iBlendWeights : BLENDWEIGHT,
-        int4 iBlendIndices : BLENDINDICES,
-    #endif
-    #ifdef INSTANCED
-        float4x3 iModelInstance : TEXCOORD2,
-    #endif
-    float2 iTexCoord : TEXCOORD0,
-    out float2 oTexCoord : TEXCOORD0,
-    out float4 oVertexLighting : TEXCOORD1,
-    out float4 oScreenPos : TEXCOORD2,
-    #ifdef VERTEXCOLOR
-        out float4 oColor : COLOR0,
-    #endif
-    out float4 oPos : POSITION)
-{
-    float4x3 modelMatrix = iModelMatrix;
-    float3 worldPos = GetWorldPos(modelMatrix);
-    oPos = GetClipPos(worldPos);
-    oTexCoord = GetTexCoord(iTexCoord);
-    oScreenPos = GetScreenPos(oPos);
-
-    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
-
-    #ifdef VERTEXCOLOR
-        oColor = iColor;
-    #endif
-}
-
-void PS(float2 iTexCoord : TEXCOORD0,
-    float4 iVertexLighting : TEXCOORD1,
-    float4 iScreenPos : TEXCOORD2,
-    #ifdef VERTEXCOLOR
-        float4 iColor : COLOR0,
-    #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 SPECMAP
-        float3 specColor = cMatSpecColor.rgb * tex2D(sSpecMap, iTexCoord).g;
-    #else
-        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.rgb + lightInput.rgb) * diffColor + lightSpecColor * specColor;
-    oColor = float4(GetFog(finalColor, iVertexLighting.a), 1.0);
-}

+ 0 - 22
Bin/CoreData/Shaders/HLSL/Material.xml

@@ -1,22 +0,0 @@
-<shaders>
-    <shader type="vs">
-        <option name="VCol" define="VERTEXCOLOR" />
-        <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 type="ps">
-        <option name="Diff" define="DIFFMAP" />
-        <option name="SpecMap" define="SPECMAP" />
-        <option name="AlphaMask" define="ALPHAMASK" include="Diff" />
-        <option name="VCol" define="VERTEXCOLOR" />
-    </shader>
-</shaders>

+ 0 - 81
Bin/CoreData/Shaders/HLSL/Prepass.hlsl

@@ -1,81 +0,0 @@
-#include "Uniforms.hlsl"
-#include "Samplers.hlsl"
-#include "Transform.hlsl"
-
-void VS(float4 iPos : POSITION,
-    float3 iNormal : NORMAL,
-    #ifdef NORMALMAP
-        float4 iTangent : TANGENT0,
-    #endif
-    float2 iTexCoord : TEXCOORD0,
-    #ifdef SKINNED
-        float4 iBlendWeights : BLENDWEIGHT,
-        int4 iBlendIndices : BLENDINDICES,
-    #endif
-    #ifdef INSTANCED
-        float4x3 iModelInstance : TEXCOORD2,
-    #endif
-    #ifdef HWDEPTH
-        out float2 oTexCoord : TEXCOORD0,
-    #else
-        out float3 oTexCoord : TEXCOORD0,
-    #endif
-    out float3 oNormal : TEXCOORD1,
-    #ifdef NORMALMAP
-        out float3 oTangent : TEXCOORD2,
-        out float3 oBitangent : TEXCOORD3,
-    #endif
-    out float4 oPos : POSITION)
-{
-    float4x3 modelMatrix = iModelMatrix;
-    float3 worldPos = GetWorldPos(modelMatrix);
-    oPos = GetClipPos(worldPos);
-    #ifdef HWDEPTH
-        oTexCoord = GetTexCoord(iTexCoord);
-    #else
-        oTexCoord = float3(GetTexCoord(iTexCoord), GetDepth(oPos));
-    #endif
-
-    oNormal = GetWorldNormal(modelMatrix);
-    #ifdef NORMALMAP
-        oTangent = GetWorldTangent(modelMatrix);
-        oBitangent = cross(oTangent, oNormal) * iTangent.w;
-    #endif
-}
-
-void PS(
-    #ifdef HWDEPTH
-        float2 iTexCoord : TEXCOORD0,
-    #else
-        float3 iTexCoord : TEXCOORD0,
-    #endif
-    float3 iNormal : TEXCOORD1,
-    #ifdef NORMALMAP
-        float3 iTangent : TEXCOORD2,
-        float3 iBitangent : TEXCOORD3,
-    #endif
-    #ifndef HWDEPTH
-        out float4 oDepth : COLOR1,
-    #endif
-    out float4 oNormal : COLOR0)
-{
-    #ifdef ALPHAMASK
-        float4 diffInput = tex2D(sDiffMap, iTexCoord.xy);
-        if (diffInput.a < 0.5)
-            discard;
-    #endif
-
-    #ifdef NORMALMAP
-        float3x3 tbn = float3x3(iTangent, iBitangent, iNormal);
-        float3 normal = mul(DecodeNormal(tex2D(sNormalMap, iTexCoord.xy)), tbn);
-    #else
-        float3 normal = iNormal;
-    #endif
-
-    float specPower = cMatSpecColor.a / 255.0;
-
-    oNormal = float4(normal * 0.5 + 0.5, specPower);
-    #ifndef HWDEPTH
-        oDepth = iTexCoord.z;
-    #endif
-}

+ 0 - 14
Bin/CoreData/Shaders/HLSL/Prepass.xml

@@ -1,14 +0,0 @@
-<shaders>
-    <shader 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 type="ps">
-        <option name="Normal" define="NORMALMAP" />
-        <option name="AlphaMask" define="ALPHAMASK" />
-        <option name="HW" define="HWDEPTH" />
-    </shader>
-</shaders>

+ 4 - 11
Bin/CoreData/Shaders/HLSL/Shadow.hlsl

@@ -10,25 +10,18 @@ void VS(float4 iPos : POSITION,
     #ifdef INSTANCED
         float4x3 iModelInstance : TEXCOORD2,
     #endif
-    #ifdef ALPHAMASK
-        float2 iTexCoord : TEXCOORD0,
-        out float2 oTexCoord : TEXCOORD0,
-    #endif
+    float2 iTexCoord : TEXCOORD0,
+    out float2 oTexCoord : TEXCOORD0,
     out float4 oPos : POSITION)
 {
     float4x3 modelMatrix = iModelMatrix;
     float3 worldPos = GetWorldPos(modelMatrix);
     oPos = GetClipPos(worldPos);
-
-    #ifdef ALPHAMASK
-        oTexCoord = GetTexCoord(iTexCoord);
-    #endif
+    oTexCoord = GetTexCoord(iTexCoord);
 }
 
 void PS(
-    #ifdef ALPHAMASK
-        float2 iTexCoord : TEXCOORD0,
-    #endif
+    float2 iTexCoord : TEXCOORD0,
     out float4 oColor : COLOR0)
 {
     #ifdef ALPHAMASK

+ 0 - 1
Bin/CoreData/Shaders/HLSL/Shadow.xml

@@ -1,6 +1,5 @@
 <shaders>
     <shader type="vs">
-        <option name="Mask" define="ALPHAMASK" />
         <variation name="" />
         <variation name="Skinned" define="SKINNED" />
         <variation name="Instanced" define="INSTANCED" require="SM3" />

+ 1 - 1
Bin/CoreData/Shaders/HLSL/Uniforms.hlsl

@@ -17,7 +17,7 @@ uniform float3 cViewUpVector;
 uniform float4x3 cZone;
 uniform float4x4 cLightMatrices[4];
 uniform float4x3 cSkinMatrices[64];
-uniform float4 cVertexLights[6*3];
+uniform float4 cVertexLights[4*3];
 
 // Pixel shader uniforms
 uniform float3 cAmbientColor;

+ 6 - 6
Bin/CoreData/Techniques/Diff.xml

@@ -1,9 +1,9 @@
 <technique>
-    <pass name="base" vs="Ambient" ps="Ambient_Diff" />
-    <pass name="litbase" vs="ForwardLit" ps="ForwardLit_DiffAmbient" />
-    <pass name="light" vs="ForwardLit" ps="ForwardLit_Diff" depthtest="equal" depthwrite="false" blend="add" />
+    <pass name="base" vs="LitSolid" ps="LitSolid_Diff" />
+    <pass name="litbase" vs="LitSolid" ps="LitSolid_DiffAmbient" />
+    <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_DiffMaterial" depthtest="equal" depthwrite="false" />
+    <pass name="deferred" vs="LitSolid" ps="LitSolid_DiffDeferred" />
     <pass name="shadow" vs="Shadow" ps="Shadow" />
-    <pass name="prepass" vs="Prepass" ps="Prepass" />
-    <pass name="material" vs="Material" ps="Material_Diff" depthtest="equal" depthwrite="false" />
-    <pass name="deferred" vs="Deferred" ps="Deferred_Diff" />
 </technique>

+ 2 - 2
Bin/CoreData/Techniques/DiffAlpha.xml

@@ -1,5 +1,5 @@
 <technique>
-    <pass name="base" vs="Ambient" ps="Ambient_Diff" depthwrite="false" blend="alpha" />
-    <pass name="light" vs="ForwardLit" ps="ForwardLit_Diff" depthwrite="false" blend="addalpha" />
+    <pass name="base" vs="LitSolid" ps="LitSolid_Diff" depthwrite="false" blend="alpha" />
+    <pass name="light" vs="LitSolid" ps="LitSolid_Diff" depthwrite="false" blend="addalpha" />
     <pass name="shadow" vs="Shadow" ps="Shadow" />
 </technique>

+ 7 - 7
Bin/CoreData/Techniques/DiffAlphaMask.xml

@@ -1,9 +1,9 @@
 <technique>
-    <pass name="base" vs="Ambient" ps="Ambient_DiffAlphaMask" alphamask="true" />
-    <pass name="litbase" vs="ForwardLit" ps="ForwardLit_DiffAlphaMaskAmbient" alphamask="true" />
-    <pass name="light" vs="ForwardLit" ps="ForwardLit_DiffAlphaMask"  depthtest="equal" depthwrite="false" blend="add" alphamask="true" />
-    <pass name="shadow" vs="Shadow_Mask" ps="Shadow_AlphaMask" alphamask="true" />
-    <pass name="prepass" vs="Prepass" ps="Prepass_AlphaMask" alphamask="true" />
-    <pass name="material" vs="Material" ps="Material_DiffAlphaMask" depthtest="equal" depthwrite="false" alphamask="true" />
-    <pass name="deferred" vs="Deferred" ps="Deferred_DiffAlphaMask" alphamask="true" />
+    <pass name="base" vs="LitSolid" ps="LitSolid_DiffAlphaMask" alphamask="true" />
+    <pass name="litbase" vs="LitSolid" ps="LitSolid_DiffAlphaMaskAmbient" alphamask="true" />
+    <pass name="light" vs="LitSolid" ps="LitSolid_DiffAlphaMask"  depthtest="equal" depthwrite="false" blend="add" alphamask="true" />
+    <pass name="prepass" vs="LitSolid" ps="LitSolid_DiffAlphaMaskPrepass" alphamask="true" />
+    <pass name="material" vs="LitSolid" ps="LitSolid_DiffAlphaMaskMaterial" depthtest="equal" depthwrite="false" alphamask="true" />
+    <pass name="deferred" vs="LitSolid" ps="LitSolid_DiffAlphaMaskDeferred" alphamask="true" />
+    <pass name="shadow" vs="Shadow" ps="Shadow_AlphaMask" alphamask="true" />
 </technique>

+ 1 - 1
Bin/CoreData/Techniques/DiffLitParticleAlpha.xml

@@ -1,5 +1,5 @@
 <technique>
-    <pass name="base" vs="Ambient" ps="Ambient_Diff" depthwrite="false" blend="alpha" />
+    <pass name="base" vs="LitParticle" ps="LitParticle_Diff" depthwrite="false" blend="alpha" />
     <pass name="light" vs="LitParticle" ps="LitParticle_Diff" depthwrite="false" blend="addalpha" />
     <pass name="shadow" vs="Shadow" ps="Shadow" />
 </technique>

+ 6 - 6
Bin/CoreData/Techniques/DiffNormal.xml

@@ -1,9 +1,9 @@
 <technique>
-    <pass name="base" vs="Ambient" ps="Ambient_Diff" />
-    <pass name="litbase" vs="ForwardLit_Normal" ps="ForwardLit_DiffNormalAmbient" />
-    <pass name="light" vs="ForwardLit_Normal" ps="ForwardLit_DiffNormal" depthtest="equal" depthwrite="false" blend="add" />
+    <pass name="base" vs="LitSolid" ps="LitSolid_Diff" />
+    <pass name="litbase" vs="LitSolid_Normal" ps="LitSolid_DiffNormalAmbient" />
+    <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" ps="LitSolid_DiffMaterial" depthtest="equal" depthwrite="false" />
+    <pass name="deferred" vs="LitSolid_Normal" ps="LitSolid_DiffNormalDeferred" />
     <pass name="shadow" vs="Shadow" ps="Shadow" />
-    <pass name="prepass" vs="Prepass_Normal" ps="Prepass_Normal" />
-    <pass name="material" vs="Material" ps="Material_Diff" depthtest="equal" depthwrite="false" />
-    <pass name="deferred" vs="Deferred_Normal" ps="Deferred_DiffNormal" />
 </technique>

+ 2 - 2
Bin/CoreData/Techniques/DiffNormalAlpha.xml

@@ -1,5 +1,5 @@
 <technique>
-    <pass name="base" vs="Ambient" ps="Ambient_Diff" depthwrite="false" blend="alpha" />
-    <pass name="light" vs="ForwardLit_Normal" ps="ForwardLit_DiffNormal" depthwrite="false" blend="addalpha" />
+    <pass name="base" vs="LitSolid" ps="LitSolid_Diff" depthwrite="false" blend="alpha" />
+    <pass name="light" vs="LitSolid_Normal" ps="LitSolid_DiffNormal" depthwrite="false" blend="addalpha" />
     <pass name="shadow" vs="Shadow" ps="Shadow" />
 </technique>

+ 7 - 7
Bin/CoreData/Techniques/DiffNormalAlphaMask.xml

@@ -1,9 +1,9 @@
 <technique>
-    <pass name="base" vs="Ambient" ps="Ambient_DiffAlphaMask" alphamask="true" />
-    <pass name="litbase" vs="ForwardLit_Normal" ps="ForwardLit_DiffNormalAlphaMaskAmbient" alphamask="true" />
-    <pass name="light" vs="ForwardLit_Normal" ps="ForwardLit_DiffNormalAlphaMask" depthtest="equal" depthwrite="false" blend="add" alphamask="true" />
-    <pass name="shadow" vs="Shadow_Mask" ps="Shadow_AlphaMask" alphamask="true" />
-    <pass name="prepass" vs="Prepass_Normal" ps="Prepass_NormalAlphaMask" alphamask="true" />
-    <pass name="material" vs="Material" ps="Material_DiffAlphaMask" depthtest="equal" depthwrite="false" alphamask="true" />
-    <pass name="deferred" vs="Deferred_Normal" ps="Deferred_DiffNormalAlphaMask" alphamask="true" />
+    <pass name="base" vs="LitSolid" ps="LitSolid_DiffAlphaMask" alphamask="true" />
+    <pass name="litbase" vs="LitSolid_Normal" ps="LitSolid_DiffNormalAlphaMaskAmbient" alphamask="true" />
+    <pass name="light" vs="LitSolid_Normal" ps="LitSolid_DiffNormalAlphaMask" depthtest="equal" depthwrite="false" blend="add" alphamask="true" />
+    <pass name="prepass" vs="LitSolid_Normal" ps="LitSolid_NormalAlphaMaskPrepass" alphamask="true" />
+    <pass name="material" vs="LitSolid" ps="LitSolid_DiffAlphaMaskMaterial" depthtest="equal" depthwrite="false" alphamask="true" />
+    <pass name="deferred" vs="LitSolid_Normal" ps="LitSolid_DiffNormalAlphaMaskDeferred" alphamask="true" />
+    <pass name="shadow" vs="Shadow" ps="Shadow_AlphaMask" alphamask="true" />
 </technique>

+ 6 - 6
Bin/CoreData/Techniques/NoTexture.xml

@@ -1,9 +1,9 @@
 <technique>
-    <pass name="base" vs="Ambient" ps="Ambient" />
-    <pass name="litbase" vs="ForwardLit" ps="ForwardLit_Ambient" />
-    <pass name="light" vs="ForwardLit" ps="ForwardLit" depthtest="equal" depthwrite="false" blend="add" />
+    <pass name="base" vs="LitSolid" ps="LitSolid" />
+    <pass name="litbase" vs="LitSolid" ps="LitSolid_Ambient" />
+    <pass name="light" vs="LitSolid" ps="LitSolid" depthtest="equal" depthwrite="false" blend="add" />
+    <pass name="prepass" vs="LitSolid" ps="LitSolid_Prepass" />
+    <pass name="material" vs="LitSolid" ps="LitSolid_Material" depthtest="equal" depthwrite="false" />
+    <pass name="deferred" vs="LitSolid" ps="LitSolid_Deferred" />
     <pass name="shadow" vs="Shadow" ps="Shadow" />
-    <pass name="prepass" vs="Prepass" ps="Prepass" />
-    <pass name="material" vs="Material" ps="Material" depthtest="equal" depthwrite="false" />
-    <pass name="deferred" vs="Deferred" ps="Deferred" />
 </technique>

+ 2 - 2
Bin/CoreData/Techniques/NoTextureAlpha.xml

@@ -1,4 +1,4 @@
 <technique>
-    <pass name="base" vs="Ambient" ps="Ambient" depthwrite="false" blend="alpha" />
-    <pass name="light" vs="ForwardLit" ps="ForwardLit" depthwrite="false" blend="addalpha" />
+    <pass name="base" vs="LitSolid" ps="LitSolid" depthwrite="false" blend="alpha" />
+    <pass name="light" vs="LitSolid" ps="LitSolid" depthwrite="false" blend="addalpha" />
 </technique>

+ 1 - 1
Docs/Reference.dox

@@ -618,7 +618,7 @@ The purposes of the different passes are:
 
 By default draw calls within passes are sorted by render state, but transparent base and light passes, as well as the postalpha pass, are sorted by distance back to front.
 
-Note that the technique does not need to enumerate shaders used for different geometry types (non-skinned, skinned, instanced, billboard) and different per-vertex and per-pixel light combinations. Instead specific hardcoded shader variations are assumed to exist. See the files Ambient.xml and ForwardLit.xml in either Bin/CoreData/Shaders/HLSL or Bin/CoreData/Shaders/GLSL to see which variations are required.
+Note that the technique does not need to enumerate shaders used for different geometry types (non-skinned, skinned, instanced, billboard) and different per-vertex and per-pixel light combinations. Instead specific hardcoded shader variations are assumed to exist. See the file LitSolid.xml in either Bin/CoreData/Shaders/HLSL or Bin/CoreData/Shaders/GLSL to see which variations are required.
 
 The optional "litbase" pass reduces draw call count by combining ambient lighting with the first per-pixel light affecting an object. However, it has intentional limitations to not require too many shader permutations: there must be no vertex lights affecting the object, and the ambient lighting can not have a gradient. In case of excessive overdraw, it is possibly better not to define it, but instead allow the base pass (which is computationally very lightweight) to run first, initializing the Z buffer for later passes.
 

+ 1 - 1
Engine/Graphics/Drawable.h

@@ -37,7 +37,7 @@ static const unsigned DEFAULT_LIGHTMASK = M_MAX_UNSIGNED;
 static const unsigned DEFAULT_SHADOWMASK = M_MAX_UNSIGNED;
 static const unsigned DEFAULT_ZONEMASK = M_MAX_UNSIGNED;
 static const int DRAWABLES_PER_WORK_ITEM = 16;
-static const int MAX_VERTEX_LIGHTS = 6;
+static const int MAX_VERTEX_LIGHTS = 4;
 
 class Camera;
 class Geometry;

+ 0 - 1
Engine/Graphics/Renderer.cpp

@@ -1556,7 +1556,6 @@ void Renderer::LoadPassShaders(Technique* tech, PassType type, bool allowShadows
     if (type == PASS_PREPASS || type == PASS_DEFERRED)
     {
         unsigned hwDepth = graphics_->GetHardwareDepthSupport() ? 1 : 0;
-        vertexShaderName += hwVariations[hwDepth];
         pixelShaderName += hwVariations[hwDepth];
     }
     

+ 0 - 2
Engine/Graphics/Renderer.h

@@ -78,8 +78,6 @@ enum VertexLightVSVariation
     VLVS_2LIGHTS,
     VLVS_3LIGHTS,
     VLVS_4LIGHTS,
-    VLVS_5LIGHTS,
-    VLVS_6LIGHTS,
     MAX_VERTEXLIGHT_VS_VARIATIONS
 };
 

+ 6 - 1
Tools/ShaderCompiler/ShaderCompiler.cpp

@@ -389,7 +389,12 @@ void CompileShader(const String& fileName)
     for (List<CompiledVariation>::Iterator i = variations_.Begin(); i != variations_.End(); ++i)
     {
         if (!i->errorMsg_.Empty())
-            ErrorExit("Failed to compile shader " + i->name_ + ": " + i->errorMsg_);
+        {
+            if (i->type_ == VS)
+                ErrorExit("Failed to compile vertex shader " + i->name_ + ": " + i->errorMsg_);
+            else
+                ErrorExit("Failed to compile pixel shader " + i->name_ + ": " + i->errorMsg_);
+        }
     }
 }