Rename argument to avoid accidental confusion with uniform
This commit is contained in:
parent
0aac2724b9
commit
6103ec084a
@ -6,66 +6,66 @@
|
||||
// https://iquilezles.org/articles/fog/ (Atmospheric Fog and Scattering)
|
||||
|
||||
fn scattering_adjusted_fog_color(
|
||||
fog: Fog,
|
||||
fog_params: Fog,
|
||||
scattering: vec3<f32>,
|
||||
) -> vec4<f32> {
|
||||
if (fog.directional_light_color.a > 0.0) {
|
||||
if (fog_params.directional_light_color.a > 0.0) {
|
||||
return vec4<f32>(
|
||||
fog.base_color.rgb
|
||||
+ scattering * fog.directional_light_color.rgb * fog.directional_light_color.a,
|
||||
fog.base_color.a,
|
||||
fog_params.base_color.rgb
|
||||
+ scattering * fog_params.directional_light_color.rgb * fog_params.directional_light_color.a,
|
||||
fog_params.base_color.a,
|
||||
);
|
||||
} else {
|
||||
return fog.base_color;
|
||||
return fog_params.base_color;
|
||||
}
|
||||
}
|
||||
|
||||
fn linear_fog(
|
||||
fog: Fog,
|
||||
fog_params: Fog,
|
||||
input_color: vec4<f32>,
|
||||
distance: f32,
|
||||
scattering: vec3<f32>,
|
||||
) -> vec4<f32> {
|
||||
var fog_color = scattering_adjusted_fog_color(fog, scattering);
|
||||
let start = fog.be.x;
|
||||
let end = fog.be.y;
|
||||
var fog_color = scattering_adjusted_fog_color(fog_params, scattering);
|
||||
let start = fog_params.be.x;
|
||||
let end = fog_params.be.y;
|
||||
fog_color.a *= 1.0 - clamp((end - distance) / (end - start), 0.0, 1.0);
|
||||
return vec4<f32>(mix(input_color.rgb, fog_color.rgb, fog_color.a), input_color.a);
|
||||
}
|
||||
|
||||
fn exponential_fog(
|
||||
fog: Fog,
|
||||
fog_params: Fog,
|
||||
input_color: vec4<f32>,
|
||||
distance: f32,
|
||||
scattering: vec3<f32>,
|
||||
) -> vec4<f32> {
|
||||
var fog_color = scattering_adjusted_fog_color(fog, scattering);
|
||||
let density = fog.be.x;
|
||||
var fog_color = scattering_adjusted_fog_color(fog_params, scattering);
|
||||
let density = fog_params.be.x;
|
||||
fog_color.a *= 1.0 - 1.0 / exp(distance * density);
|
||||
return vec4<f32>(mix(input_color.rgb, fog_color.rgb, fog_color.a), input_color.a);
|
||||
}
|
||||
|
||||
fn exponential_squared_fog(
|
||||
fog: Fog,
|
||||
fog_params: Fog,
|
||||
input_color: vec4<f32>,
|
||||
distance: f32,
|
||||
scattering: vec3<f32>,
|
||||
) -> vec4<f32> {
|
||||
var fog_color = scattering_adjusted_fog_color(fog, scattering);
|
||||
let distance_times_density = distance * fog.be.x;
|
||||
var fog_color = scattering_adjusted_fog_color(fog_params, scattering);
|
||||
let distance_times_density = distance * fog_params.be.x;
|
||||
fog_color.a *= 1.0 - 1.0 / exp(distance_times_density * distance_times_density);
|
||||
return vec4<f32>(mix(input_color.rgb, fog_color.rgb, fog_color.a), input_color.a);
|
||||
}
|
||||
|
||||
fn atmospheric_fog(
|
||||
fog: Fog,
|
||||
fog_params: Fog,
|
||||
input_color: vec4<f32>,
|
||||
distance: f32,
|
||||
scattering: vec3<f32>,
|
||||
) -> vec4<f32> {
|
||||
var fog_color = scattering_adjusted_fog_color(fog, scattering);
|
||||
let extinction_factor = 1.0 - 1.0 / exp(distance * fog.be);
|
||||
let inscattering_factor = 1.0 - 1.0 / exp(distance * fog.bi);
|
||||
var fog_color = scattering_adjusted_fog_color(fog_params, scattering);
|
||||
let extinction_factor = 1.0 - 1.0 / exp(distance * fog_params.be);
|
||||
let inscattering_factor = 1.0 - 1.0 / exp(distance * fog_params.bi);
|
||||
return vec4<f32>(
|
||||
input_color.rgb * (1.0 - extinction_factor * fog_color.a)
|
||||
+ fog_color.rgb * inscattering_factor * fog_color.a,
|
||||
|
||||
@ -271,7 +271,7 @@ fn pbr(
|
||||
#endif // PREPASS_FRAGMENT
|
||||
|
||||
#ifndef PREPASS_FRAGMENT
|
||||
fn apply_fog(fog: Fog, input_color: vec4<f32>, fragment_world_position: vec3<f32>, view_world_position: vec3<f32>) -> vec4<f32> {
|
||||
fn apply_fog(fog_params: Fog, input_color: vec4<f32>, fragment_world_position: vec3<f32>, view_world_position: vec3<f32>) -> vec4<f32> {
|
||||
let view_to_world = fragment_world_position.xyz - view_world_position.xyz;
|
||||
|
||||
// `length()` is used here instead of just `view_to_world.z` since that produces more
|
||||
@ -281,7 +281,7 @@ fn apply_fog(fog: Fog, input_color: vec4<f32>, fragment_world_position: vec3<f32
|
||||
let distance = length(view_to_world);
|
||||
|
||||
var scattering = vec3<f32>(0.0);
|
||||
if fog.directional_light_color.a > 0.0 {
|
||||
if fog_params.directional_light_color.a > 0.0 {
|
||||
let view_to_world_normalized = view_to_world / distance;
|
||||
let n_directional_lights = lights.n_directional_lights;
|
||||
for (var i: u32 = 0u; i < n_directional_lights; i = i + 1u) {
|
||||
@ -291,19 +291,19 @@ fn apply_fog(fog: Fog, input_color: vec4<f32>, fragment_world_position: vec3<f32
|
||||
dot(view_to_world_normalized, light.direction_to_light),
|
||||
0.0
|
||||
),
|
||||
fog.directional_light_exponent
|
||||
fog_params.directional_light_exponent
|
||||
) * light.color.rgb;
|
||||
}
|
||||
}
|
||||
|
||||
if fog.mode == FOG_MODE_LINEAR {
|
||||
return linear_fog(fog, input_color, distance, scattering);
|
||||
} else if fog.mode == FOG_MODE_EXPONENTIAL {
|
||||
return exponential_fog(fog, input_color, distance, scattering);
|
||||
} else if fog.mode == FOG_MODE_EXPONENTIAL_SQUARED {
|
||||
return exponential_squared_fog(fog, input_color, distance, scattering);
|
||||
} else if fog.mode == FOG_MODE_ATMOSPHERIC {
|
||||
return atmospheric_fog(fog, input_color, distance, scattering);
|
||||
if fog_params.mode == FOG_MODE_LINEAR {
|
||||
return linear_fog(fog_params, input_color, distance, scattering);
|
||||
} else if fog_params.mode == FOG_MODE_EXPONENTIAL {
|
||||
return exponential_fog(fog_params, input_color, distance, scattering);
|
||||
} else if fog_params.mode == FOG_MODE_EXPONENTIAL_SQUARED {
|
||||
return exponential_squared_fog(fog_params, input_color, distance, scattering);
|
||||
} else if fog_params.mode == FOG_MODE_ATMOSPHERIC {
|
||||
return atmospheric_fog(fog_params, input_color, distance, scattering);
|
||||
} else {
|
||||
return input_color;
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user