Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/intern
diff options
context:
space:
mode:
authorBrecht Van Lommel <brechtvanlommel@gmail.com>2017-12-26 01:43:55 +0300
committerBrecht Van Lommel <brechtvanlommel@gmail.com>2017-12-26 01:59:20 +0300
commit948515c21a6ee6253eebb2359a95182e21696a84 (patch)
treed9cb0b2a8c4d80570c9116b00afc544fe68f0286 /intern
parente8e92dffed05f86ffea2f378e115285a105d6fd4 (diff)
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.
Diffstat (limited to 'intern')
-rw-r--r--intern/cycles/kernel/svm/svm.h8
-rw-r--r--intern/cycles/kernel/svm/svm_closure.h22
2 files changed, 21 insertions, 9 deletions
diff --git a/intern/cycles/kernel/svm/svm.h b/intern/cycles/kernel/svm/svm.h
index 9ff02c1586b..d3dac5706d0 100644
--- a/intern/cycles/kernel/svm/svm.h
+++ b/intern/cycles/kernel/svm/svm.h
@@ -211,9 +211,7 @@ ccl_device_noinline void svm_eval_nodes(KernelGlobals *kg, ShaderData *sd, ccl_a
break;
}
case NODE_CLOSURE_BSDF:
- if(type == SHADER_TYPE_SURFACE) {
- svm_node_closure_bsdf(kg, sd, stack, node, path_flag, &offset);
- }
+ svm_node_closure_bsdf(kg, sd, stack, node, type, path_flag, &offset);
break;
case NODE_CLOSURE_EMISSION:
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;
# if NODES_FEATURE(NODE_FEATURE_VOLUME)
case NODE_CLOSURE_VOLUME:
- if(type == SHADER_TYPE_VOLUME) {
- svm_node_closure_volume(kg, sd, stack, node, path_flag);
- }
+ svm_node_closure_volume(kg, sd, stack, node, type, path_flag);
break;
# endif /* NODES_FEATURE(NODE_FEATURE_VOLUME) */
# ifdef __EXTRA_NODES__
diff --git a/intern/cycles/kernel/svm/svm_closure.h b/intern/cycles/kernel/svm/svm_closure.h
index f04c46ef7f9..4547894665e 100644
--- a/intern/cycles/kernel/svm/svm_closure.h
+++ b/intern/cycles/kernel/svm/svm_closure.h
@@ -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;
@@ -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 */
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;
+ }
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__
+ /* 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 mix_weight_offset;