diff --git a/zenovis/xinxinoptix/DeflMatShader.cu b/zenovis/xinxinoptix/DeflMatShader.cu index 4facb47e4d..027e35d35d 100644 --- a/zenovis/xinxinoptix/DeflMatShader.cu +++ b/zenovis/xinxinoptix/DeflMatShader.cu @@ -1047,10 +1047,13 @@ extern "C" __global__ void __closesthit__radiance() return lbrdf; }; - auto taskAux = [&](const vec3& weight) { + float3 radianceNoShadow = make_float3(0,0,0); + auto taskAux = [&](const vec3& weight, const float3& radianceNoBlock) { prd->radiance_d = rd * weight; prd->radiance_s = rs * weight; prd->radiance_t = rt * weight; + + radianceNoShadow = radianceNoBlock; }; RadiancePRD shadow_prd {}; @@ -1059,8 +1062,8 @@ extern "C" __global__ void __closesthit__radiance() shadow_prd.nonThinTransHit = (mats.thin == false && mats.specTrans > 0) ? 1 : 0; prd->direction = normalize(wi); - float3 radianceNoShadow = make_float3(0,0,0); - DirectLighting(prd, shadow_prd, shadingP, ray_dir, evalBxDF, radianceNoShadow, &taskAux); + + DirectLighting(prd, shadow_prd, shadingP, ray_dir, evalBxDF, &taskAux); if(mats.shadowReceiver > 0.5f) { auto radiance = length(prd->radiance); diff --git a/zenovis/xinxinoptix/Light.h b/zenovis/xinxinoptix/Light.h index 976e96d4d1..0d9c1e8f36 100644 --- a/zenovis/xinxinoptix/Light.h +++ b/zenovis/xinxinoptix/Light.h @@ -204,7 +204,7 @@ namespace detail { template static __forceinline__ __device__ -void DirectLighting(RadiancePRD *prd, RadiancePRD& shadow_prd, const float3& shadingP, const float3& ray_dir, TypeEvalBxDF& evalBxDF, float3 &radianceNoShadow, TypeAux* taskAux=nullptr) { +void DirectLighting(RadiancePRD *prd, RadiancePRD& shadow_prd, const float3& shadingP, const float3& ray_dir, TypeEvalBxDF& evalBxDF, TypeAux* taskAux=nullptr) { const float3 wo = normalize(-ray_dir); float3 light_attenuation = vec3(1.0f); @@ -400,7 +400,6 @@ void DirectLighting(RadiancePRD *prd, RadiancePRD& shadow_prd, const float3& sha if (lsr.NoL > _FLT_EPL_ && lsr.PDF > _FLT_EPL_) { traceOcclusion(params.handle, shadingP, lsr.dir, 0, lsr.dist, &shadow_prd); - light_attenuation = shadow_prd.shadowAttanuation; //if (lengthSquared(light_attenuation) > 0.0f) { @@ -408,15 +407,23 @@ void DirectLighting(RadiancePRD *prd, RadiancePRD& shadow_prd, const float3& sha auto bxdf_value = evalBxDF(lsr.dir, wo, scatterPDF); auto misWeight = 1.0f; + if constexpr(_MIS_) { if (!light.isDeltaLight() && !lsr.isDelta) { misWeight = BRDFBasics::PowerHeuristic(lsr.PDF, scatterPDF); } + } emission *= lsr.intensity; - prd->radiance = light_attenuation * emission * bxdf_value; - prd->radiance *= misWeight / lsr.PDF; - radianceNoShadow = emission * bxdf_value * misWeight / lsr.PDF; + float3 radianceNoShadow = emission * bxdf_value; + radianceNoShadow *= misWeight / lsr.PDF; + + if constexpr (!detail::is_void::value) { + auto tmp = light_attenuation * misWeight / lsr.PDF; + (*taskAux)(tmp, radianceNoShadow); + }// TypeAux + + prd->radiance = radianceNoShadow * light_attenuation; // with shadow //} } @@ -461,7 +468,7 @@ void DirectLighting(RadiancePRD *prd, RadiancePRD& shadow_prd, const float3& sha auto inverseProb = 1.0f/_SKY_PROB_; auto bxdf_value = evalBxDF(sun_dir, wo, scatterPDF, illum); - vec3 tmp(1.0f); + float tmp = 1.0f; if constexpr(_MIS_) { float misWeight = BRDFBasics::PowerHeuristic(tmpPdf, scatterPDF); @@ -469,18 +476,18 @@ void DirectLighting(RadiancePRD *prd, RadiancePRD& shadow_prd, const float3& sha misWeight = scatterPDF>1e-5f?misWeight:0.0f; misWeight = tmpPdf>1e-5f?misWeight:0.0f; - tmp = (1.0f / NSamples) * misWeight * inverseProb * light_attenuation / tmpPdf; + tmp = (1.0f / NSamples) * misWeight * inverseProb / tmpPdf; } else { - tmp = (1.0f / NSamples) * inverseProb * light_attenuation / tmpPdf; + tmp = (1.0f / NSamples) * inverseProb / tmpPdf; } - prd->radiance += (float3)(tmp) * bxdf_value; - radianceNoShadow += (float3)(tmp) * bxdf_value; + float3 radianceNoShadow = tmp * bxdf_value; + if constexpr (!detail::is_void::value) { - if (taskAux != nullptr) { - (*taskAux)(tmp); - } + (*taskAux)(tmp * light_attenuation, radianceNoShadow); }// TypeAux + + prd->radiance += radianceNoShadow * light_attenuation; // with shadow } } }; \ No newline at end of file