diff options
author | Fire_Head <Fire-Head@users.noreply.github.com> | 2020-08-27 19:35:14 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-08-27 19:35:14 +0200 |
commit | a8999bbf38cae233e39b5995118fa03bca7894ef (patch) | |
tree | ada9bd1935512f4b46fe6b4f42d9160eb2281262 /src/extras/shaders/lighting.h | |
parent | bike shooting fix + trace temp fix (diff) | |
parent | update librw (diff) | |
download | re3-a8999bbf38cae233e39b5995118fa03bca7894ef.tar re3-a8999bbf38cae233e39b5995118fa03bca7894ef.tar.gz re3-a8999bbf38cae233e39b5995118fa03bca7894ef.tar.bz2 re3-a8999bbf38cae233e39b5995118fa03bca7894ef.tar.lz re3-a8999bbf38cae233e39b5995118fa03bca7894ef.tar.xz re3-a8999bbf38cae233e39b5995118fa03bca7894ef.tar.zst re3-a8999bbf38cae233e39b5995118fa03bca7894ef.zip |
Diffstat (limited to 'src/extras/shaders/lighting.h')
-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; +} |