armory/Shaders/std/sss.glsl

27 lines
1.1 KiB
Plaintext
Raw Normal View History

2017-11-17 16:15:35 +01:00
2017-05-23 15:01:56 +02:00
// Separable SSS Transmittance Function, ref to sss_pass
2019-01-24 12:47:51 +01:00
vec3 SSSSTransmittance(mat4 LWVP, vec3 p, vec3 n, vec3 l, float lightFar, sampler2DShadow shadowMap) {
2017-11-17 16:15:35 +01:00
const float translucency = 1.0;
vec4 shrinkedPos = vec4(p - 0.005 * n, 1.0);
vec4 shadowPos = LWVP * shrinkedPos;
float scale = 8.25 * (1.0 - translucency) / (sssWidth / 10.0);
2019-01-24 12:47:51 +01:00
float d1 = texture(shadowMap, vec3(shadowPos.xy / shadowPos.w, shadowPos.z)).r; // 'd1' has a range of 0..1
2017-11-17 16:15:35 +01:00
float d2 = shadowPos.z; // 'd2' has a range of 0..'lightFarPlane'
d1 *= lightFar; // So we scale 'd1' accordingly:
2017-05-23 15:01:56 +02:00
float d = scale * abs(d1 - d2);
float dd = -d * d;
vec3 profile = vec3(0.233, 0.455, 0.649) * exp(dd / 0.0064) +
vec3(0.1, 0.336, 0.344) * exp(dd / 0.0484) +
vec3(0.118, 0.198, 0.0) * exp(dd / 0.187) +
vec3(0.113, 0.007, 0.007) * exp(dd / 0.567) +
vec3(0.358, 0.004, 0.0) * exp(dd / 1.99) +
vec3(0.078, 0.0, 0.0) * exp(dd / 7.41);
2017-11-17 16:15:35 +01:00
return profile * clamp(0.3 + dot(l, -n), 0.0, 1.0);
2017-05-23 15:01:56 +02:00
}
2017-11-17 16:15:35 +01:00
vec3 SSSSTransmittanceCube(float translucency, vec4 shadowPos, vec3 n, vec3 l, float lightFar) {
2017-05-23 15:01:56 +02:00
// TODO
2017-11-25 20:09:55 +01:00
return vec3(0.0);
2017-05-23 15:01:56 +02:00
}