[Bf-blender-cvs] [d611cf92335] master: Fix mixed BSDF + BSSRDF sampling bug in path tracing, after 095a01a73a35.
Brecht Van Lommel
noreply at git.blender.org
Fri Jan 26 19:40:30 CET 2018
Commit: d611cf9233583a04b9168850ddbf708236de44b3
Author: Brecht Van Lommel
Date: Fri Jan 26 18:31:36 2018 +0100
Branches: master
https://developer.blender.org/rBd611cf9233583a04b9168850ddbf708236de44b3
Fix mixed BSDF + BSSRDF sampling bug in path tracing, after 095a01a73a35.
Spotted by Ha Hyung-jin, thanks!
===================================================================
M intern/cycles/kernel/kernel_shader.h
===================================================================
diff --git a/intern/cycles/kernel/kernel_shader.h b/intern/cycles/kernel/kernel_shader.h
index 26d3fcf15b2..5f2f00c5ceb 100644
--- a/intern/cycles/kernel/kernel_shader.h
+++ b/intern/cycles/kernel/kernel_shader.h
@@ -611,6 +611,8 @@ void shader_bsdf_eval(KernelGlobals *kg,
ccl_device_inline const ShaderClosure *shader_bsdf_pick(ShaderData *sd,
float *randu)
{
+ /* Note the sampling here must match shader_bssrdf_pick,
+ * since we reuse the same random number. */
int sampled = 0;
if(sd->num_closure > 1) {
@@ -620,7 +622,7 @@ ccl_device_inline const ShaderClosure *shader_bsdf_pick(ShaderData *sd,
for(int i = 0; i < sd->num_closure; i++) {
const ShaderClosure *sc = &sd->closure[i];
- if(CLOSURE_IS_BSDF(sc->type)) {
+ if(CLOSURE_IS_BSDF_OR_BSSRDF(sc->type)) {
sum += sc->sample_weight;
}
}
@@ -631,7 +633,7 @@ ccl_device_inline const ShaderClosure *shader_bsdf_pick(ShaderData *sd,
for(int i = 0; i < sd->num_closure; i++) {
const ShaderClosure *sc = &sd->closure[i];
- if(CLOSURE_IS_BSDF(sc->type)) {
+ if(CLOSURE_IS_BSDF_OR_BSSRDF(sc->type)) {
float next_sum = partial_sum + sc->sample_weight;
if(r < next_sum) {
@@ -648,13 +650,16 @@ ccl_device_inline const ShaderClosure *shader_bsdf_pick(ShaderData *sd,
}
}
- return &sd->closure[sampled];
+ const ShaderClosure *sc = &sd->closure[sampled];
+ return CLOSURE_IS_BSDF(sc->type)? sc: NULL;
}
ccl_device_inline const ShaderClosure *shader_bssrdf_pick(ShaderData *sd,
ccl_addr_space float3 *throughput,
float *randu)
{
+ /* Note the sampling here must match shader_bsdf_pick,
+ * since we reuse the same random number. */
int sampled = 0;
if(sd->num_closure > 1) {
@@ -703,7 +708,8 @@ ccl_device_inline const ShaderClosure *shader_bssrdf_pick(ShaderData *sd,
}
}
- return &sd->closure[sampled];
+ const ShaderClosure *sc = &sd->closure[sampled];
+ return CLOSURE_IS_BSSRDF(sc->type)? sc: NULL;
}
ccl_device_inline int shader_bsdf_sample(KernelGlobals *kg,
More information about the Bf-blender-cvs
mailing list