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

Leave a comment

Log in with itch.io to leave a comment.