Star Nest

Originally made by Pablo Roman Andrioli

Ported from Shadertoy: https://www.shadertoy.com/view/XlfGRj

 

+ Coloramp feature

Shader code
// Star Nest by Pablo Roman Andrioli
// Ported to Godot by Lyagva
// License: MIT
shader_type canvas_item;

uniform int iterations = 17;
uniform float formuparam = 0.53;

uniform int volsteps = 10;
uniform float stepsize = 0.1;

uniform float zoom   = 0.800;
uniform float tile   = 0.850;
uniform float speed  = 0.001;

uniform float brightness = 0.0015;
uniform float darkmatter = 0.300;
uniform float distfading = 0.730;
uniform float saturation = 0.850;

uniform vec2 rotation;
uniform sampler2D coloramp;
uniform float colorampMix = .5;
uniform bool isColoramp;

void fragment()
{
	vec2 fragCoord = FRAGCOORD.xy;
	vec2 iResolution = 1.0 / SCREEN_PIXEL_SIZE;
	float iTime = TIME;

	//get coords and direction
	vec2 uv=fragCoord.xy/iResolution.xy-.5;
	uv.y*=iResolution.y/iResolution.x;
	vec3 dir=vec3(uv*zoom,1.);
	float time=iTime*speed+.25;

	//mouse rotation
	float a1 = .5 + rotation.x / iResolution.x * 2.;
	float a2 = .8 + rotation.y / iResolution.y * 2.;
	mat2 rot1 = mat2(vec2(cos(a1), sin(a1)), vec2(-sin(a1), cos(a1)));
	mat2 rot2 = mat2(vec2(cos(a2), sin(a2)), vec2(-sin(a2), cos(a2)));
	dir.xz *= rot1;
	dir.xy *= rot2;
	vec3 from = vec3(1.,.5,0.5);
	from += vec3(time * 2., time, -2.);
	from.xz *= rot1;
	from.xy *= rot2;

	//volumetric rendering
	float s = 0.1, fade = 1.;
	vec3 v=vec3(0.);
	for (int r=0; r<volsteps; r++) {
		vec3 p=from+s*dir*.5;
		p = abs(vec3(tile)-mod(p,vec3(tile*2.))); // tiling fold
		float pa,a=pa=0.;
		for (int i=0; i<iterations; i++) {
			p=abs(p)/dot(p,p)-formuparam; // the magic formula
			a+=abs(length(p)-pa); // absolute sum of average change
			pa=length(p);
		}
		float dm=max(0.,darkmatter-a*a*.001); //dark matter
		a*=a*a; // add contrast
		if (r>6) fade*=1.-dm; // dark matter, don't render near
		//v+=vec3(dm,dm*.5,0.);
		v+=fade;
		v+=vec3(s,s*s,s*s*s*s)*a*brightness*fade; // coloring based on distance
		fade*=distfading; // distance fading
		s+=stepsize;
	}
	v=mix(vec3(length(v)),v,saturation); //color adjust

	COLOR = vec4(v*.01,1.);

	if (isColoramp) {
		COLOR += texture(coloramp, vec2(v.r * .01, 0.)) * colorampMix;
	}

}
Tags
background, canvas, space, star
The shader code and all code snippets in this post are under MIT license and can be used freely. Images and videos, and assets depicted in those, do not fall under this license. For more info, see our License terms.

Related shaders

Star Nest

Flaring Star

Phantom Star for Godot 4.2

Subscribe
Notify of
guest

2 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
TheYellowArchitect
1 year ago

This is genuinely unbelievable. A literal universe generator. Dynamically generated. It doesn’t require a supercomputer. In fact, it’s just a shader. I am using it for almost 1 hour in a row at the moment, it feels like I found AI-generated art, I just can’t stop seeing the combinations.

Seeing the cosmos makes me wonder… How do I make a .gdshader my desktop background?

Pablo Andrioli
1 month ago

thanks glad you had some fun with it 🙂