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#define_import_path bevy_pbr::fog
3#import bevy_pbr::{
4 mesh_view_bindings::fog,
5 mesh_view_types::Fog,
6}
8// Fog formulas adapted from:
9// https://learn.microsoft.com/en-us/windows/win32/direct3d9/fog-formulas
10// https://catlikecoding.com/unity/tutorials/rendering/part-14/
11// https://iquilezles.org/articles/fog/ (Atmospheric Fog and Scattering)
13fn scattering_adjusted_fog_color(
14 fog_params: Fog,
15 scattering: vec3<f32>,
16) -> vec4<f32> {
17 if (fog_params.directional_light_color.a > 0.0) {
18 return vec4<f32>(
19 fog_params.base_color.rgb
20 + scattering * fog_params.directional_light_color.rgb * fog_params.directional_light_color.a,
21 fog_params.base_color.a,
22 );
23 } else {
24 return fog_params.base_color;
25 }
28fn linear_fog(
29 fog_params: Fog,
30 input_color: vec4<f32>,
31 distance: f32,
32 scattering: vec3<f32>,
33) -> vec4<f32> {
34 var fog_color = scattering_adjusted_fog_color(fog_params, scattering);
35 let start = fog_params.be.x;
36 let end = fog_params.be.y;
37 fog_color.a *= 1.0 - clamp((end - distance) / (end - start), 0.0, 1.0);
38 return vec4<f32>(mix(input_color.rgb, fog_color.rgb, fog_color.a), input_color.a);
41fn exponential_fog(
42 fog_params: Fog,
43 input_color: vec4<f32>,
44 distance: f32,
45 scattering: vec3<f32>,
46) -> vec4<f32> {
47 var fog_color = scattering_adjusted_fog_color(fog_params, scattering);
48 let density = fog_params.be.x;
49 fog_color.a *= 1.0 - 1.0 / exp(distance * density);
50 return vec4<f32>(mix(input_color.rgb, fog_color.rgb, fog_color.a), input_color.a);
53fn exponential_squared_fog(
54 fog_params: Fog,
55 input_color: vec4<f32>,
56 distance: f32,
57 scattering: vec3<f32>,
58) -> vec4<f32> {
59 var fog_color = scattering_adjusted_fog_color(fog_params, scattering);
60 let distance_times_density = distance * fog_params.be.x;
61 fog_color.a *= 1.0 - 1.0 / exp(distance_times_density * distance_times_density);
62 return vec4<f32>(mix(input_color.rgb, fog_color.rgb, fog_color.a), input_color.a);
65fn atmospheric_fog(
66 fog_params: Fog,
67 input_color: vec4<f32>,
68 distance: f32,
69 scattering: vec3<f32>,
70) -> vec4<f32> {
71 var fog_color = scattering_adjusted_fog_color(fog_params, scattering);
72 let extinction_factor = 1.0 - 1.0 / exp(distance * fog_params.be);
73 let inscattering_factor = 1.0 - 1.0 / exp(distance * fog_params.bi);
74 return vec4<f32>(
75 input_color.rgb * (1.0 - extinction_factor * fog_color.a)
76 + fog_color.rgb * inscattering_factor * fog_color.a,
77 input_color.a
78 );
Contents