Fix T53600: Cycles shader mixing issue with principled BSDF and zero weights.

SVM nodes need to read all data to get the right offset for the following node.
This is quite weak, a more generic solution would be good in the future.
This commit is contained in:
Brecht Van Lommel
2017-12-25 23:43:55 +01:00
parent e8e92dffed
commit 948515c21a
2 changed files with 21 additions and 9 deletions

View File

@@ -211,9 +211,7 @@ ccl_device_noinline void svm_eval_nodes(KernelGlobals *kg, ShaderData *sd, ccl_a
break; break;
} }
case NODE_CLOSURE_BSDF: case NODE_CLOSURE_BSDF:
if(type == SHADER_TYPE_SURFACE) { svm_node_closure_bsdf(kg, sd, stack, node, type, path_flag, &offset);
svm_node_closure_bsdf(kg, sd, stack, node, path_flag, &offset);
}
break; break;
case NODE_CLOSURE_EMISSION: case NODE_CLOSURE_EMISSION:
svm_node_closure_emission(sd, stack, node); svm_node_closure_emission(sd, stack, node);
@@ -331,9 +329,7 @@ ccl_device_noinline void svm_eval_nodes(KernelGlobals *kg, ShaderData *sd, ccl_a
break; break;
# if NODES_FEATURE(NODE_FEATURE_VOLUME) # if NODES_FEATURE(NODE_FEATURE_VOLUME)
case NODE_CLOSURE_VOLUME: case NODE_CLOSURE_VOLUME:
if(type == SHADER_TYPE_VOLUME) { svm_node_closure_volume(kg, sd, stack, node, type, path_flag);
svm_node_closure_volume(kg, sd, stack, node, path_flag);
}
break; break;
# endif /* NODES_FEATURE(NODE_FEATURE_VOLUME) */ # endif /* NODES_FEATURE(NODE_FEATURE_VOLUME) */
# ifdef __EXTRA_NODES__ # ifdef __EXTRA_NODES__

View File

@@ -56,7 +56,7 @@ ccl_device void svm_node_glass_setup(ShaderData *sd, MicrofacetBsdf *bsdf, int t
} }
} }
ccl_device void svm_node_closure_bsdf(KernelGlobals *kg, ShaderData *sd, float *stack, uint4 node, int path_flag, int *offset) ccl_device void svm_node_closure_bsdf(KernelGlobals *kg, ShaderData *sd, float *stack, uint4 node, ShaderType shader_type, int path_flag, int *offset)
{ {
uint type, param1_offset, param2_offset; uint type, param1_offset, param2_offset;
@@ -67,8 +67,19 @@ ccl_device void svm_node_closure_bsdf(KernelGlobals *kg, ShaderData *sd, float *
/* note we read this extra node before weight check, so offset is added */ /* note we read this extra node before weight check, so offset is added */
uint4 data_node = read_node(kg, offset); uint4 data_node = read_node(kg, offset);
if(mix_weight == 0.0f) /* Only compute BSDF for surfaces, transparent variable is shared with volume extinction. */
if(mix_weight == 0.0f || shader_type != SHADER_TYPE_SURFACE) {
if(type == CLOSURE_BSDF_PRINCIPLED_ID) {
/* Read all principled BSDF extra data to get the right offset. */
read_node(kg, offset);
read_node(kg, offset);
read_node(kg, offset);
read_node(kg, offset);
read_node(kg, offset);
}
return; return;
}
float3 N = stack_valid(data_node.x)? stack_load_float3(stack, data_node.x): sd->N; float3 N = stack_valid(data_node.x)? stack_load_float3(stack, data_node.x): sd->N;
@@ -835,9 +846,14 @@ ccl_device void svm_node_closure_bsdf(KernelGlobals *kg, ShaderData *sd, float *
} }
} }
ccl_device void svm_node_closure_volume(KernelGlobals *kg, ShaderData *sd, float *stack, uint4 node, int path_flag) ccl_device void svm_node_closure_volume(KernelGlobals *kg, ShaderData *sd, float *stack, uint4 node, ShaderType shader_type, int path_flag)
{ {
#ifdef __VOLUME__ #ifdef __VOLUME__
/* Only sum extinction for volumes, variable is shared with surface transparency. */
if(shader_type != SHADER_TYPE_VOLUME) {
return;
}
uint type, param1_offset, param2_offset; uint type, param1_offset, param2_offset;
uint mix_weight_offset; uint mix_weight_offset;