precision highp float;
uniform vec2 resolution;
uniform float time;
out vec4 outColor;
#define MATERIAL_DISH 0.0
#define MATERIAL_DESK 1.0
#define MATERIAL_CANDLE 2.0
#define MATERIAL_CAKE 3.0
#define MATERIAL_ROOM 4.0
#define MATERIAL_DESK_FOOT 5.0
#define MATERIAL_STRAWBERRY 6.0
#define MATERIAL_FLAME 7.0
#define MATERIAL_SPOTLIGHT 8.0
#define MATERIAL_PARTICLE 9.0
#define MATERIAL_BOARD 10.0
float pi = acos(-1.0);
float jitter = 0.0;
float ft;
float pAt = 0.0;
float random1d1d(float v)
{
return fract(sin(v * 924.5326) * 12457.214);
}
float random1d2d(vec2 p){
return fract(sin(dot(p.xy, vec2(12.575, 78.2356)))*43578.2356);
}
float random3d1d(vec3 v) {
return fract(sin(dot(v, vec3(12.9898, 78.233, 19.8321))) * 43758.5453);
}
float valueNoise(vec3 v) {
vec3 i = floor(v);
vec3 f = smoothstep(0.0, 1.0, fract(v));
return mix(
mix(
mix(random3d1d(i), random3d1d(i + vec3(1.0, 0.0, 0.0)), f.x),
mix(random3d1d(i + vec3(0.0, 1.0, 0.0)), random3d1d(i + vec3(1.0, 1.0, 0.0)), f.x),
f.y
),
mix(
mix(random3d1d(i + vec3(0.0, 0.0, 1.0)), random3d1d(i + vec3(1.0, 0.0, 1.0)), f.x),
mix(random3d1d(i + vec3(0.0, 1.0, 1.0)), random3d1d(i + vec3(1.0, 1.0, 1.0)), f.x),
f.y
),
f.z
);
}
float fbm(vec3 v) {
float n = 0.0;
float a = 0.5;
for (int i = 0; i < 5; i++) {
n += a * valueNoise(v);
v *= 2.0;
a *= 0.5;
}
return n;
}
vec3 hsv2rgb(float h, float s, float v){
vec3 rgb = clamp(abs(mod(h * 6.0 + vec3(0.0, 4.0, 2.0), 6.0) - 3.0) - 1.0, 0.0, 1.0);
rgb = rgb * rgb * (3.0 - 2.0 * rgb);
return v * mix(vec3(1.0), rgb, s);
}
vec2 random2dPolar(float n){
float x = fract(sin(n*546.25)*222.223)*pi*2.0;
float y = (fract(sin(n*222.25)*622.223) - 0.5)*5.0;
return vec2(cos(x), sin(x))*y;
}
vec2 random2d(float n){
float x = (fract(sin(n*246.25)*422.223) - 0.5)*2.0;
float y = (fract(sin(n*522.25)*722.223) - 0.5)*2.0;
return vec2(x, y);
}
// Coding a fireworks effect :
https://www.youtube.com/watch?v=xDxAnguEOn8
float explode(vec2 pos, float t, float coef){
float c = 0.0;
for(float i = 0.0; i <= 10.0; i+=1.0){
vec2 dir = random2dPolar(i+floor(t)+coef*100.0);
vec2 p = pos - dir*t;
float d = dot(p, p);
float b = mix(0.0, 0.0005, smoothstep(1.0, 0.0, t));
c += b/d;
}
return c;
}
mat2 rotate(float a)
{
float c = cos(a);
float s = sin(a);
return mat2(c, -s, s, c);
}
float bounceOut(float t) {
const float a = 4.0 / 11.0;
const float b = 8.0 / 11.0;
const float c = 9.0 / 10.0;
const float ca = 4356.0 / 361.0;
const float cb = 35442.0 / 1805.0;
const float cc = 16061.0 / 1805.0;
float t2 = t * t;
return t < a
? 7.5625 * t2
: t < b
? 9.075 * t2 - 9.9 * t + 3.4
: t < c
? ca * t2 - cb * t + cc
: 10.8 * t * t - 20.52 * t + 10.72;
}
float bounceIn(float t) {
return 1.0 - bounceOut(1.0 - t);
}
float easeInOutExpo(float t) {
if (t == 0.0 || t == 1.0) {
return t;
}
if ((t *= 2.0) < 1.0) {
return 0.5 * pow(2.0, 10.0 * (t - 1.0));
} else {
return 0.5 * (-pow(2.0, -10.0 * (t - 1.0)) + 2.0);
}
}
float linearStep(float start, float end, float t){
return clamp((t - start)/(end - start), 0.0, 1.0);
}
vec2 polarMod(vec2 p, float r)
{
float a = pi / r - atan(p.x, p.y);
float n = (pi * 2.0) / r;
a = floor(a/n)*n;
return p * rotate(-a);
}
vec2 optionMin(vec2 a, vec2 b)
{
return (a.x < b.x) ? a : b;
}
float smoothMin(float a, float b, float k){
float h = clamp(0.5 + 0.5 * (b-a)/k, 0.0, 1.0);
return mix(b, a, h) - k * h * (1.0 - h);
}
float sdCappedCylinder(vec3 p, float h, float r)
{
vec2 d = abs(vec2(length(p.xz), p.y)) - vec2(r, h);
return min(max(d.x, d.y), 0.0) + length(max(d, 0.0));
}
float sdBox(vec3 p, vec3 s)
{
vec3 q = abs(p) - s;
return length(max(q, 0.0)) + min(max(q.x, max(q.y, q.z)), 0.0);
}
float sdSphere(vec3 p, float r)
{
return length(p) - r;
}
//
https://neort.io/art/c78r3o43p9f3hsjeassg
float sdSphere(vec3 iPos, vec3 fPos, vec3 c){
float r = random3d1d(iPos + c);
if(r > 0.95){
r = fract(sin(r)) * 0.01;
}
else{
r =- 0.5;
}
return length(fPos - c) - r;
}
//
https://neort.io/art/c78r3o43p9f3hsjeassg
float sdSphereR(vec3 p){
float d = 0.0;
p.y += time * 2.4;
vec3 iPos = floor(p);
vec3 fPos = fract(p);
d += sdSphere(iPos, fPos, vec3(0.0, 0.0, 0.0));
d = min(d, sdSphere(iPos, fPos, vec3(0.0, 0.0, 1.0)));
d = min(d, sdSphere(iPos, fPos, vec3(0.0, 1.0, 0.0)));
d = min(d, sdSphere(iPos, fPos, vec3(1.0, 0.0, 0.0)));
d = min(d, sdSphere(iPos, fPos, vec3(1.0, 1.0, 0.0)));
d = min(d, sdSphere(iPos, fPos, vec3(1.0, 0.0, 1.0)));
d = min(d, sdSphere(iPos, fPos, vec3(0.0, 1.0, 1.0)));
d = min(d, sdSphere(iPos, fPos, vec3(1.0, 1.0, 1.0)));
return d;
}
vec2 sdDish(vec3 p){
p.y += 0.2;
float d = sdCappedCylinder(p, 0.01, 1.5);
d = smoothMin(d, sdCappedCylinder(p - vec3(0.0, 0.2, 0.0), 0.04, 3.0), 0.25);
vec3 p1 = p;
p1.xz = polarMod(p1.xz, 40.0);
d = smoothMin(d, sdSphere(p1 - vec3(0.0, 0.2, 3.0), 0.02), 0.3);
vec3 p2 = p;
p2.xz *= rotate(pi*0.025);
p2.xz = polarMod(p2.xz, 10.0);
d = smoothMin(d, sdSphere(p2 - vec3(0.0, 0.3, 3.0), 0.02), 0.3);
return vec2(d, MATERIAL_DISH);
}
vec2 sdCake(vec3 p){
p.y -= 1.0;
float d = sdCappedCylinder(p, 1.0, 2.0);
vec3 p1 = p;
p1.xz = polarMod(p1.xz, 120.0);
d = smoothMin(d, sdSphere(p1 - vec3(0.0, 0.7, 2.0), 0.2), 0.6);
vec3 p2 = p;
p2.xz *= rotate(pi*0.25);
p2.xz = polarMod(p2.xz, 100.0);
d = smoothMin(d, sdSphere(p2 - vec3(0.0, -0.6, 2.0), 0.4), 0.8);
p.y -= 1.0;
d = smoothMin(d, sdCappedCylinder(p, 1.0, 1.0), 0.6);
vec3 p3 = p;
p2.xz *= rotate(pi*0.25);
p3.xz = polarMod(p3.xz, 100.0);
d = smoothMin(d, sdSphere(p3 - vec3(0.0, 0.8, 0.8), 0.2), 0.5);
vec3 p4 = p;
p4.xz *= rotate(pi*0.025);
p4.xz = polarMod(p4.xz, 12.0);
p4.z -= 1.7;
p4.xz = polarMod(p4.xz, 12.0);
p4 -= vec3(0.0, 0.2, 0.1);
d = smoothMin(d, sdSphere(p4, 0.1), 0.2);
return vec2(d, MATERIAL_CAKE);
}
vec2 sdCakeDecorate(vec3 p)
{
vec2 d = vec2(10e8);
vec3 p1 = p;
p1.xz *= rotate(pi*0.025);
p1.xz = polarMod(p1.xz, 12.0);
float berry = 10e8;
berry = min(berry, sdSphere(p1 - vec3(0.0, 2.3, 1.7), 0.2));
berry = smoothMin(berry, sdSphere(p1 - vec3(0.0, 2.6, 1.7), 0.01), 0.3);
d = optionMin(d, vec2(berry, MATERIAL_STRAWBERRY));
return d;
}
vec2 sdFlame(vec3 p)
{
vec2 d = vec2(10e8);
vec3 p1 = p;
float tF = linearStep(27.0, 28.0, ft);
float fRadius1 = 0.12 - mix(0.0, 0.12, easeInOutExpo(tF));
float fRadius2 = 0.06 - mix(0.0, 0.06, easeInOutExpo(tF));
float flame1 = 10e8;
flame1 = min(flame1, sdSphere(p1 - vec3(0.0, 3.85, 0.0), fRadius1));
flame1 = smoothMin(flame1, sdSphere(p1 - vec3(sin(time + floor(length(p1.x)))*0.1, 3.9 + (fract(time*2.0)*0.2 + 0.1)*0.8, 0.0), fRadius2 * (1.0 - fract(time*1.0))), 0.2 * (1.0 - fract(time*1.0)));
d = optionMin(d, vec2(flame1, MATERIAL_FLAME));
vec3 p2 = p;
p2.xz *= rotate(pi*0.025);
p2.xz = polarMod(p2.xz, 6.0);
float flame2 = 10e8;
float fRadius3 = 0.05 - mix(0.0, 0.05, easeInOutExpo(tF));
float fRadius4 = 0.04 - mix(0.0, 0.04, easeInOutExpo(tF));
flame2 = min(flame2, sdSphere(p2 - vec3(0.0, 3.45, 0.8), fRadius3));
flame2 = smoothMin(flame2, sdSphere(p2 - vec3(sin(time + random1d1d(floor(p2.x) * 100.0))*0.05, 3.55 + (fract(time*2.0 + floor(p2.x))*0.2 + 0.1)*0.4, 0.8), fRadius4 * (1.0 - fract(time*1.0))), 0.2 * (1.0 - fract(time*1.0)));
d = optionMin(d, vec2(flame2, MATERIAL_FLAME));
return d;
}
vec2 sdCandle(vec3 p){
p.y -= 2.0;
float d = sdCappedCylinder(p, 1.8, 0.1);
vec3 p1 = p;
p1.xz *= rotate(pi*0.025);
p1.xz = polarMod(p1.xz, 6.0);
d = min(d, sdCappedCylinder(p1 - vec3(0.0, 0.0, 0.8), 1.4, 0.06));
return vec2(d, MATERIAL_CANDLE);
}
vec2 sdDesk(vec3 p){
p.y += 0.4;
float d = sdBox(p, vec3(4.8, 0.05, 4.8));
return vec2(d, MATERIAL_DESK);
}
vec2 sdDeskFoot(vec3 p)
{
float d = 10e8;
p.y += 3.4;
d = smoothMin(d, sdBox(p - vec3(4.5, 0.0, 4.5), vec3(0.5, 3.0, 0.5)), 0.2);
d = smoothMin(d, sdBox(p - vec3(4.5, 0.0, -4.5), vec3(0.5, 3.0, 0.5)), 0.2);
d = smoothMin(d, sdBox(p - vec3(-4.5, 0.0, 4.5), vec3(0.5, 3.0, 0.5)), 0.2);
d = smoothMin(d, sdBox(p - vec3(-4.5, 0.0, -4.5), vec3(0.5, 3.0, 0.5)), 0.2);
d = smoothMin(d, sdBox(p - vec3(0.0, 2.6, -4.5), vec3(5.0, 0.5, 0.5)), 0.2);
d = smoothMin(d, sdBox(p - vec3(0.0, 2.6, 4.5), vec3(5.0, 0.5, 0.5)), 0.2);
d = smoothMin(d, sdBox(p - vec3(-4.5, 2.6, 0.0), vec3(0.5, 0.5, 5.0)), 0.2);
d = smoothMin(d, sdBox(p - vec3(4.5, 2.6, 0.0), vec3(0.5, 0.5, 5.0)), 0.2);
return vec2(d, MATERIAL_DESK_FOOT);
}
vec2 sdSpotLight(vec3 p, vec3 offset)
{
vec2 d = vec2(10e8);
float lightLen = 30.0;
vec3 p1 = p - offset;
float fR = easeInOutExpo(linearStep(1.0, 2.0, ft));
float r = mix(0.0, 0.3 + length(p1) * 0.3, fR);
d = optionMin(d, vec2(sdCappedCylinder(p1 + vec3(0.0, lightLen, 0.0), lightLen, r), MATERIAL_SPOTLIGHT));
return d;
}
vec2 sdBoard(vec3 p)
{
float tB= linearStep(7.0, 17.0, ft);
vec2 d = vec2(10e8);
p.y -= 40.0;
float yPos = 40.0 * tB;
p.y += yPos;
float bFrame = 10e8;
bFrame = min(bFrame, sdBox(p - vec3(0.0, 5.0, 15.0), vec3(20.0, 10.0, 1.5)));
bFrame = min(bFrame, sdBox(p - vec3(10.0, 40.0, 15.0), vec3(0.5, 40.0, 1.5)));
bFrame = min(bFrame, sdBox(p - vec3(-10.0, 40.0, 15.0), vec3(0.5, 40.0, 0.5)));
bFrame = max(bFrame, -sdBox(p - vec3(0.0, 5.0, 15.0), vec3(20.0, 10.0, 1.7)));
d = optionMin(d, vec2(bFrame, MATERIAL_DESK_FOOT));
d = optionMin(d, vec2(sdBox(p - vec3(0.0, 5.0, 15.0), vec3(20.0, 10.0, 0.8)), MATERIAL_BOARD));
return d;
}
vec2 distanceFunction(vec3 p)
{
vec2 d = vec2(10e8, 0.0);
d = optionMin(d, sdDish(p));
d = optionMin(d, sdCake(p));
d = optionMin(d, sdCandle(p));
d = optionMin(d, sdFlame(p));
d = optionMin(d, sdCakeDecorate(p));
d = optionMin(d, sdDesk(p));
d = optionMin(d, sdDeskFoot(p));
d = optionMin(d, sdBoard(p));
vec2 b3 = vec2(-sdBox(p - vec3(0.0, 20.0, 0.0), vec3(60.0, 30.0, 60.0)), MATERIAL_ROOM);
d = optionMin(d, b3);
d = optionMin(d, vec2(sdSphereR(p), MATERIAL_PARTICLE));
pAt += 0.01/(0.01 + abs(sdSphereR(p)));
return d;
}
vec3 getNormal(vec3 p)
{
vec2 err = vec2(0.001, 0.0);
return normalize(vec3(
distanceFunction(p + err.xyy).x - distanceFunction(p - err.xyy).x,
distanceFunction(p + err.yxy).x - distanceFunction(p - err.yxy).x,
distanceFunction(p + err.yyx).x - distanceFunction(p - err.yyx).x
));
}
vec3 volumetric(vec3 p){
vec3 col = vec3(0.0);
col += fbm(p + vec3(time*0.92, 0.0, 0.0)) * 0.02;
return col;
}
vec3 roomVolumetric(vec3 p){
vec2 uv = p.xz * 1.0;
vec3 col = vec3(0.0);
vec2 grid = smoothstep(0.45, 0.4, fract(uv) - 0.5);
vec2 cell = floor(uv);
col += min(grid.x, grid.y);
col *= vec3(random1d2d(cell + 78.214), random1d2d(cell + 38.214), random1d2d(cell + 57.214));
return col;
}
float getAO(vec3 p, vec3 n){
float occ = 0.0;
float sca = 1.0;
for(int i = 0; i < 5; i++){
float h = 0.01 + 0.12 * float(i) / 4.0;
float d = distanceFunction(p + h * n).x;
occ += (h - d) * sca;
if(occ > 0.35){
break;
}
}
return clamp(1.0 - 3.0 * occ, 0.0, 1.0) * (0.5 + 0.5 * n.y);
}
float getSoftShadow(vec3 camPos, vec3 rayDir, float tMin, float tMax){
float tp = (0.8 - camPos.y) / rayDir.y;
if(tp > 0.0){
tMax = min(tMax, tp);
}
float res = 1.0;
float t = tMin;
for(int i = 0; i < 24; i++){
float h = distanceFunction(camPos + rayDir * t).x;
float s = clamp(8.0 * h / t, 0.0, 1.0);
res = min(res, s * s * (3.0 - 2.0 * s));
t += clamp(h, 0.02, 0.2);
if(res < 0.004 || tMax < t){
break;
}
}
return clamp(res, 0.0, 1.0);
}
vec3 material(vec3 p, vec3 n, vec3 rayDir, vec2 df, float fog){
vec3 color = vec3(0.0);
vec3 roomColor = vec3(1.0);
float metalic = 0.0;
vec3 albedo = vec3(0.0);
vec3 emissive = vec3(0.0);
if(df.y == MATERIAL_DISH){
albedo = mix(vec3(0.6549, 0.6784, 0.5059), vec3(1.0, 1.0, 1.0), fbm(vec3(length(p)*100.0)));
metalic = 0.3;
emissive = vec3(0.6)*pow(length(p.xz * 0.37), 10.0);
}
if(df.y == MATERIAL_DESK){
albedo = mix(vec3(0.0, 0.0, 0.0), vec3(0.8745, 0.4549, 0.1098), fbm(vec3(p.x, p.yy)));
}
if(df.y == MATERIAL_CANDLE){
albedo = vec3(0.7294, 0.8745, 0.8353);
emissive = vec3(0.4);
}
if(df.y == MATERIAL_CAKE){
albedo = vec3(1.0);
emissive = vec3(0.4);
}
if(df.y == MATERIAL_ROOM){
vec3 rp = p * 0.25;
albedo += roomVolumetric(rp);
albedo += 2.0 / (2.0 + length(p.xz));
metalic = 0.8;
}
if(df.y == MATERIAL_DESK_FOOT){
albedo = vec3(1.0);
metalic = 0.9;
emissive = vec3(0.4);
}
if(df.y == MATERIAL_STRAWBERRY){
albedo = vec3(0.9294, 0.0863, 0.0863);
metalic = 0.1;
emissive = vec3(0.4039, 0.0275, 0.0275);
}
if(df.y == MATERIAL_FLAME){
albedo = mix(vec3(0.9765, 0.7333, 0.2392), vec3(0.9098, 0.5098, 0.5098), smoothstep(3.85, 4.0, p.y));
metalic = 0.1;
emissive = vec3(0.9098, 0.0706, 0.0706);
}
if(df.y == MATERIAL_PARTICLE){
albedo += pAt * 0.2;
}
if(df.y == MATERIAL_BOARD){
float t8 = easeInOutExpo(linearStep(19.0, 21.0, ft));
float tF = easeInOutExpo(linearStep(27.0, 28.0, ft));
vec2 uv2 = vec2(((p.xy + vec2(10.0, 5.2)) / vec2(20.0, 20.0)) - 0.5);
for(float i = 0.0; i <= 50.0; i+=1.0){
float t = time+i/50.0;
float ft = floor(t);
vec2 offset = random2d(i+2.0+ft);
float coef = random1d1d(i+2.0+ft+ft);
albedo += explode(uv2 - offset, fract(t), coef)*hsv2rgb(coef, 1.0, 1.0);
}
albedo *= (t8 - tF);
}
vec3 lightDir = normalize(vec3(1.0, 2.0, -3.0));
float diff = clamp(dot(n, lightDir), 0.0, 1.0);
float specular = pow(clamp(dot(reflect(lightDir, n), rayDir), 0.0, 1.0), 10.0);
float ao = getAO(p, n);
float shadow = getSoftShadow(p, lightDir, 0.22, 4.0);
color += albedo * diff * shadow * (1.0 - metalic);
color += albedo * specular * shadow * metalic;
color += albedo * clamp(0.5 + 0.5 * n.y, 0.0, 1.0) * 0.2;
color += albedo * ao * roomColor;
color += emissive;
return color;
}
vec3 acesFilm(vec3 col){
float a = 2.51;
float b = 0.03;
float c = 2.43;
float d = 0.59;
float e = 0.14;
return clamp((col * (a * col + b)) / (col * (c * col + d) + e), 0.0, 1.0);
}
float lightDistanceFunction(vec3 p)
{
float lightDF = 1.0 - sdSpotLight(p, vec3(0.0, 30.0, 0.0)).x;
return min(max(0.0, lightDF), 1.0);
}
vec3 renderingFunc(vec2 uv){
ft = mod(time, 30.0);
float t1 = linearStep(1.0, 2.0, ft);
float t2 = linearStep(4.0, 5.0, ft);
float t3 = linearStep(7.0, 8.0, ft);
float t4 = linearStep(9.0, 10.0, ft);
float t5 = linearStep(11.0, 12.0, ft);
float t6 = linearStep(13.0, 14.0, ft);
float t7 = linearStep(15.0, 16.0, ft);
float camZ = -25.0 + mix(0.0, 6.0, t3) + mix(0.0, 5.0, t4) + mix(0.0, 4.0, t5) + mix(0.0, 3.0, t6) + mix(0.0, 2.0, t7);
float t33 = bounceIn(linearStep(11.0, 12.0, ft));
float t44 = bounceIn(linearStep(13.0, 14.0, ft));
float t55 = bounceIn(linearStep(15.0, 16.0, ft));
float t66 = bounceIn(linearStep(13.0, 14.0, ft));
float t77 = bounceIn(linearStep(15.0, 16.0, ft));
float camY = 7.0 + mix(0.0, -0.8, t33) + mix(0.0, -0.6, t44) + mix(0.0, -0.4, t55) + mix(0.0, -0.2, t66) + mix(0.0, -0.1, t77);
vec3 color = vec3(0.0);
vec3 camPos = vec3(0.0, camY, camZ);;
vec3 lookPos = vec3(0.0, 3.0, 0.0);
vec3 up = vec3(0.0, 1.0, 0.0);
vec3 forward = normalize(lookPos - camPos);
vec3 right = normalize(cross(up, forward));
up = normalize(cross(forward, right));
float fov = 1.0;//0.2 + tick(time*1.2, 1.8, 10.0)*0.8;
vec3 rayDir = normalize(uv.x * right + uv.y * up + fov * forward);
float rand = random1d2d(uv);
float t8 = easeInOutExpo(linearStep(18.0, 20.0, ft));
float t9 = easeInOutExpo(linearStep(22.0, 24.0, ft));
float camAngle = mix(0.0, -0.5, t8 - t9);
camPos.yz *= rotate(camAngle);
rayDir.yz *= rotate(camAngle);
vec3 p = camPos;
vec2 df = vec2(0.0);
float d = 0.0;
bool isHit = false;
float dd = 0.0;
for(int i = 0; i < 200; i++){
p = camPos + rayDir * d;
df = distanceFunction(p);
if(df.x > 100.0){
dd = 100.0;
break;
}
if(df.x <= 0.0001){
isHit = true;
break;
}
d += df.x;
dd += df.x;
}
float density = 0.;
float stepSize = 0.1;
vec3 stepRay = stepSize * rayDir;
vec3 p2 = camPos+stepRay*rand;
float stepDist = rand*stepSize;
float stepLength = 0.8;
vec4 sum = vec4(0.0, 0.0, 0.0, 1.0);
vec3 at = vec3(0.0);
for(int i = 0; i < 100; i++){
if(stepDist > d){
break;
}
at += pow(volumetric(p2) * 4.2, vec3(2.0));
stepDist += stepSize;
p2 += stepRay;
}
// Referenct :
https://www.shadertoy.com/view/WdXGRj
vec3 p3 = camPos + rayDir * rand * stepLength;
for (int i = 0; i < 100; i++)
{
if (sum.a < 0.1) {
break;
}
float d = lightDistanceFunction(p3);
if( d > 0.001)
{
density = clamp((d / 100.0)*10.0, 0.0, 1.0);
sum.rgb += vec3(density);
sum.a *= 1.0 - density;
}
p3 += rayDir * stepLength;
}
if(isHit){
vec3 normal = getNormal(p);
float fogRangeCoef = mix(10.0, 50.0, easeInOutExpo(t1));
float fog = 1.0 - clamp(dd/fogRangeCoef, 0.0, 1.0);
vec3 mat = material(p, normal, rayDir, df, fog);
color += mat;
color *= fog;
color *= sum.rgb * (sum.a * 30.0) * at * t1;
color = mix(color, mat * fog + sum.rgb * (sum.a * 3.0) * at, t2);
float t9 = linearStep(29.0, 30.0, ft);
color = mix(color, vec3(0.0), easeInOutExpo(t9));
}
color = acesFilm(color * 0.8);
color = pow(color, vec3(1.0/2.2));
return color;
}
void main(){
vec2 uv = (gl_FragCoord.xy * 2.0 - resolution) / min(resolution.x, resolution.y);
vec3 color = vec3(0.0);
jitter = random1d1d(uv.x + uv.y * 57.0);
color += renderingFunc(uv);
outColor = vec4(color, 1.0);
}