Search across packages, versions, files, declarations, and comments. Use multiple terms to narrow results (AND), and add @vertex, @fragment, or @compute to filter by shader stage.
1//! Fog formulas adapted from:
2//! https://learn.microsoft.com/en-us/windows/win32/direct3d9/fog-formulas
3//! https://catlikecoding.com/unity/tutorials/rendering/part-14/
4//! https://iquilezles.org/articles/fog/ (Atmospheric Fog and Scattering)
6import package::render::{
7 mesh_view_bindings::fog,
8 mesh_view_types::Fog,
9};
12fn scattering_adjusted_fog_color(
13 fog_params: Fog,
14 scattering: vec3<f32>,
15) -> vec4<f32> {
16 if (fog_params.directional_light_color.a > 0.0) {
17 return vec4<f32>(
18 fog_params.base_color.rgb
19 + scattering * fog_params.directional_light_color.rgb * fog_params.directional_light_color.a,
20 fog_params.base_color.a,
21 );
22 } else {
23 return fog_params.base_color;
24 }
27fn linear_fog(
28 fog_params: Fog,
29 input_color: vec4<f32>,
30 distance: f32,
31 scattering: vec3<f32>,
32) -> vec4<f32> {
33 var fog_color = scattering_adjusted_fog_color(fog_params, scattering);
34 let start = fog_params.be.x;
35 let end = fog_params.be.y;
36 fog_color.a *= 1.0 - clamp((end - distance) / (end - start), 0.0, 1.0);
37 return vec4<f32>(mix(input_color.rgb, fog_color.rgb, fog_color.a), input_color.a);
40fn exponential_fog(
41 fog_params: Fog,
42 input_color: vec4<f32>,
43 distance: f32,
44 scattering: vec3<f32>,
45) -> vec4<f32> {
46 var fog_color = scattering_adjusted_fog_color(fog_params, scattering);
47 let density = fog_params.be.x;
48 fog_color.a *= 1.0 - 1.0 / exp(distance * density);
49 return vec4<f32>(mix(input_color.rgb, fog_color.rgb, fog_color.a), input_color.a);
52fn exponential_squared_fog(
53 fog_params: Fog,
54 input_color: vec4<f32>,
55 distance: f32,
56 scattering: vec3<f32>,
57) -> vec4<f32> {
58 var fog_color = scattering_adjusted_fog_color(fog_params, scattering);
59 let distance_times_density = distance * fog_params.be.x;
60 fog_color.a *= 1.0 - 1.0 / exp(distance_times_density * distance_times_density);
61 return vec4<f32>(mix(input_color.rgb, fog_color.rgb, fog_color.a), input_color.a);
64fn atmospheric_fog(
65 fog_params: Fog,
66 input_color: vec4<f32>,
67 distance: f32,
68 scattering: vec3<f32>,
69) -> vec4<f32> {
70 var fog_color = scattering_adjusted_fog_color(fog_params, scattering);
71 let extinction_factor = 1.0 - 1.0 / exp(distance * fog_params.be);
72 let inscattering_factor = 1.0 - 1.0 / exp(distance * fog_params.bi);
73 return vec4<f32>(
74 input_color.rgb * (1.0 - extinction_factor * fog_color.a)
75 + fog_color.rgb * inscattering_factor * fog_color.a,
76 input_color.a
77 );
Contents