Search across packages, versions, files, declarations, and comments. Use multiple terms to narrow results (AND), and add @vertex, @fragment, or @compute to filter by shader stage.
1#define_import_path bevy_solari::brdf
3#import bevy_pbr::lighting::{F_AB, D_GGX, V_SmithGGXCorrelated, fresnel, specular_multiscatter}
4#import bevy_pbr::pbr_functions::{calculate_diffuse_color, calculate_F0}
5#import bevy_render::maths::PI
6#import bevy_solari::scene_bindings::ResolvedMaterial
8fn evaluate_brdf(
9 world_normal: vec3<f32>,
10 wo: vec3<f32>,
11 wi: vec3<f32>,
12 material: ResolvedMaterial,
13) -> vec3<f32> {
14 let diffuse_brdf = evaluate_diffuse_brdf(material.base_color, material.metallic);
15 let specular_brdf = evaluate_specular_brdf(
16 world_normal,
17 wo,
18 wi,
19 material.base_color,
20 material.metallic,
21 material.reflectance,
22 material.perceptual_roughness,
23 material.roughness,
24 );
25 return diffuse_brdf + specular_brdf;
28fn evaluate_diffuse_brdf(base_color: vec3<f32>, metallic: f32) -> vec3<f32> {
29 let diffuse_color = calculate_diffuse_color(base_color, metallic, 0.0, 0.0);
30 return diffuse_color / PI;
33fn evaluate_specular_brdf(
34 N: vec3<f32>,
35 V: vec3<f32>,
36 L: vec3<f32>,
37 base_color: vec3<f32>,
38 metallic: f32,
39 reflectance: vec3<f32>,
40 perceptual_roughness: f32,
41 roughness: f32,
42) -> vec3<f32> {
43 let H = normalize(L + V);
44 let NdotL = saturate(dot(N, L));
45 let NdotH = saturate(dot(N, H));
46 let LdotH = saturate(dot(L, H));
47 let NdotV = max(dot(N, V), 0.0001);
49 let F0 = calculate_F0(base_color, metallic, reflectance);
50 let F_ab = F_AB(perceptual_roughness, NdotV);
52 let D = D_GGX(roughness, NdotH);
53 let Vs = V_SmithGGXCorrelated(roughness, NdotV, NdotL);
54 let F = fresnel(F0, LdotH);
55 return specular_multiscatter(D, Vs, F, F0, F_ab, 1.0);
Contents