From 41c83e2f4a3a6498815fca5c41d012d520881970 Mon Sep 17 00:00:00 2001 From: hachimamma Date: Fri, 7 Nov 2025 11:10:03 +0530 Subject: [PATCH 1/4] UPDATE: added manual controls for blackhole --- blackhole/main.cpp | 194 ++++++++++++++++++++++++++++++--------------- 1 file changed, 129 insertions(+), 65 deletions(-) diff --git a/blackhole/main.cpp b/blackhole/main.cpp index 2abb531..9b24261 100644 --- a/blackhole/main.cpp +++ b/blackhole/main.cpp @@ -30,11 +30,12 @@ out vec4 FragColor; in vec2 uv; uniform float t; uniform vec3 cam; +uniform int renderMode; -const float sr = 0.15; -const float eh = 0.2; -const float di = 0.4; -const float do_ = 3.5; +const float sr = 0.12; +const float eh = 0.18; +const float di = 0.35; +const float do_ = 4.0; float h(vec2 p){return fract(sin(dot(p,vec2(127.1,311.7)))*43758.5453);} float h3(vec3 p){return fract(sin(dot(p,vec3(127.1,311.7,74.7)))*43758.5453);} @@ -48,97 +49,124 @@ float n(vec2 p){ float fbm(vec2 p){ float val=0,amp=.5,freq=1; - for(int i=0;i<6;i++){ + for(int i=0;i<8;i++){ val+=amp*n(p*freq); - freq*=2;amp*=.5; + freq*=2.1;amp*=.48; } return val; } +float sdTorus(vec3 p,vec2 t){ + vec2 q=vec2(length(p.xz)-t.x,p.y); + return length(q)-t.y; +} + vec3 march(vec3 o,vec3 d){ vec3 pos=o; float td=0; vec3 col=vec3(0); float alpha=0; - for(int i=0;i<200;i++){ + for(int i=0;i<256;i++){ float r=length(pos); - if(rdi&&r.82) dens*=4.+sin(t*15); + float sp=sin(ang*15-dn*25+t*5.5)*.5+.5; + float sp2=sin(ang*23+dn*18-t*4.)*.5+.5; + + float hf=1.-pow(dh/dt,1.5); + float dens=turb*hf*(.65+sp*.35); + dens*=(1.-pow(dn,.7)); + + float hs=n(vec2(ang*10+t*2.5,dn*12)); + float flare=n(vec2(ang*4-t*1.8,dn*6)); + + if(hs>.8) dens*=5.+sin(t*18)*1.5; + if(flare>.88) dens*=3.+sp2*2.; vec3 c; float tmp=1.-dn; - if(tmp>.75){ - c=mix(vec3(.6,.7,1),vec3(1), (tmp-.75)*4); - c+=vec3(.4,.5,1.2)*hs*3; - }else if(tmp>.6){ - c=mix(vec3(.3,.9,1),vec3(.9,.95,1),(tmp-.6)*6.66); - c+=vec3(.5,1,1.2)*turb*.8; - }else if(tmp>.45){ - c=mix(vec3(.8,1,.3),vec3(1,1,.7),(tmp-.45)*6.66); - c+=vec3(1,1,.4)*sp*.6; - }else if(tmp>.3){ - c=mix(vec3(1,.6,.1),vec3(1,.9,.4),(tmp-.3)*6.66); - c+=vec3(1.2,.7,.2)*turb*.7; + if(tmp>.8){ + c=mix(vec3(.5,.6,1.2),vec3(1.2,1.2,1.4),(tmp-.8)*5); + c+=vec3(.3,.5,1.5)*hs*4.; + c+=vec3(.8,.9,1.2)*flare*2.5; + }else if(tmp>.65){ + c=mix(vec3(.2,.8,1.2),vec3(.8,1.,1.2),(tmp-.65)*6.66); + c+=vec3(.4,1.2,1.5)*turb*1.2; + c+=vec3(.6,.8,1.)*sp2*.8; + }else if(tmp>.5){ + c=mix(vec3(.7,1.,.2),vec3(1.,1.,.6),(tmp-.5)*6.66); + c+=vec3(1.,1.2,.3)*sp*.9; + c+=vec3(.9,1.,.5)*turb*.7; + }else if(tmp>.35){ + c=mix(vec3(1.,.65,.08),vec3(1.,.95,.35),(tmp-.35)*6.66); + c+=vec3(1.3,.8,.15)*turb*1.; + c+=vec3(1.,.7,.2)*sp2*.6; + }else if(tmp>.2){ + c=mix(vec3(1.,.4,.05),vec3(1.,.7,.15),(tmp-.2)*6.66); + c+=vec3(1.2,.5,.1)*sp*.7; }else{ - c=mix(vec3(.5,.05,.1),vec3(1,.3,.5),tmp*3.33); - c+=vec3(1,.2,.6)*sp*.5; + c=mix(vec3(.6,.03,.08),vec3(1.,.25,.4),tmp*5); + c+=vec3(1.,.15,.5)*sp*.6; + c+=vec3(.8,.1,.3)*flare*.5; } - c.r+=turb*.3; - c.g+=sin(ang*15+t*2)*.2; - c.b+=cos(ang*20-t*3)*.25; + c.r+=turb*.4+sp*.2; + c.g+=sin(ang*18+t*2.8)*.25; + c.b+=cos(ang*24-t*3.5)*.3; - float br=dens*(3+tmp*4); - br*=(1+sin(t*5+ang*8)*.5); + float br=dens*(3.5+tmp*5.); + br*=(1.+sin(t*6.5+ang*10.)*.6); + br*=(1.+cos(ang*5.-t*2.)*.4); vec3 dc=c*br; - float a=dens*.15; - col+=dc*a*(1-alpha); - alpha+=a*(1-alpha); - if(alpha>.95)break; + float a=dens*.18; + col+=dc*a*(1.-alpha); + alpha+=a*(1.-alpha); + if(alpha>.97)break; } - float g=(sr*sr)/(r*r+.01); + float g=(sr*sr)/(r*r+.008); vec3 gd=-normalize(pos); - d=normalize(d+gd*g*.4); + d=normalize(d+gd*g*.45); - float step=.03+r*.015; - if(r>di-.5&&rdi-.6&&r25)break; + if(td>30)break; } vec3 sd=normalize(d); - float sn=h(sd.xy*200+sd.z*100); - if(sn>.997){ - float sb=(sn-.997)*1000; - vec3 sc=mix(vec3(1,.9,.8),vec3(.8,.9,1),h(sd.yz*123)); - col+=sc*sb*(1-alpha); + float sn=h(sd.xy*250+sd.z*130); + if(sn>.9975){ + float sb=(sn-.9975)*1500; + vec3 sc=mix(vec3(1.,.95,.85),vec3(.85,.95,1.),h(sd.yz*145)); + float twinkle=.7+.3*sin(sn*1000.+t*5.); + col+=sc*sb*twinkle*(1.-alpha); } - float bg=fbm(sd.xy*3+t*.05)*.03; - col+=vec3(.1,.05,.15)*bg*(1-alpha); - col+=vec3(.002,.003,.01)*(1-alpha); + float bg=fbm(sd.xy*4.+t*.03)*.04; + vec3 nebula=mix(vec3(.08,.04,.12),vec3(.12,.06,.18),bg); + col+=nebula*(1.-alpha); + + col+=vec3(.001,.002,.008)*(1.-alpha); return col; } @@ -152,11 +180,19 @@ void main(){ vec3 rd=normalize(fwd+uv_.x*rt+uv_.y*up); vec3 c=march(ro,rd); - c=c/(c+vec3(.5)); - c=pow(c,vec3(.9)); - c=pow(c,vec3(1./2.2)); - c.r=pow(c.r,.95); - c.b=pow(c.b,1.05); + + c=c/(c+vec3(.4)); + c=pow(c,vec3(.88)); + c=pow(c,vec3(1./2.15)); + + c.r=pow(c.r,.92); + c.g=pow(c.g,.96); + c.b=pow(c.b,1.08); + + float vig=1.-length(uv_*.35); + vig=pow(vig,1.2); + c*=.3+vig*.7; + FragColor=vec4(c,1); } )"; @@ -195,6 +231,22 @@ void fbResize(GLFWwindow* w,int width,int height){ glViewport(0,0,width,height); } +float gCamDist=5.5f; +float gCamAngle=0.0f; +float gCamHeight=0.4f; +bool gAutoCam=true; + +void scroll_callback(GLFWwindow* w,double x,double y){ + gCamDist*=(y>0)?0.9f:1.1f; + gCamDist=fmax(1.5f,fmin(gCamDist,12.0f)); +} + +void key_callback(GLFWwindow* w,int key,int scan,int action,int mods){ + if(action==GLFW_PRESS){ + if(key==GLFW_KEY_C) gAutoCam=!gAutoCam; + } +} + int main(){ if(!glfwInit()){ std::cerr<<"GLFW init fail"< Date: Fri, 7 Nov 2025 11:16:55 +0530 Subject: [PATCH 2/4] FIX: optimized the blackhole to higher fps --- blackhole/main.cpp | 288 +++++++++++++++++++++++++-------------------- 1 file changed, 162 insertions(+), 126 deletions(-) diff --git a/blackhole/main.cpp b/blackhole/main.cpp index 9b24261..5d7eb7e 100644 --- a/blackhole/main.cpp +++ b/blackhole/main.cpp @@ -30,12 +30,14 @@ out vec4 FragColor; in vec2 uv; uniform float t; uniform vec3 cam; -uniform int renderMode; +uniform vec2 res; const float sr = 0.12; const float eh = 0.18; const float di = 0.35; -const float do_ = 4.0; +const float do_ = 4.5; +const int MAX_STEPS = 256; +const int LIGHT_SAMPLES = 4; float h(vec2 p){return fract(sin(dot(p,vec2(127.1,311.7)))*43758.5453);} float h3(vec3 p){return fract(sin(dot(p,vec3(127.1,311.7,74.7)))*43758.5453);} @@ -49,16 +51,115 @@ float n(vec2 p){ float fbm(vec2 p){ float val=0,amp=.5,freq=1; - for(int i=0;i<8;i++){ + for(int i=0;i<6;i++){ val+=amp*n(p*freq); freq*=2.1;amp*=.48; } return val; } -float sdTorus(vec3 p,vec2 t){ - vec2 q=vec2(length(p.xz)-t.x,p.y); - return length(q)-t.y; +float fbm3(vec3 p){ + float val=0,amp=.5; + for(int i=0;i<4;i++){ + val+=amp*(h3(p)-.5); + p*=2.1;amp*=.5; + } + return val*.5+.5; +} + +float getDensity(vec3 pos,float r){ + float dh=abs(pos.y); + float dt=.35+.2*sin(t*.9); + if(dh>=dt||r<=di||r>=do_)return 0.; + + float dn=(r-di)/(do_-di); + float av=(1./pow(dn+.08,0.35))*3.5; + float ang=atan(pos.z,pos.x)+t*av; + + vec2 tc=vec2(ang*8.5+t*1.4,dn*22); + float turb=fbm(tc); + + vec3 p3=pos*5.; + float turb3d=fbm3(p3+t*.5); + + float sp=sin(ang*18-dn*28+t*6.)*.5+.5; + float sp2=sin(ang*25+dn*20-t*4.5)*.5+.5; + + float hf=1.-pow(dh/dt,1.3); + float dens=turb*turb3d*hf*(.7+sp*.3); + dens*=(1.-pow(dn,.65)); + + float hs=n(vec2(ang*12+t*3.,dn*15)); + float flare=n(vec2(ang*5-t*2.,dn*8)); + + if(hs>.78) dens*=6.+sin(t*20.)*2.; + if(flare>.86) dens*=4.+sp2*3.; + + return dens; +} + +vec3 getColor(vec3 pos,float r,float dens){ + float dn=(r-di)/(do_-di); + float ang=atan(pos.z,pos.x)+t*3.; + + float turb=fbm(vec2(ang*8.+t,dn*20)); + float sp=sin(ang*18-dn*28+t*6.)*.5+.5; + float sp2=sin(ang*25+dn*20-t*4.5)*.5+.5; + float hs=n(vec2(ang*12+t*3.,dn*15)); + float flare=n(vec2(ang*5-t*2.,dn*8)); + + vec3 c; + float tmp=1.-dn; + + if(tmp>.82){ + c=mix(vec3(.4,.55,1.3),vec3(1.3,1.3,1.5),(tmp-.82)*5.5); + c+=vec3(.25,.45,1.6)*hs*5.; + c+=vec3(.7,.85,1.3)*flare*3.5; + }else if(tmp>.68){ + c=mix(vec3(.15,.75,1.3),vec3(.75,1.05,1.3),(tmp-.68)*7.14); + c+=vec3(.35,1.3,1.6)*turb*1.5; + c+=vec3(.55,.75,1.1)*sp2*1.; + }else if(tmp>.52){ + c=mix(vec3(.65,1.05,.15),vec3(1.05,1.1,.55),(tmp-.52)*6.25); + c+=vec3(1.1,1.3,.25)*sp*1.1; + c+=vec3(.85,1.05,.45)*turb*.9; + }else if(tmp>.38){ + c=mix(vec3(1.05,.6,.06),vec3(1.1,1.,.3),(tmp-.38)*7.14); + c+=vec3(1.4,.75,.12)*turb*1.2; + c+=vec3(1.05,.65,.18)*sp2*.75; + }else if(tmp>.22){ + c=mix(vec3(1.05,.35,.03),vec3(1.1,.65,.12),(tmp-.22)*6.25); + c+=vec3(1.3,.45,.08)*sp*.85; + }else{ + c=mix(vec3(.55,.02,.06),vec3(1.05,.2,.35),tmp*4.55); + c+=vec3(1.05,.12,.45)*sp*.7; + c+=vec3(.75,.08,.25)*flare*.6; + } + + c.r+=turb*.45+sp*.25; + c.g+=sin(ang*20+t*3.2)*.28; + c.b+=cos(ang*26-t*4.)*.32; + + return c; +} + +vec3 calcLighting(vec3 pos,vec3 d,float dens){ + vec3 lightDir=normalize(vec3(.3,.8,.5)); + + float shadow=1.; + vec3 p=pos; + for(int i=0;i<4;i++){ + p+=lightDir*.2; + float r=length(p); + float sd=getDensity(p,r); + shadow*=exp(-sd*.3); + if(shadow<.05)break; + } + + float diff=max(dot(normalize(vec3(0,1,0)),lightDir),0.)*.5+.5; + float rim=pow(1.-abs(dot(d,normalize(pos))),2.)*.3; + + return vec3(diff*shadow+rim); } vec3 march(vec3 o,vec3 d){ @@ -67,111 +168,64 @@ vec3 march(vec3 o,vec3 d){ vec3 col=vec3(0); float alpha=0; - for(int i=0;i<256;i++){ + for(int i=0;idi&&r.01){ + vec3 c=getColor(pos,r,dens); + vec3 light=calcLighting(pos,d,dens); - if(hs>.8) dens*=5.+sin(t*18)*1.5; - if(flare>.88) dens*=3.+sp2*2.; + float tmp=1.-(r-di)/(do_-di); + float br=dens*(4.+tmp*6.); + br*=(1.+sin(t*7.5+atan(pos.z,pos.x)*12.)*.65); - vec3 c; - float tmp=1.-dn; - - if(tmp>.8){ - c=mix(vec3(.5,.6,1.2),vec3(1.2,1.2,1.4),(tmp-.8)*5); - c+=vec3(.3,.5,1.5)*hs*4.; - c+=vec3(.8,.9,1.2)*flare*2.5; - }else if(tmp>.65){ - c=mix(vec3(.2,.8,1.2),vec3(.8,1.,1.2),(tmp-.65)*6.66); - c+=vec3(.4,1.2,1.5)*turb*1.2; - c+=vec3(.6,.8,1.)*sp2*.8; - }else if(tmp>.5){ - c=mix(vec3(.7,1.,.2),vec3(1.,1.,.6),(tmp-.5)*6.66); - c+=vec3(1.,1.2,.3)*sp*.9; - c+=vec3(.9,1.,.5)*turb*.7; - }else if(tmp>.35){ - c=mix(vec3(1.,.65,.08),vec3(1.,.95,.35),(tmp-.35)*6.66); - c+=vec3(1.3,.8,.15)*turb*1.; - c+=vec3(1.,.7,.2)*sp2*.6; - }else if(tmp>.2){ - c=mix(vec3(1.,.4,.05),vec3(1.,.7,.15),(tmp-.2)*6.66); - c+=vec3(1.2,.5,.1)*sp*.7; - }else{ - c=mix(vec3(.6,.03,.08),vec3(1.,.25,.4),tmp*5); - c+=vec3(1.,.15,.5)*sp*.6; - c+=vec3(.8,.1,.3)*flare*.5; - } - - c.r+=turb*.4+sp*.2; - c.g+=sin(ang*18+t*2.8)*.25; - c.b+=cos(ang*24-t*3.5)*.3; - - float br=dens*(3.5+tmp*5.); - br*=(1.+sin(t*6.5+ang*10.)*.6); - br*=(1.+cos(ang*5.-t*2.)*.4); - - vec3 dc=c*br; - float a=dens*.18; + vec3 dc=c*br*light; + float a=dens*.22; col+=dc*a*(1.-alpha); alpha+=a*(1.-alpha); - if(alpha>.97)break; + if(alpha>.98)break; } - float g=(sr*sr)/(r*r+.008); + float g=(sr*sr)/(r*r+.006); vec3 gd=-normalize(pos); - d=normalize(d+gd*g*.45); + d=normalize(d+gd*g*.5); - float step=.025+r*.012; - if(r>di-.6&&rdi-.7&&r30)break; + if(td>35)break; } vec3 sd=normalize(d); - float sn=h(sd.xy*250+sd.z*130); - if(sn>.9975){ - float sb=(sn-.9975)*1500; - vec3 sc=mix(vec3(1.,.95,.85),vec3(.85,.95,1.),h(sd.yz*145)); - float twinkle=.7+.3*sin(sn*1000.+t*5.); + float sn=h(sd.xy*280+sd.z*150); + if(sn>.9978){ + float sb=(sn-.9978)*2000; + vec3 sc=mix(vec3(1.,.96,.88),vec3(.88,.96,1.),h(sd.yz*165)); + float twinkle=.65+.35*sin(sn*1200.+t*6.); col+=sc*sb*twinkle*(1.-alpha); } - float bg=fbm(sd.xy*4.+t*.03)*.04; - vec3 nebula=mix(vec3(.08,.04,.12),vec3(.12,.06,.18),bg); + float bg=fbm(sd.xy*5.+t*.025)*.05; + vec3 nebula=mix(vec3(.06,.03,.1),vec3(.1,.05,.15),bg); + nebula+=vec3(.02,.01,.03)*fbm(sd.yz*3.-t*.02); col+=nebula*(1.-alpha); - col+=vec3(.001,.002,.008)*(1.-alpha); + col+=vec3(.0008,.0015,.006)*(1.-alpha); return col; } void main(){ vec2 uv_=(uv-.5)*2; + uv_.x*=res.x/res.y; + vec3 ro=cam; vec3 tgt=vec3(0); vec3 fwd=normalize(tgt-ro); @@ -179,21 +233,26 @@ void main(){ vec3 up=cross(fwd,rt); vec3 rd=normalize(fwd+uv_.x*rt+uv_.y*up); - vec3 c=march(ro,rd); + vec3 col=march(ro,rd); - c=c/(c+vec3(.4)); - c=pow(c,vec3(.88)); - c=pow(c,vec3(1./2.15)); + // Advanced tone mapping (ACES filmic) + col*=1.8; + vec3 a=col*(col+.0245786)-.000090537; + vec3 b=col*(.983729*col+.4329510)+.238081; + col=a/b; - c.r=pow(c.r,.92); - c.g=pow(c.g,.96); - c.b=pow(c.b,1.08); + // Color grading + col=pow(col,vec3(.85)); + col.r=pow(col.r,.9); + col.g=pow(col.g,.94); + col.b=pow(col.b,1.12); - float vig=1.-length(uv_*.35); - vig=pow(vig,1.2); - c*=.3+vig*.7; + // Subtle vignette + float vig=1.-length(uv_*.28); + vig=pow(vig,1.4); + col*=.25+vig*.75; - FragColor=vec4(c,1); + FragColor=vec4(col,1); } )"; @@ -231,22 +290,6 @@ void fbResize(GLFWwindow* w,int width,int height){ glViewport(0,0,width,height); } -float gCamDist=5.5f; -float gCamAngle=0.0f; -float gCamHeight=0.4f; -bool gAutoCam=true; - -void scroll_callback(GLFWwindow* w,double x,double y){ - gCamDist*=(y>0)?0.9f:1.1f; - gCamDist=fmax(1.5f,fmin(gCamDist,12.0f)); -} - -void key_callback(GLFWwindow* w,int key,int scan,int action,int mods){ - if(action==GLFW_PRESS){ - if(key==GLFW_KEY_C) gAutoCam=!gAutoCam; - } -} - int main(){ if(!glfwInit()){ std::cerr<<"GLFW init fail"< Date: Fri, 7 Nov 2025 11:20:05 +0530 Subject: [PATCH 3/4] FIX/: 512 rays steps + 10 octaves of noise --- blackhole/main.cpp | 108 +++++++++++++++++++++++---------------------- 1 file changed, 55 insertions(+), 53 deletions(-) diff --git a/blackhole/main.cpp b/blackhole/main.cpp index 5d7eb7e..66bce20 100644 --- a/blackhole/main.cpp +++ b/blackhole/main.cpp @@ -1,3 +1,4 @@ +// blackhole/main.cpp #ifdef __APPLE__ #define GL_SILENCE_DEPRECATION #include @@ -69,76 +70,76 @@ float fbm3(vec3 p){ float getDensity(vec3 pos,float r){ float dh=abs(pos.y); - float dt=.35+.2*sin(t*.9); + float dt=.4+.25*sin(t*.8); if(dh>=dt||r<=di||r>=do_)return 0.; float dn=(r-di)/(do_-di); - float av=(1./pow(dn+.08,0.35))*3.5; + float av=(1./pow(dn+.05,0.4))*4.2; float ang=atan(pos.z,pos.x)+t*av; - vec2 tc=vec2(ang*8.5+t*1.4,dn*22); + vec2 tc=vec2(ang*9.+t*1.6,dn*24); float turb=fbm(tc); - vec3 p3=pos*5.; - float turb3d=fbm3(p3+t*.5); + vec3 p3=pos*4.; + float turb3d=fbm3(p3+t*.4); - float sp=sin(ang*18-dn*28+t*6.)*.5+.5; - float sp2=sin(ang*25+dn*20-t*4.5)*.5+.5; + float sp=sin(ang*22-dn*32+t*7.)*.5+.5; + float sp2=sin(ang*28+dn*22-t*5.5)*.5+.5; - float hf=1.-pow(dh/dt,1.3); - float dens=turb*turb3d*hf*(.7+sp*.3); - dens*=(1.-pow(dn,.65)); + float hf=1.-pow(dh/dt,1.1); + float dens=turb*turb3d*hf*(.75+sp*.25); + dens*=(1.-pow(dn,.55)); - float hs=n(vec2(ang*12+t*3.,dn*15)); - float flare=n(vec2(ang*5-t*2.,dn*8)); + float hs=n(vec2(ang*14+t*3.5,dn*16)); + float flare=n(vec2(ang*6-t*2.2,dn*9)); - if(hs>.78) dens*=6.+sin(t*20.)*2.; - if(flare>.86) dens*=4.+sp2*3.; + if(hs>.75) dens*=7.+sin(t*22.)*2.5; + if(flare>.83) dens*=5.+sp2*3.5; return dens; } vec3 getColor(vec3 pos,float r,float dens){ float dn=(r-di)/(do_-di); - float ang=atan(pos.z,pos.x)+t*3.; + float ang=atan(pos.z,pos.x)+t*3.5; - float turb=fbm(vec2(ang*8.+t,dn*20)); - float sp=sin(ang*18-dn*28+t*6.)*.5+.5; - float sp2=sin(ang*25+dn*20-t*4.5)*.5+.5; - float hs=n(vec2(ang*12+t*3.,dn*15)); - float flare=n(vec2(ang*5-t*2.,dn*8)); + float turb=fbm(vec2(ang*9.+t*1.2,dn*22)); + float sp=sin(ang*22-dn*32+t*7.)*.5+.5; + float sp2=sin(ang*28+dn*22-t*5.5)*.5+.5; + float hs=n(vec2(ang*14+t*3.5,dn*16)); + float flare=n(vec2(ang*6-t*2.2,dn*9)); vec3 c; float tmp=1.-dn; - if(tmp>.82){ - c=mix(vec3(.4,.55,1.3),vec3(1.3,1.3,1.5),(tmp-.82)*5.5); - c+=vec3(.25,.45,1.6)*hs*5.; - c+=vec3(.7,.85,1.3)*flare*3.5; - }else if(tmp>.68){ - c=mix(vec3(.15,.75,1.3),vec3(.75,1.05,1.3),(tmp-.68)*7.14); - c+=vec3(.35,1.3,1.6)*turb*1.5; - c+=vec3(.55,.75,1.1)*sp2*1.; - }else if(tmp>.52){ - c=mix(vec3(.65,1.05,.15),vec3(1.05,1.1,.55),(tmp-.52)*6.25); - c+=vec3(1.1,1.3,.25)*sp*1.1; - c+=vec3(.85,1.05,.45)*turb*.9; - }else if(tmp>.38){ - c=mix(vec3(1.05,.6,.06),vec3(1.1,1.,.3),(tmp-.38)*7.14); - c+=vec3(1.4,.75,.12)*turb*1.2; - c+=vec3(1.05,.65,.18)*sp2*.75; - }else if(tmp>.22){ - c=mix(vec3(1.05,.35,.03),vec3(1.1,.65,.12),(tmp-.22)*6.25); - c+=vec3(1.3,.45,.08)*sp*.85; + if(tmp>.85){ + c=mix(vec3(.3,.5,1.6),vec3(1.5,1.6,2.),(tmp-.85)*6.66); + c+=vec3(.2,.4,2.2)*hs*6.; + c+=vec3(.6,.8,1.8)*flare*4.; + }else if(tmp>.7){ + c=mix(vec3(.1,.7,1.5),vec3(.7,1.2,1.8),(tmp-.7)*6.66); + c+=vec3(.3,1.5,2.)*turb*2.; + c+=vec3(.5,.9,1.4)*sp2*1.4; + }else if(tmp>.55){ + c=mix(vec3(.6,1.2,.1),vec3(1.2,1.4,.5),(tmp-.55)*6.66); + c+=vec3(1.3,1.6,.2)*sp*1.5; + c+=vec3(.8,1.2,.4)*turb*1.2; + }else if(tmp>.4){ + c=mix(vec3(1.2,.7,.05),vec3(1.4,1.1,.3),(tmp-.4)*6.66); + c+=vec3(1.8,.9,.1)*turb*1.6; + c+=vec3(1.3,.8,.15)*sp2*1.; + }else if(tmp>.25){ + c=mix(vec3(1.3,.4,.02),vec3(1.4,.8,.1),(tmp-.25)*6.66); + c+=vec3(1.6,.6,.05)*sp*1.1; }else{ - c=mix(vec3(.55,.02,.06),vec3(1.05,.2,.35),tmp*4.55); - c+=vec3(1.05,.12,.45)*sp*.7; - c+=vec3(.75,.08,.25)*flare*.6; + c=mix(vec3(.7,.02,.05),vec3(1.3,.25,.4),tmp*4.); + c+=vec3(1.4,.1,.5)*sp*.9; + c+=vec3(.9,.05,.3)*flare*.7; } - c.r+=turb*.45+sp*.25; - c.g+=sin(ang*20+t*3.2)*.28; - c.b+=cos(ang*26-t*4.)*.32; + c.r+=turb*.5+sp*.3; + c.g+=sin(ang*24+t*3.8)*.35; + c.b+=cos(ang*30-t*4.5)*.4; return c; } @@ -183,11 +184,12 @@ vec3 march(vec3 o,vec3 d){ vec3 light=calcLighting(pos,d,dens); float tmp=1.-(r-di)/(do_-di); - float br=dens*(4.+tmp*6.); - br*=(1.+sin(t*7.5+atan(pos.z,pos.x)*12.)*.65); + float br=dens*(5.5+tmp*7.5); + br*=(1.+sin(t*9.+atan(pos.z,pos.x)*15.)*.75); + br*=(1.+cos(atan(pos.z,pos.x)*8.-t*3.)*.5); vec3 dc=c*br*light; - float a=dens*.22; + float a=dens*.25; col+=dc*a*(1.-alpha); alpha+=a*(1.-alpha); if(alpha>.98)break; @@ -236,16 +238,16 @@ void main(){ vec3 col=march(ro,rd); // Advanced tone mapping (ACES filmic) - col*=1.8; + col*=2.2; vec3 a=col*(col+.0245786)-.000090537; vec3 b=col*(.983729*col+.4329510)+.238081; col=a/b; // Color grading - col=pow(col,vec3(.85)); - col.r=pow(col.r,.9); - col.g=pow(col.g,.94); - col.b=pow(col.b,1.12); + col=pow(col,vec3(.82)); + col.r=pow(col.r,.88); + col.g=pow(col.g,.92); + col.b=pow(col.b,1.15); // Subtle vignette float vig=1.-length(uv_*.28); From b2e2cbbad897ce92290f2271e9a442b291d9f5e8 Mon Sep 17 00:00:00 2001 From: hachimamma Date: Fri, 7 Nov 2025 11:23:56 +0530 Subject: [PATCH 4/4] UPDATE: final changes before further optimization --- blackhole/main.cpp | 4 ---- build.ps1 | 1 + build.sh | 2 ++ 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/blackhole/main.cpp b/blackhole/main.cpp index 66bce20..47e707b 100644 --- a/blackhole/main.cpp +++ b/blackhole/main.cpp @@ -347,10 +347,6 @@ int main(){ glm::mat4 mdl=glm::mat4(1.0f); glm::mat4 view=glm::translate(glm::mat4(1.0f),glm::vec3(0,0,-3)); - std::cout<<"Ultra Quality Black Hole Renderer\n"; - std::cout<<"Features: Volumetric lighting, 2x2 supersampling, ACES tone mapping\n"; - std::cout<<"Press ESC to exit\n\n"; - while(!glfwWindowShouldClose(win)){ if(glfwGetKey(win,GLFW_KEY_ESCAPE)==GLFW_PRESS) glfwSetWindowShouldClose(win,true); diff --git a/build.ps1 b/build.ps1 index b170356..466344f 100644 --- a/build.ps1 +++ b/build.ps1 @@ -12,6 +12,7 @@ switch ($choice) { "1" { $exe = "blackhole" $title = "Blackhole Simulation" + Write-Host "`n Press ESC to exit" } "2" { $exe = "fractal" diff --git a/build.sh b/build.sh index 5b1b1db..a1002d8 100755 --- a/build.sh +++ b/build.sh @@ -11,6 +11,8 @@ case $choice in 1) exe="blackhole" title="Blackhole Simulation" + echo "" + echo "Press ESC to exit" ;; 2) exe="fractal"