Make spheres a bit fuzzy
This commit is contained in:
parent
048b19fd25
commit
d390df6564
|
|
@ -60,6 +60,8 @@ fn to_sphere(center: vec3f, radius: f32, t: ptr<function, f32>) -> bool {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn trace_fragment(in: Varying) -> vec4f {
|
fn trace_fragment(in: Varying) -> vec4f {
|
||||||
|
seed(in.screen);
|
||||||
|
|
||||||
var result = vec4(0.0, 0.0, 0.0, 0.0);
|
var result = vec4(0.0, 0.0, 0.0, 0.0);
|
||||||
var color = vec3(1.0, 1.0, 1.0);
|
var color = vec3(1.0, 1.0, 1.0);
|
||||||
pos = in.eye;
|
pos = in.eye;
|
||||||
|
|
@ -83,7 +85,9 @@ fn trace_fragment(in: Varying) -> vec4f {
|
||||||
let normal = (pos - s.center) / s.radius;
|
let normal = (pos - s.center) / s.radius;
|
||||||
result += vec4(color * s.emit_color * -dot(normal, ray), 0.0);
|
result += vec4(color * s.emit_color * -dot(normal, ray), 0.0);
|
||||||
color *= s.reflect_color;
|
color *= s.reflect_color;
|
||||||
ray = reflect(ray, normal);
|
let diffuse = normal + rand_sphere();
|
||||||
|
let specular = reflect(ray, normal);
|
||||||
|
ray = normalize(mix(diffuse, specular, 0.8));
|
||||||
if (length(color) < params.min_strength) {
|
if (length(color) < params.min_strength) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
@ -91,3 +95,38 @@ fn trace_fragment(in: Varying) -> vec4f {
|
||||||
|
|
||||||
return clamp(result, vec4(0.0), vec4(1.0));
|
return clamp(result, vec4(0.0), vec4(1.0));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn hash(key : u32) -> u32 {
|
||||||
|
var v = key;
|
||||||
|
v *= 0xb384af1bu;
|
||||||
|
v ^= v >> 15u;
|
||||||
|
return v;
|
||||||
|
}
|
||||||
|
|
||||||
|
var<private> rand_state: u32;
|
||||||
|
|
||||||
|
fn seed(key: vec4f) {
|
||||||
|
let x = bitcast<u32>(key.x);
|
||||||
|
let y = bitcast<u32>(key.y);
|
||||||
|
rand_state = hash(hash(x) ^ y);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn rand_next() -> u32 {
|
||||||
|
rand_state = hash(rand_state);
|
||||||
|
return rand_state;
|
||||||
|
}
|
||||||
|
|
||||||
|
fn rand_float() -> f32 {
|
||||||
|
return f32(rand_next()) / 0x1p32;
|
||||||
|
}
|
||||||
|
|
||||||
|
fn rand_sphere() -> vec3f {
|
||||||
|
loop {
|
||||||
|
let v = vec3f(rand_float(), rand_float(), rand_float());
|
||||||
|
let l = length(v);
|
||||||
|
if (length(v) <= 1.0) {
|
||||||
|
return v / l;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return vec3f(0.0); // unreachable
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user