From dc57ea2ba8c344fefe5dd11d130c31c04ec729f3 Mon Sep 17 00:00:00 2001 From: JMS55 <47158642+JMS55@users.noreply.github.com> Date: Fri, 19 Jun 2026 17:59:38 -0400 Subject: [PATCH] Solari: Misc BRDF changes --- crates/bevy_solari/src/scene/brdf.wgsl | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/crates/bevy_solari/src/scene/brdf.wgsl b/crates/bevy_solari/src/scene/brdf.wgsl index cc347d0021ac1..f836d362ada2c 100644 --- a/crates/bevy_solari/src/scene/brdf.wgsl +++ b/crates/bevy_solari/src/scene/brdf.wgsl @@ -14,6 +14,7 @@ struct EvaluateAndSampleBrdfResult { wi: vec3, throughput: vec3, pdf: f32, + diffuse_selected: bool, } struct LobeReflectances { @@ -40,7 +41,7 @@ fn evaluate_and_sample_brdf( rng: ptr, ) -> EvaluateAndSampleBrdfResult { let NdotV = dot(world_normal, wo); - if NdotV < 0.0001 { return EvaluateAndSampleBrdfResult(vec3(0.0), vec3(0.0), 0.0); } + if NdotV < 0.0001 { return EvaluateAndSampleBrdfResult(vec3(0.0), vec3(0.0), 0.0, false); } let F0_metal = material.base_color; let F0_dielectric = calculate_F0_dielectric(vec3(material.reflectance)); let rho = lobe_reflectances(F0_metal, F0_dielectric, material, F_ab); @@ -63,7 +64,7 @@ fn evaluate_and_sample_brdf( } else { wi_tangent = sample_ggx_vndf(wo_tangent, material.roughness, rng); if ggx_vndf_sample_invalid(wi_tangent) { - return EvaluateAndSampleBrdfResult(vec3(0.0), vec3(0.0), 0.0); + return EvaluateAndSampleBrdfResult(vec3(0.0), vec3(0.0), 0.0, false); } wi = wi_tangent.x * T + wi_tangent.y * B + wi_tangent.z * N; @@ -72,7 +73,8 @@ fn evaluate_and_sample_brdf( return EvaluateAndSampleBrdfResult( wi, evaluate_specular_brdf(wo, wi, world_normal, material, F_ab) / specular_weight, - bitcast(0x7F800000u) // INF + bitcast(0x7F800000u), // INF + false, ); } } @@ -81,7 +83,7 @@ fn evaluate_and_sample_brdf( let specular_pdf = ggx_vndf_pdf(wo_tangent, wi_tangent, material.roughness); let pdf = (diffuse_weight * diffuse_pdf) + (specular_weight * specular_pdf); let throughput = evaluate_brdf(wo, wi, world_normal, material, F_ab) / pdf; - return EvaluateAndSampleBrdfResult(wi, throughput, pdf); + return EvaluateAndSampleBrdfResult(wi, throughput, pdf, diffuse_selected); } fn evaluate_brdf( @@ -91,7 +93,7 @@ fn evaluate_brdf( material: ResolvedMaterial, F_ab: vec2, ) -> vec3 { - return evaluate_diffuse_brdf(wo, wi, world_normal, material, F_ab) + evaluate_specular_brdf(wo, wi, world_normal, material, F_ab); + return max(evaluate_diffuse_brdf(wo, wi, world_normal, material, F_ab) + evaluate_specular_brdf(wo, wi, world_normal, material, F_ab), vec3(0.0)); } fn evaluate_diffuse_brdf(wo: vec3, wi: vec3, world_normal: vec3, material: ResolvedMaterial, F_ab: vec2) -> vec3 {