Fake IBL
This commit is contained in:
parent
b908fbe74d
commit
ed55efbe8d
|
@ -116,6 +116,45 @@ fn BRDF(
|
||||||
return (Fr + Fd) * NoL;
|
return (Fr + Fd) * NoL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn sample_ibl_fake(
|
||||||
|
n_color: vec3<f32>,
|
||||||
|
s_color: vec3<f32>,
|
||||||
|
gradient: f32,
|
||||||
|
coords: vec3<f32>,
|
||||||
|
) -> vec3<f32> {
|
||||||
|
let blend = coords.y / gradient + 0.5;
|
||||||
|
return mix(s_color, n_color, clamp(blend, 0.0, 1.0));
|
||||||
|
}
|
||||||
|
|
||||||
|
fn F_Schlick_Roughness(cos_theta: f32, f0: vec3<f32>, roughness: f32) -> vec3<f32> {
|
||||||
|
return f0 + (max(vec3<f32>(1.0 - roughness), f0) - f0) * pow(clamp(1.0 - cos_theta, 0.0, 1.0), 5.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
let N_COLOR = vec3<f32>(0.7, 0.0, 1.0);
|
||||||
|
let S_COLOR = vec3<f32>(0.1, 0.1, 0.1);
|
||||||
|
let IBL_G = 1.0;
|
||||||
|
|
||||||
|
fn fake_ibl(
|
||||||
|
n: vec3<f32>, // normalized surface normal
|
||||||
|
v: vec3<f32>, // normalized view direction
|
||||||
|
albedo: vec3<f32>, // surface albedo
|
||||||
|
metallic: f32, // surface metallic
|
||||||
|
roughness: f32, // surface roughness
|
||||||
|
) -> vec3<f32> {
|
||||||
|
// calculate reflectance at surface incidence
|
||||||
|
let f0 = mix(vec3<f32>(0.04), albedo, metallic);
|
||||||
|
let kS = F_Schlick_Roughness(max(dot(n, v), 0.0), f0, roughness);
|
||||||
|
let kD = 1.0 - kS;
|
||||||
|
let diffuse = sample_ibl_fake(N_COLOR, S_COLOR, IBL_G, n);
|
||||||
|
|
||||||
|
let R = normalize(reflect(-v, n));
|
||||||
|
let specular = sample_ibl_fake(N_COLOR, S_COLOR, IBL_G, R);
|
||||||
|
|
||||||
|
let received = kD * diffuse + kS * specular;
|
||||||
|
|
||||||
|
return received * albedo;
|
||||||
|
}
|
||||||
|
|
||||||
[[stage(vertex)]]
|
[[stage(vertex)]]
|
||||||
fn vs_main(
|
fn vs_main(
|
||||||
[[builtin(instance_index)]] mesh_idx: u32,
|
[[builtin(instance_index)]] mesh_idx: u32,
|
||||||
|
@ -162,5 +201,8 @@ fn fs_main(
|
||||||
lum = lum + (radiance * reflected);
|
lum = lum + (radiance * reflected);
|
||||||
}
|
}
|
||||||
|
|
||||||
return vec4<f32>(lum, 1.0);
|
lum = lum + fake_ibl(normal, view, albedo, metallic, roughness);
|
||||||
|
|
||||||
|
let tone_mapped = lum / (lum + 1.0);
|
||||||
|
return vec4<f32>(tone_mapped, 1.0);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue