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}