renderling/pbr/brdf/
shader.rs

1//! Shader side of BRDF stuff.
2
3use glam::{Vec2, Vec3, Vec4Swizzles};
4
5use crate::math::{IsSampler, IsVector, Sample2d};
6
7pub fn sample_brdf<T: Sample2d<Sampler = S>, S: IsSampler>(
8    brdf: &T,
9    brdf_sampler: &S,
10    // camera position in world space
11    camera_pos: Vec3,
12    // fragment position in world space
13    in_pos: Vec3,
14    // normal vector
15    n: Vec3,
16    roughness: f32,
17) -> Vec2 {
18    let v = (camera_pos - in_pos).alt_norm_or_zero();
19    brdf.sample_by_lod(*brdf_sampler, Vec2::new(n.dot(v).max(0.0), roughness), 0.0)
20        .xy()
21}