|
1 | 1 | enable wgpu_ray_query; |
2 | 2 |
|
3 | 3 | #import bevy_core_pipeline::tonemapping::tonemapping_luminance as luminance |
4 | | -#import bevy_pbr::pbr_functions::{calculate_tbn_mikktspace, calculate_F0} |
| 4 | +#import bevy_pbr::pbr_functions::calculate_F0_dielectric |
5 | 5 | #import bevy_pbr::utils::{rand_f, rand_vec2f} |
6 | | -#import bevy_render::maths::PI |
| 6 | +#import bevy_render::maths::{PI, orthonormalize} |
7 | 7 | #import bevy_render::view::View |
8 | | -#import bevy_solari::brdf::{evaluate_brdf, evaluate_and_sample_brdf, fresnel} |
| 8 | +#import bevy_solari::brdf::{evaluate_brdf, evaluate_and_sample_brdf, lobe_reflectances} |
9 | 9 | #import bevy_solari::sampling::{sample_random_light, random_emissive_light_pdf, ggx_vndf_pdf, power_heuristic} |
10 | 10 | #import bevy_solari::scene_bindings::{trace_ray, resolve_ray_hit_full, ResolvedRayHitFull, RAY_T_MIN, RAY_T_MAX, MIRROR_ROUGHNESS_THRESHOLD} |
11 | 11 |
|
@@ -96,23 +96,21 @@ fn pathtrace(@builtin(global_invocation_id) global_id: vec3<u32>) { |
96 | 96 | } |
97 | 97 |
|
98 | 98 | fn brdf_pdf(wo: vec3<f32>, wi: vec3<f32>, ray_hit: ResolvedRayHitFull) -> f32 { |
99 | | - let NdotV = max(dot(ray_hit.world_normal, wo), 0.0001); |
100 | | - let F0 = calculate_F0(ray_hit.material.base_color, ray_hit.material.metallic, vec3(ray_hit.material.reflectance)); |
101 | | - let df = 1.0 - luminance(fresnel(F0, NdotV)); |
102 | | - |
103 | | - let diffuse_weight = mix(df, 0.0, ray_hit.material.metallic); |
104 | | - let specular_weight = 1.0 - diffuse_weight; |
105 | | - |
106 | | - let TBN = calculate_tbn_mikktspace(ray_hit.world_normal, ray_hit.world_tangent); |
| 99 | + let TBN = orthonormalize(ray_hit.world_normal); |
107 | 100 | let T = TBN[0]; |
108 | 101 | let B = TBN[1]; |
109 | 102 | let N = TBN[2]; |
110 | 103 |
|
| 104 | + let NdotV = max(dot(N, wo), 0.0001); |
| 105 | + let F0_metal = ray_hit.material.base_color; |
| 106 | + let F0_dielectric = calculate_F0_dielectric(vec3(ray_hit.material.reflectance)); |
| 107 | + let rho = lobe_reflectances(F0_metal, F0_dielectric, ray_hit.material, NdotV); |
| 108 | + let specular_weight = luminance(rho.rho_spec) / luminance(rho.rho_spec + rho.rho_diff); |
| 109 | + |
111 | 110 | let wo_tangent = vec3(dot(wo, T), dot(wo, B), dot(wo, N)); |
112 | 111 | let wi_tangent = vec3(dot(wi, T), dot(wi, B), dot(wi, N)); |
113 | 112 |
|
114 | 113 | let diffuse_pdf = wi_tangent.z / PI; |
115 | 114 | let specular_pdf = ggx_vndf_pdf(wo_tangent, wi_tangent, ray_hit.material.roughness); |
116 | | - let pdf = (diffuse_weight * diffuse_pdf) + (specular_weight * specular_pdf); |
117 | | - return pdf; |
| 115 | + return specular_weight * specular_pdf + (1.0 - specular_weight) * diffuse_pdf; |
118 | 116 | } |
0 commit comments