GLSL SubSurface Scattering
heres the code:
#define AA 2
#define PI 3.141592
float sphIntersect(vec3 ro, vec3 rd, vec3 ce, float ra) {
vec3 oc = ro - ce;
float b = dot(oc, rd), c = dot(oc, oc) - ra*ra, h = b*b - c;
return h < 0. ? -1. : -b - sqrt(h);
}
float intersect(vec3 ro, vec3 rd, out vec3 n) {
vec3 ce = vec3(0);
float h = sphIntersect(ro, rd, ce, 0.95);
if (h > 0.) { n = normalize(ro - ce + rd * h); return h; }
return -1.;
}
vec3 lighting(vec3 n, vec3 l, vec3 rd, vec3 kl, vec3 kd, vec3 ks, vec3 ksr, float rou, float ior) {
float ndl = dot(n, l), pndl = max(ndl, 0.);
vec3 sss = 0.2 * exp(-3. * abs(ndl) / (ksr + 0.001));
vec3 h = normalize(l - rd);
float ndh = dot(n, h);
float g = ndh*ndh * (rou*rou - 1.) + 1.;
float ggx = rou*rou / (PI * g * g);
float f0 = pow((ior - 1.) / (ior + 1.), 2.);
float fre = 1. + dot(rd, n);
float kr = f0 + (1. - f0) * pow(1. - rou, 2.) * pow(fre, 5.);
return kl * (pndl * (kd + kr * ggx) + kd * ks * ksr * sss);
}
vec3 render(vec3 ro, vec3 rd) {
vec3 n;
float t = intersect(ro, rd, n);
if (t < 0.) return vec3(0.02, 0.03, 0.04);
vec3 dif = vec3(0.6, 0.45, 0.25);
vec3 sss = vec3(0.75);
vec3 rad = vec3(1.0, 0.25, 0.04);
float rou = 0.1, ior = 1.5;
vec3 p = ro + rd * t;
return lighting(n, normalize(vec3(1,1,1)), rd, vec3(1), dif, sss, rad, rou, ior) +
lighting(n, normalize(vec3(-1,0.4,0.5)), rd, vec3(0.25), dif, sss, rad, rou, ior);
}
mat3 setCamera(vec3 ro, vec3 ta) {
vec3 f = normalize(ta - ro);
vec3 r = normalize(cross(f, vec3(0,1,0)));
vec3 u = cross(r, f);
return mat3(r, u, f);
}
void mainImage(out vec4 fragColor, in vec2 fragCoord) {
float an = 0.6 * iTime + (iMouse.x - 0.5 * iResolution.x) / iResolution.y * PI;
vec3 ro = 18. * vec3(sin(an), 0, cos(an)), ta = vec3(0);
mat3 ca = setCamera(ro, ta);
vec3 tot = vec3(0);
for (int m = 0; m < AA; m++) for (int n = 0; n < AA; n++) {
vec2 p = (fragCoord + vec2(m,n) / float(AA) - 0.5 * iResolution.xy) / iResolution.y;
vec3 rd = ca * normalize(vec3(p, 3.));
vec3 col = render(ro, rd);
col = 2. * col / (0.8 + 2.5 * col); // Tonemap
col = pow(col, vec3(0.4545)); // Gamma
tot += col;
}
tot /= float(AA * AA);
vec2 q = fragCoord / iResolution.xy;
tot *= 0.3 + 0.7 * pow(16. * q.x * q.y * (1. - q.x) * (1. - q.y), 0.1);
fragColor = vec4(tot, 1.0);
}
and my first version (syntax errors):
#define AA 2
#define PI 3.141592
float sphIntersect(vec3 ro, vec3 rd, vec3 ce, float ra) {
vec3 oc = ro - ce;
float b = dot(oc, rd), c = dot(oc, oc) - ra*ra, h = b*b - c;
return h < 0. ? -1. : -b - sqrt(h);
}
float intersect(vec3 ro, vec3 rd, out vec3 n) {
vec3 ce = vec3(0);
float h = sphIntersect(ro, rd, ce, 0.95);
if (h > 0.) { n = normalize(ro - ce + rd * h); return h; }
return -1.;
}
vec3 lighting(vec3 n, vec3 l, vec3 rd, vec3 kl, vec3 kd, vec3 ks, vec3 ksr, float rou, float ior) {
float ndl = dot(n, l), pndl = max(ndl, 0.);
vec3 sss = 0.2 * exp(-3. * abs(ndl) / (ksr + 0.001));
vec3 h = normalize(l - rd);
float ndh = dot(n, h);
float g = ndh*ndh * (rou*rou - 1.) + 1.;
float ggx = rou*rou / (PI * g * g);
float f0 = pow((ior - 1.) / (ior + 1.), 2.);
float fre = 1. + dot(rd, n);
float kr = f0 + (1. - f0) * pow(1. - rou, 2.) * pow(fre, 5.);
return kl * (pndl * (kd + kr * ggx) + kd * ks * ksr * sss);
}
vec3 render(vec3 ro, vec3 rd) {
vec3 n;
float t = intersect(ro, rd, n);
if (t < 0.) return vec3(0.02, 0.03, 0.04);
vec3 dif = vec3(0.6, 0.45, 0.25);
vec3 sss = vec3(0.75);
vec3 rad = vec3(1.0, 0.25, 0.04);
float rou = 0.1, ior = 1.5;
vec3 p = ro + rd * t;
return lighting(n, normalize(vec3(1,1,1)), rd, vec3(1), dif, sss, rad, rou, ior) +
lighting(n, normalize(vec3(-1,0.4,0.5)), rd, vec3(0.25), dif, sss, rad, rou, ior);
}
mat3 setCamera(vec3 ro, vec3 ta) {
vec3 f = normalize(ta - ro);
vec3 r = normalize(cross(f, vec3(0,1,0)));
vec3 u = cross(r, f);
return mat3(r, u, f);
}
void mainImage(out vec4 fragColor, in vec2 fragCoord) {
float an = 0.6 * iTime + (iMouse.x - 0.5 * iResolution.x) / iResolution.y * PI;
vec3 ro = 18. * vec3(sin(an), 0, cos(an)), ta = vec3(0);
mat3 ca = setCamera(ro, ta);
vec3 tot = vec3(0);
for (int m = 0; m < AA; m++) for (int n = 0; n < AA; n++) {
vec2 p = (fragCoord + vec2(m,n) / float(AA) - 0.5 * iResolution.xy) / iResolution.y;
vec3 rd = ca * normalize(vec3(p, 3.));
vec3 col = render(ro, rd);
col = 2. * col / (0.8 + 2.5 * col); // Tonemap
col = pow(col, vec3(0.4545)); // Gamma
Status | Released |
Platforms | HTML5 |
Author | G Magma |
Tags | pathtracing, raytracing, rtx |
Leave a comment
Log in with itch.io to leave a comment.