69 lines
1.6 KiB
Plaintext
69 lines
1.6 KiB
Plaintext
[sudo mkswap /swapfilenzsl_version("1.1")]
|
|
module;
|
|
|
|
struct FragIn
|
|
{
|
|
[location(0)] time: f32,
|
|
[location(1)] res: vec2[f32],
|
|
[location(2)] pos: vec2[f32],
|
|
}
|
|
|
|
struct FragOut
|
|
{
|
|
[location(0)] color: vec4[f32]
|
|
}
|
|
|
|
[entry(frag)]
|
|
fn main(input: FragIn) -> FragOut
|
|
{
|
|
const I: i32 = 32;
|
|
const A: f32 = 7.5;
|
|
const MA: f32 = 2.0;
|
|
const MI: f32 = 0.001;
|
|
|
|
let uv0 = input.pos / input.res * 2.0 - vec2[f32](1.0, 1.0);
|
|
let uv = vec2[f32](uv0.x * (input.res.x / input.res.y), uv0.y);
|
|
|
|
let col = vec4[f32](0.0, 0.0, 0.0, 0.0);
|
|
let ro = vec4[f32](0.0, 0.0, -2.0, 0.0);
|
|
let rd = vec4[f32](uv.x, uv.y, 1.0, 0.0);
|
|
let dt = 0.0;
|
|
let ds = 0.0;
|
|
let dm = -1.0;
|
|
let p = ro;
|
|
let c = vec4[f32](0.0, 0.0, 0.0, 0.0);
|
|
|
|
let l = vec4[f32](0.0, sin(input.time * 0.2) * 4.0, cos(input.time * 0.2) * 4.0, 0.0);
|
|
|
|
for i in 0 -> I
|
|
{
|
|
p = ro + rd * dt;
|
|
ds = length(c - p) - 1.0;
|
|
dt += ds;
|
|
|
|
if (dm == -1.0 || ds < dm)
|
|
dm = ds;
|
|
|
|
if (ds <= MI)
|
|
{
|
|
let value = max(dot(normalize(c - p), normalize(p - l)), 0.0);
|
|
col = vec4[f32](value, value, value, 1.0);
|
|
break;
|
|
}
|
|
|
|
if (ds >= MA)
|
|
{
|
|
if (dot(normalize(rd), normalize(l - ro)) < 1.0)
|
|
{
|
|
let value = max(dot(normalize(rd), normalize(l - ro)) + 0.15, 0.0) / 1.15 * max(1.0 - dm * A, 0.0);
|
|
col = vec4[f32](value, value, value, 1.0);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
let output: FragOut;
|
|
output.color = col;
|
|
return output;
|
|
}
|