summaryrefslogtreecommitdiffstats
path: root/tooner_lighting.cginc
diff options
context:
space:
mode:
Diffstat (limited to 'tooner_lighting.cginc')
-rw-r--r--tooner_lighting.cginc46
1 files changed, 44 insertions, 2 deletions
diff --git a/tooner_lighting.cginc b/tooner_lighting.cginc
index e976132..e5bcd13 100644
--- a/tooner_lighting.cginc
+++ b/tooner_lighting.cginc
@@ -28,6 +28,47 @@
#ifndef TOONER_LIGHTING
#define TOONER_LIGHTING
+float3 Shade4PointLightsWrapped(
+ float4 lightPosX, float4 lightPosY, float4 lightPosZ,
+ float3 lightColor0, float3 lightColor1, float3 lightColor2, float3 lightColor3,
+ float4 lightAttenSq,
+ float3 pos, float3 normal,
+ float wrapFactor)
+{
+ // Compute the difference between the vertex position and light positions
+ float4 toLightX = lightPosX - pos.x;
+ float4 toLightY = lightPosY - pos.y;
+ float4 toLightZ = lightPosZ - pos.z;
+
+ float4 lengthSq = 0;
+ lengthSq += toLightX * toLightX;
+ lengthSq += toLightY * toLightY;
+ lengthSq += toLightZ * toLightZ;
+
+ float4 ndotl = 0;
+ ndotl += toLightX * normal.x;
+ ndotl += toLightY * normal.y;
+ ndotl += toLightZ * normal.z;
+
+ // Apply wrapped lighting correction
+ // https://www.iro.umontreal.ca/~derek/files/jgt_wrap_final.pdf
+ //float4 wrapped = (ndotl + 1) * (ndotl + 1) * .25;
+ float4 wrapped = pow(max(1E-4, (ndotl + wrapFactor) / (1 + wrapFactor)), 1 + wrapFactor);
+ //float4 wrapped = pow((ndotl + 1) / (2), 2);
+ float4 corr = rsqrt(lengthSq);
+ ndotl = max(0, wrapped) * corr;
+
+ // Compute attenuation
+ float4 atten = 1.0 / (1.0 + lengthSq * lightAttenSq);
+ float4 diff = ndotl * atten;
+
+ // Compute final color
+ return diff.x * lightColor0 +
+ diff.y * lightColor1 +
+ diff.z * lightColor2 +
+ diff.w * lightColor3;
+}
+
void getVertexLightColor(inout v2f i)
{
#if defined(VERTEXLIGHT_ON)
@@ -37,13 +78,14 @@ void getVertexLightColor(inout v2f i)
float3 flat_normal = normalize(
(1.0 / _Flatten_Mesh_Normals_Str) * i.normal +
_Flatten_Mesh_Normals_Str * view_dir);
- i.vertexLightColor = Shade4PointLights(
+ i.vertexLightColor = Shade4PointLightsWrapped(
unity_4LightPosX0, unity_4LightPosY0, unity_4LightPosZ0,
unity_LightColor[0].rgb,
unity_LightColor[1].rgb,
unity_LightColor[2].rgb,
unity_LightColor[3].rgb,
- unity_4LightAtten0, i.worldPos, flat ? flat_normal : i.normal
+ unity_4LightAtten0, i.worldPos, flat ? flat_normal : i.normal,
+ 1
);
#endif
}