Lighting 💡
Lighting in renderling
comes in a few flavors:
- Unlit - no lighting at all
- Analytical lights - specific lights created by the programmer
- directional
- point
- spot
- Image based lighting - lighting by 3d environment maps
Scene recap
We've already used the "unlit" method of turning off all lighting on the stage.
Let's do a quick recap of our scene, starting where we left off with the skybox example.
We created our context, and then our stage, and it's important to note that we
used .with_lighting(false)
on the stage, which tells the stage not to use any
lighting.
This is the "unlit" lighting method mentioned above.
Then we created a camera and loaded a GLTF file of a marble bust, then loaded an HDR image into a skybox, and then rendered:
use renderling::{
camera::Camera,
context::Context,
glam::Vec4,
glam::{Mat4, Vec3},
gltf::GltfDocument,
stage::Stage,
types::GpuOnlyArray,
};
let ctx = Context::headless(256, 256).await;
let stage: Stage = ctx
.new_stage()
.with_background_color(Vec4::new(0.25, 0.25, 0.25, 1.0))
.with_lighting(false);
let _camera: Camera = {
let aspect = 1.0;
let fovy = core::f32::consts::PI / 4.0;
let znear = 0.1;
let zfar = 10.0;
let projection = Mat4::perspective_rh(fovy, aspect, znear, zfar);
let eye = Vec3::new(0.5, 0.5, 0.8);
let target = Vec3::new(0.0, 0.3, 0.0);
let up = Vec3::Y;
let view = Mat4::look_at_rh(eye, target, up);
stage
.new_camera()
.with_projection_and_view(projection, view)
};
let model: GltfDocument<GpuOnlyArray> = stage
.load_gltf_document_from_path(workspace_dir().join("gltf/marble_bust_1k.glb"))
.unwrap()
.into_gpu_only();
println!("bounds: {:?}", model.bounding_volume());
let skybox = stage
.new_skybox_from_path(workspace_dir().join("img/hdr/helipad.hdr"))
.unwrap();
stage.use_skybox(&skybox);
let frame = ctx.get_next_frame().unwrap();
stage.render(&frame.view());
frame.present();
Now let's learn about analytical lights, and then image based lighting.