Tweak fog light falloff & density
This commit is contained in:
parent
1c0b9aa63f
commit
7b752703ea
4 changed files with 22 additions and 15 deletions
|
@ -8,6 +8,6 @@ const INV_SHADOW_SAMPLES = 1.0 / 25.0;
|
||||||
const FOG_MAX_STEPS = 20;
|
const FOG_MAX_STEPS = 20;
|
||||||
const FOG_MAX_DIST = 300.0;
|
const FOG_MAX_DIST = 300.0;
|
||||||
const FOG_SCALE = 0.01;
|
const FOG_SCALE = 0.01;
|
||||||
const FOG_DENSITY = 1.0;
|
const FOG_DENSITY = 2.0;
|
||||||
const FOG_ALPHA = 1.0;
|
const FOG_ALPHA = 1.0;
|
||||||
const FOG_BLEND_DIST = 10.0;
|
const FOG_BLEND_DIST = 10.0;
|
||||||
|
|
|
@ -63,7 +63,7 @@ var s_roughness_metalness: sampler;
|
||||||
fn fog_noise(pos: vec3<f32>) -> f32 {
|
fn fog_noise(pos: vec3<f32>) -> f32 {
|
||||||
var p = pos * FOG_SCALE;
|
var p = pos * FOG_SCALE;
|
||||||
p.x += global_uniforms.time * 0.01;
|
p.x += global_uniforms.time * 0.01;
|
||||||
p.y += global_uniforms.time * 0.1;
|
p.y += global_uniforms.time * 0.2;
|
||||||
p.z += sin(global_uniforms.time * 0.1) * 0.1;
|
p.z += sin(global_uniforms.time * 0.1) * 0.1;
|
||||||
return fbm(p);
|
return fbm(p);
|
||||||
}
|
}
|
||||||
|
@ -112,12 +112,12 @@ fn fs_main(vert: FogVertexOutput) -> @location(0) vec4<f32> {
|
||||||
let distance_to_volume = length(cam_to_volume);
|
let distance_to_volume = length(cam_to_volume);
|
||||||
let direction = cam_to_volume / distance_to_volume;
|
let direction = cam_to_volume / distance_to_volume;
|
||||||
// FIXME: t_geometry_depth is 0
|
// FIXME: t_geometry_depth is 0
|
||||||
// let geometry_depth = scene_depth(vert.clip_position) - distance_to_volume;
|
var geometry_depth = scene_depth(vert.clip_position) - distance_to_volume;
|
||||||
// if (geometry_depth <= 0.0)
|
geometry_depth = 3000.0;
|
||||||
// {
|
if (geometry_depth <= 0.0)
|
||||||
// return vec4<f32>(0.0);
|
{
|
||||||
// }
|
return vec4<f32>(0.0);
|
||||||
let geometry_depth = 3000.0;
|
}
|
||||||
let density = ray_march(vert.world_position.xyz, direction, geometry_depth);
|
let density = ray_march(vert.world_position.xyz, direction, geometry_depth);
|
||||||
|
|
||||||
var in_light = 0.0;
|
var in_light = 0.0;
|
||||||
|
@ -149,16 +149,16 @@ fn fs_main(vert: FogVertexOutput) -> @location(0) vec4<f32> {
|
||||||
in_light = 1.0;
|
in_light = 1.0;
|
||||||
}
|
}
|
||||||
|
|
||||||
var color = vec3<f32>(0.5, 0.5, 0.5);
|
var base_color = vec3<f32>(mix(0.8, 0.4, density));
|
||||||
let ambient_strength = 0.02;
|
let ambient_strength = 0.02;
|
||||||
let ambient_color = color * ambient_strength;
|
let ambient_color = base_color * ambient_strength;
|
||||||
|
|
||||||
var radiance = vec3<f32>(0.0);
|
var radiance = vec3<f32>(0.0);
|
||||||
if (in_light > 0.0) {
|
if (in_light > 0.0) {
|
||||||
// attenuation
|
// attenuation
|
||||||
let light_dist = length(light.position - vert.world_position.xyz);
|
let light_dist = length(light.position - vert.world_position.xyz);
|
||||||
let coef_a = 0.0;
|
let coef_a = 2.0;
|
||||||
let coef_b = 1.0;
|
let coef_b = 4.0;
|
||||||
let light_attenuation = 1.0 / (1.0 + coef_a * light_dist + coef_b * light_dist * light_dist);
|
let light_attenuation = 1.0 / (1.0 + coef_a * light_dist + coef_b * light_dist * light_dist);
|
||||||
|
|
||||||
radiance = light.color.rgb * light.color.a * light_attenuation * in_light;
|
radiance = light.color.rgb * light.color.a * light_attenuation * in_light;
|
||||||
|
|
|
@ -21,6 +21,7 @@ impl RenderPass {
|
||||||
is_shadow: bool,
|
is_shadow: bool,
|
||||||
has_transparency: bool,
|
has_transparency: bool,
|
||||||
write_depth: bool,
|
write_depth: bool,
|
||||||
|
cull_mode: Option<wgpu::Face>,
|
||||||
) -> Self {
|
) -> Self {
|
||||||
let layout = device.create_pipeline_layout(&wgpu::PipelineLayoutDescriptor {
|
let layout = device.create_pipeline_layout(&wgpu::PipelineLayoutDescriptor {
|
||||||
label: Some((label.to_owned() + " pipeline Layout").as_str()),
|
label: Some((label.to_owned() + " pipeline Layout").as_str()),
|
||||||
|
@ -42,6 +43,7 @@ impl RenderPass {
|
||||||
is_shadow,
|
is_shadow,
|
||||||
has_transparency,
|
has_transparency,
|
||||||
write_depth,
|
write_depth,
|
||||||
|
cull_mode,
|
||||||
);
|
);
|
||||||
|
|
||||||
Self { pipeline }
|
Self { pipeline }
|
||||||
|
@ -58,6 +60,7 @@ impl RenderPass {
|
||||||
is_shadow: bool,
|
is_shadow: bool,
|
||||||
has_transparency: bool,
|
has_transparency: bool,
|
||||||
write_depth: bool,
|
write_depth: bool,
|
||||||
|
cull_mode: Option<wgpu::Face>,
|
||||||
) -> wgpu::RenderPipeline {
|
) -> wgpu::RenderPipeline {
|
||||||
let shader = device.create_shader_module(shader);
|
let shader = device.create_shader_module(shader);
|
||||||
|
|
||||||
|
@ -101,7 +104,7 @@ impl RenderPass {
|
||||||
topology: wgpu::PrimitiveTopology::TriangleList,
|
topology: wgpu::PrimitiveTopology::TriangleList,
|
||||||
strip_index_format: None,
|
strip_index_format: None,
|
||||||
front_face: wgpu::FrontFace::Ccw,
|
front_face: wgpu::FrontFace::Ccw,
|
||||||
cull_mode: Some(wgpu::Face::Back),
|
cull_mode: cull_mode,
|
||||||
// Setting this to anything other than Fill requires Features::NON_FILL_POLYGON_MODE
|
// Setting this to anything other than Fill requires Features::NON_FILL_POLYGON_MODE
|
||||||
polygon_mode: wgpu::PolygonMode::Fill,
|
polygon_mode: wgpu::PolygonMode::Fill,
|
||||||
// Requires Features::DEPTH_CLIP_CONTROL
|
// Requires Features::DEPTH_CLIP_CONTROL
|
||||||
|
|
|
@ -156,7 +156,7 @@ impl State {
|
||||||
config.width,
|
config.width,
|
||||||
config.height,
|
config.height,
|
||||||
1,
|
1,
|
||||||
wgpu::TextureUsages::RENDER_ATTACHMENT | wgpu::TextureUsages::TEXTURE_BINDING | wgpu::TextureUsages::COPY_DST,
|
wgpu::TextureUsages::RENDER_ATTACHMENT | wgpu::TextureUsages::TEXTURE_BINDING,
|
||||||
true,
|
true,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -445,6 +445,7 @@ impl State {
|
||||||
true,
|
true,
|
||||||
false,
|
false,
|
||||||
true,
|
true,
|
||||||
|
Some(wgpu::Face::Back),
|
||||||
);
|
);
|
||||||
|
|
||||||
let geometry_pass = RenderPass::new(
|
let geometry_pass = RenderPass::new(
|
||||||
|
@ -464,6 +465,7 @@ impl State {
|
||||||
false,
|
false,
|
||||||
false,
|
false,
|
||||||
true,
|
true,
|
||||||
|
Some(wgpu::Face::Back),
|
||||||
);
|
);
|
||||||
|
|
||||||
let light_debug_pass = RenderPass::new(
|
let light_debug_pass = RenderPass::new(
|
||||||
|
@ -478,6 +480,7 @@ impl State {
|
||||||
false,
|
false,
|
||||||
false,
|
false,
|
||||||
true,
|
true,
|
||||||
|
Some(wgpu::Face::Back),
|
||||||
);
|
);
|
||||||
|
|
||||||
let fog_pass = RenderPass::new(
|
let fog_pass = RenderPass::new(
|
||||||
|
@ -497,6 +500,7 @@ impl State {
|
||||||
false,
|
false,
|
||||||
true,
|
true,
|
||||||
false,
|
false,
|
||||||
|
Some(wgpu::Face::Back),
|
||||||
);
|
);
|
||||||
|
|
||||||
Self {
|
Self {
|
||||||
|
@ -548,7 +552,7 @@ impl State {
|
||||||
self.config.width,
|
self.config.width,
|
||||||
self.config.height,
|
self.config.height,
|
||||||
1,
|
1,
|
||||||
wgpu::TextureUsages::RENDER_ATTACHMENT | wgpu::TextureUsages::TEXTURE_BINDING | wgpu::TextureUsages::COPY_DST,
|
wgpu::TextureUsages::RENDER_ATTACHMENT | wgpu::TextureUsages::TEXTURE_BINDING,
|
||||||
true,
|
true,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue