Skip to content

Commit 0a0f302

Browse files
committed
feat: update pathtracer
1 parent f1f1af1 commit 0a0f302

1 file changed

Lines changed: 11 additions & 13 deletions

File tree

crates/bevy_solari/src/pathtracer/pathtracer.wgsl

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
enable wgpu_ray_query;
22

33
#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
55
#import bevy_pbr::utils::{rand_f, rand_vec2f}
6-
#import bevy_render::maths::PI
6+
#import bevy_render::maths::{PI, orthonormalize}
77
#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}
99
#import bevy_solari::sampling::{sample_random_light, random_emissive_light_pdf, ggx_vndf_pdf, power_heuristic}
1010
#import bevy_solari::scene_bindings::{trace_ray, resolve_ray_hit_full, ResolvedRayHitFull, RAY_T_MIN, RAY_T_MAX, MIRROR_ROUGHNESS_THRESHOLD}
1111

@@ -96,23 +96,21 @@ fn pathtrace(@builtin(global_invocation_id) global_id: vec3<u32>) {
9696
}
9797

9898
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);
107100
let T = TBN[0];
108101
let B = TBN[1];
109102
let N = TBN[2];
110103

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+
111110
let wo_tangent = vec3(dot(wo, T), dot(wo, B), dot(wo, N));
112111
let wi_tangent = vec3(dot(wi, T), dot(wi, B), dot(wi, N));
113112

114113
let diffuse_pdf = wi_tangent.z / PI;
115114
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;
118116
}

0 commit comments

Comments
 (0)