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
diff options
context:
space:
mode:
authorLukas Stockner <lukas.stockner@freenet.de>2017-05-19 05:59:35 +0300
committerLukas Stockner <lukas.stockner@freenet.de>2017-05-19 05:59:35 +0300
commit4a04d7ae8930502037cd23dc94ed1bc9bc0043ac (patch)
treeb2637d15e995424cf6f5e0413144faee4cfb31de /intern/cycles/render/shader.cpp
parentcf1127f3801f9809f385ad62f4388220f278a604 (diff)
Fix T51553: Cycles Volume Emission turns black when strength is 0 or color is black
The problem was that Cycles implicitly uses a transparent surface shader when only volume nodes are used, but since the black emission shader gets optimized away, it was no longer detected and therefore no transparent surface was used. Therefore, the shader now stores whether volume nodes were connected before optimizing.
Diffstat (limited to 'intern/cycles/render/shader.cpp')
-rw-r--r--intern/cycles/render/shader.cpp11
1 files changed, 7 insertions, 4 deletions
diff --git a/intern/cycles/render/shader.cpp b/intern/cycles/render/shader.cpp
index ef89288f167..a64f227a38c 100644
--- a/intern/cycles/render/shader.cpp
+++ b/intern/cycles/render/shader.cpp
@@ -241,6 +241,10 @@ void Shader::set_graph(ShaderGraph *graph_)
delete graph_bump;
graph = graph_;
graph_bump = NULL;
+
+ /* Store info here before graph optimization to make sure that
+ * nodes that get optimized away still count. */
+ has_volume_connected = (graph->output()->input("Volume")->link != NULL);
}
void Shader::tag_update(Scene *scene)
@@ -432,15 +436,14 @@ void ShaderManager::device_update_common(Device *device,
flag |= SD_HAS_VOLUME;
has_volumes = true;
- /* in this case we can assume transparent surface */
- if(!shader->has_surface)
- flag |= SD_HAS_ONLY_VOLUME;
-
/* todo: this could check more fine grained, to skip useless volumes
* enclosed inside an opaque bsdf.
*/
flag |= SD_HAS_TRANSPARENT_SHADOW;
}
+ /* in this case we can assume transparent surface */
+ if(shader->has_volume_connected && !shader->has_surface)
+ flag |= SD_HAS_ONLY_VOLUME;
if(shader->heterogeneous_volume && shader->has_volume_spatial_varying)
flag |= SD_HETEROGENEOUS_VOLUME;
if(shader->has_bssrdf_bump)