diff options
author | aap <aap@papnet.eu> | 2020-08-19 16:10:22 +0200 |
---|---|---|
committer | aap <aap@papnet.eu> | 2020-08-19 16:10:22 +0200 |
commit | 827ba62671c6e2efe96259a0f130a4d167d14c2a (patch) | |
tree | 53bbc586e9a44d19d0cd1a67a69e9c49d9625662 /src/extras/shaders/lighting.h | |
parent | changing silly streaming memory limit (diff) | |
download | re3-827ba62671c6e2efe96259a0f130a4d167d14c2a.tar re3-827ba62671c6e2efe96259a0f130a4d167d14c2a.tar.gz re3-827ba62671c6e2efe96259a0f130a4d167d14c2a.tar.bz2 re3-827ba62671c6e2efe96259a0f130a4d167d14c2a.tar.lz re3-827ba62671c6e2efe96259a0f130a4d167d14c2a.tar.xz re3-827ba62671c6e2efe96259a0f130a4d167d14c2a.tar.zst re3-827ba62671c6e2efe96259a0f130a4d167d14c2a.zip |
Diffstat (limited to '')
-rw-r--r-- | src/extras/shaders/lighting.h | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/src/extras/shaders/lighting.h b/src/extras/shaders/lighting.h new file mode 100644 index 00000000..4b081962 --- /dev/null +++ b/src/extras/shaders/lighting.h @@ -0,0 +1,44 @@ +struct Light +{ + float4 color; // and radius + float4 position; // and -cos(angle) + float4 direction; // and falloff clamp +}; + +float3 DoDirLight(Light L, float3 N) +{ + float l = max(0.0, dot(N, -L.direction.xyz)); + return l*L.color.xyz; +} + +float3 DoDirLightSpec(Light L, float3 N, float3 V, float power) +{ + return pow(saturate(dot(N, normalize(V + -L.direction.xyz))), power)*L.color.xyz; +} + +float3 DoPointLight(Light L, float3 V, float3 N) +{ + // As on PS2 + float3 dir = V - L.position.xyz; + float dist = length(dir); + float atten = max(0.0, (1.0 - dist/L.color.w)); + float l = max(0.0, dot(N, -normalize(dir))); + return l*L.color.xyz*atten; +} + +float3 DoSpotLight(Light L, float3 V, float3 N) +{ + // As on PS2 + float3 dir = V - L.position.xyz; + float dist = length(dir); + float atten = max(0.0, (1.0 - dist/L.color.w)); + dir /= dist; + float l = max(0.0, dot(N, -dir)); + float pcos = dot(dir, L.direction.xyz); // cos to point + float ccos = -L.position.w; // cos of cone + float falloff = (pcos-ccos)/(1.0-ccos); + if(falloff < 0) // outside of cone + l = 0; + l *= max(falloff, L.direction.w); // falloff clamp + return l*L.color.xyz*atten; +} |