Controllable ambient light color (#852)

Control ambient light color via resource

The AmbientLight resource now controls the ambient light color in the
pbr fragment shader.
This commit is contained in:
Jackson Lango 2020-11-15 11:34:55 -08:00 committed by GitHub
parent 23fcdfae56
commit 18195bfa91
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 28 additions and 6 deletions

View file

@ -32,7 +32,8 @@ impl Plugin for PbrPlugin {
.add_system_to_stage( .add_system_to_stage(
stage::POST_UPDATE, stage::POST_UPDATE,
shader::asset_shader_defs_system::<StandardMaterial>.system(), shader::asset_shader_defs_system::<StandardMaterial>.system(),
); )
.init_resource::<AmbientLight>();
let resources = app.resources(); let resources = app.resources();
let mut render_graph = resources.get_mut::<RenderGraph>().unwrap(); let mut render_graph = resources.get_mut::<RenderGraph>().unwrap();
add_pbr_graph(&mut render_graph, resources); add_pbr_graph(&mut render_graph, resources);

View file

@ -53,3 +53,17 @@ impl LightRaw {
} }
} }
} }
// Ambient light color.
#[derive(Debug)]
pub struct AmbientLight {
pub color: Color,
}
impl Default for AmbientLight {
fn default() -> Self {
Self {
color: Color::rgb(0.05, 0.05, 0.05),
}
}
}

View file

@ -19,6 +19,7 @@ layout(set = 0, binding = 0) uniform Camera {
}; };
layout(set = 1, binding = 0) uniform Lights { layout(set = 1, binding = 0) uniform Lights {
vec3 AmbientColor;
uvec4 NumLights; uvec4 NumLights;
Light SceneLights[MAX_LIGHTS]; Light SceneLights[MAX_LIGHTS];
}; };
@ -42,9 +43,8 @@ void main() {
# ifdef STANDARDMATERIAL_SHADED # ifdef STANDARDMATERIAL_SHADED
vec3 normal = normalize(v_Normal); vec3 normal = normalize(v_Normal);
vec3 ambient = vec3(0.05, 0.05, 0.05);
// accumulate color // accumulate color
vec3 color = ambient; vec3 color = AmbientColor;
for (int i=0; i<int(NumLights.x) && i<MAX_LIGHTS; ++i) { for (int i=0; i<int(NumLights.x) && i<MAX_LIGHTS; ++i) {
Light light = SceneLights[i]; Light light = SceneLights[i];
// compute Lambertian diffuse term // compute Lambertian diffuse term

View file

@ -1,5 +1,5 @@
use crate::{ use crate::{
light::{Light, LightRaw}, light::{AmbientLight, Light, LightRaw},
render_graph::uniform, render_graph::uniform,
}; };
use bevy_core::{AsBytes, Byteable}; use bevy_core::{AsBytes, Byteable};
@ -78,6 +78,7 @@ pub struct LightsNodeSystemState {
pub fn lights_node_system( pub fn lights_node_system(
mut state: Local<LightsNodeSystemState>, mut state: Local<LightsNodeSystemState>,
render_resource_context: Res<Box<dyn RenderResourceContext>>, render_resource_context: Res<Box<dyn RenderResourceContext>>,
ambient_light_resource: Res<AmbientLight>,
// TODO: this write on RenderResourceBindings will prevent this system from running in parallel with other systems that do the same // TODO: this write on RenderResourceBindings will prevent this system from running in parallel with other systems that do the same
mut render_resource_bindings: ResMut<RenderResourceBindings>, mut render_resource_bindings: ResMut<RenderResourceBindings>,
query: Query<(&Light, &GlobalTransform)>, query: Query<(&Light, &GlobalTransform)>,
@ -85,9 +86,11 @@ pub fn lights_node_system(
let state = &mut state; let state = &mut state;
let render_resource_context = &**render_resource_context; let render_resource_context = &**render_resource_context;
let ambient_light: [f32; 4] = ambient_light_resource.color.into();
let ambient_light_size = std::mem::size_of::<[f32; 4]>();
let light_count = query.iter().count(); let light_count = query.iter().count();
let size = std::mem::size_of::<LightRaw>(); let size = std::mem::size_of::<LightRaw>();
let light_count_size = std::mem::size_of::<LightCount>(); let light_count_size = ambient_light_size + std::mem::size_of::<LightCount>();
let light_array_size = size * light_count; let light_array_size = size * light_count;
let light_array_max_size = size * state.max_lights; let light_array_max_size = size * state.max_lights;
let current_light_uniform_size = light_count_size + light_array_size; let current_light_uniform_size = light_count_size + light_array_size;
@ -128,8 +131,12 @@ pub fn lights_node_system(
staging_buffer, staging_buffer,
0..current_light_uniform_size as u64, 0..current_light_uniform_size as u64,
&mut |data, _renderer| { &mut |data, _renderer| {
// ambient light
data[0..ambient_light_size].copy_from_slice(ambient_light.as_bytes());
// light count // light count
data[0..light_count_size].copy_from_slice([light_count as u32, 0, 0, 0].as_bytes()); data[ambient_light_size..light_count_size]
.copy_from_slice([light_count as u32, 0, 0, 0].as_bytes());
// light array // light array
for ((light, global_transform), slot) in query for ((light, global_transform), slot) in query