simple sphere
Minimal raymarched sphere with mouse-controlled camera orbit, soft blue lighting, fresnel glow, and subtle vignette.
Shader Preview Unavailable
This realtime shader may be too intensive for your current device or browser.
Shader Code
/*
=================================================
BLOKS Shader Header v1.0
=================================================
@title Blue SDF Sphere
@author BLOKS
@description Minimal raymarched sphere with mouse-controlled camera orbit, soft blue lighting, fresnel glow, and subtle vignette.
@category Raymarching
@tags sdf, sphere, raymarching, mouse, camera, blue, fresnel, minimal
@audio false
@mouse true
@featured false
@version 1.0.0
@license BLOKS
*/
float sdSphere(vec3 p, float r)
{
return length(p) - r;
}
float map(vec3 p)
{
return sdSphere(p, 1.0);
}
mat2 rot(float a)
{
float c = cos(a);
float s = sin(a);
return mat2(c, -s, s, c);
}
vec3 getNormal(vec3 p)
{
vec2 e = vec2(0.001, 0.0);
return normalize(vec3(
map(p + e.xyy) - map(p - e.xyy),
map(p + e.yxy) - map(p - e.yxy),
map(p + e.yyx) - map(p - e.yyx)
));
}
void mainImage(out vec4 fragColor, in vec2 fragCoord)
{
vec2 uv = fragCoord.xy / iResolution.xy;
vec2 p = uv * 2.0 - 1.0;
p.x *= iResolution.x / iResolution.y;
/*
-------------------------------------------------
Pointer / mouse
-------------------------------------------------
uPointer is normalized 0..1.
This replaces older iMouse.xy behavior.
-------------------------------------------------
*/
vec2 m = uPointer;
float yaw = (m.x - 0.5) * 1.8;
float pitch = (m.y - 0.5) * 1.1;
/*
-------------------------------------------------
Ray setup
-------------------------------------------------
*/
vec3 ro = vec3(0.0, 0.0, -4.0);
vec3 rd = normalize(vec3(p, 1.5));
rd.xz *= rot(yaw);
rd.yz *= rot(pitch);
/*
-------------------------------------------------
Raymarch
-------------------------------------------------
*/
float t = 0.0;
float hit = 0.0;
for (int i = 0; i < 80; i++)
{
vec3 pos = ro + rd * t;
float d = map(pos);
if (d < 0.001)
{
hit = 1.0;
break;
}
t += d;
if (t > 20.0)
{
break;
}
}
/*
-------------------------------------------------
Shading
-------------------------------------------------
*/
vec3 bg = vec3(0.02, 0.03, 0.08);
vec3 col = bg;
if (hit > 0.5)
{
vec3 pos = ro + rd * t;
vec3 normal = getNormal(pos);
vec3 lightDir = normalize(vec3(0.6, 0.8, -0.5));
float diff = max(dot(normal, lightDir), 0.0);
float fresnel = pow(1.0 - max(dot(normal, -rd), 0.0), 3.0);
vec3 base = vec3(0.10, 0.20, 0.85);
vec3 glow = vec3(0.25, 0.65, 1.0);
col = base * (0.18 + diff * 0.85);
col += glow * fresnel * 0.75;
}
/*
-------------------------------------------------
Vignette
-------------------------------------------------
*/
float vignette = smoothstep(1.4, 0.2, length(p));
col *= vignette;
fragColor = vec4(col, 1.0);
}
