26 lines
1.2 KiB
GLSL
26 lines
1.2 KiB
GLSL
// Separable SSS Transmittance Function, ref to sss_pass
|
|
vec3 SSSSTransmittance(float translucency, float sssWidth, vec3 worldPosition, vec3 worldNormal, vec3 lightDir, sampler2D shadowMap, mat4 LWVP) {
|
|
float scale = 8.25 * (1.0 - translucency) / sssWidth;
|
|
vec4 shrinkedPos = vec4(worldPosition - 0.005 * worldNormal, 1.0);
|
|
vec4 shadowPosition = LWVP * shrinkedPos;
|
|
float d1 = texture(shadowMap, shadowPosition.xy / shadowPosition.w).r; // 'd1' has a range of 0..1
|
|
float d2 = shadowPosition.z; // 'd2' has a range of 0..'lightFarPlane'
|
|
const float lightFarPlane = 50.0; // TODO
|
|
d1 *= lightFarPlane; // So we scale 'd1' accordingly:
|
|
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);
|
|
return profile * clamp(0.3 + dot(lightDir, -worldNormal), 0.0, 1.0);
|
|
}
|
|
|
|
vec3 SSSSTransmittanceCube(float translucency, float sssWidth, vec3 worldPosition, vec3 worldNormal, vec3 lightDir, samplerCube shadowMapCube, mat4 LWVP) {
|
|
// TODO
|
|
return vec3(0.2);
|
|
}
|