diff options
author | Thomas Dinges <blender@dingto.org> | 2015-01-21 22:06:53 +0300 |
---|---|---|
committer | Thomas Dinges <blender@dingto.org> | 2015-01-21 22:16:18 +0300 |
commit | cd723967970e3330d5461eaf8a062d6321de5d4f (patch) | |
tree | 4e72e360bfe3fed6d04296628e0d0dc92e32cccd /intern/cycles/render | |
parent | 7165db53f2663b78749019ff791816c36e6182e6 (diff) |
Cycles: Optimization for black world backgrounds
* If a Background node is set to a black color or zero strength,
it now gets removed from the shader graph.
* In case the graph is empty (no background node), the kernel will skip
evaluating it and save some rendertime. This can help quite a bit in scenes,
where the majority of the image consists of a black background.
Example: http://www.pasteall.org/pic/show.php?id=82650
In this case the render is ~16% faster.
Differential Revision: https://developer.blender.org/D972
Diffstat (limited to 'intern/cycles/render')
-rw-r--r-- | intern/cycles/render/background.cpp | 27 | ||||
-rw-r--r-- | intern/cycles/render/graph.cpp | 22 | ||||
-rw-r--r-- | intern/cycles/render/graph.h | 3 | ||||
-rw-r--r-- | intern/cycles/render/nodes.cpp | 2 |
4 files changed, 43 insertions, 11 deletions
diff --git a/intern/cycles/render/background.cpp b/intern/cycles/render/background.cpp index d731b3346fe..f5e51f2e159 100644 --- a/intern/cycles/render/background.cpp +++ b/intern/cycles/render/background.cpp @@ -72,16 +72,23 @@ void Background::device_update(Device *device, DeviceScene *dscene, Scene *scene else kbackground->volume_shader = SHADER_NONE; - if(!(visibility & PATH_RAY_DIFFUSE)) - kbackground->surface_shader |= SHADER_EXCLUDE_DIFFUSE; - if(!(visibility & PATH_RAY_GLOSSY)) - kbackground->surface_shader |= SHADER_EXCLUDE_GLOSSY; - if(!(visibility & PATH_RAY_TRANSMIT)) - kbackground->surface_shader |= SHADER_EXCLUDE_TRANSMIT; - if(!(visibility & PATH_RAY_VOLUME_SCATTER)) - kbackground->surface_shader |= SHADER_EXCLUDE_SCATTER; - if(!(visibility & PATH_RAY_CAMERA)) - kbackground->surface_shader |= SHADER_EXCLUDE_CAMERA; + /* No background node, make world shader invisible to all rays, to skip evaluation in kernel. */ + if(scene->shaders[shader]->graph->nodes.size() <= 1) { + kbackground->surface_shader |= SHADER_EXCLUDE_ANY; + } + /* Background present, check visibilities */ + else { + if(!(visibility & PATH_RAY_DIFFUSE)) + kbackground->surface_shader |= SHADER_EXCLUDE_DIFFUSE; + if(!(visibility & PATH_RAY_GLOSSY)) + kbackground->surface_shader |= SHADER_EXCLUDE_GLOSSY; + if(!(visibility & PATH_RAY_TRANSMIT)) + kbackground->surface_shader |= SHADER_EXCLUDE_TRANSMIT; + if(!(visibility & PATH_RAY_VOLUME_SCATTER)) + kbackground->surface_shader |= SHADER_EXCLUDE_SCATTER; + if(!(visibility & PATH_RAY_CAMERA)) + kbackground->surface_shader |= SHADER_EXCLUDE_CAMERA; + } need_update = false; } diff --git a/intern/cycles/render/graph.cpp b/intern/cycles/render/graph.cpp index 8f8a69373da..84fe55b69dd 100644 --- a/intern/cycles/render/graph.cpp +++ b/intern/cycles/render/graph.cpp @@ -374,6 +374,28 @@ void ShaderGraph::remove_unneeded_nodes() removed[proxy->id] = true; any_node_removed = true; } + else if(node->special_type == SHADER_SPECIAL_TYPE_BACKGROUND) { + BackgroundNode *bg = static_cast<BackgroundNode*>(node); + + if(bg->outputs[0]->links.size()) { + /* Black color or zero strength, remove node */ + if((!bg->inputs[0]->link && bg->inputs[0]->value == make_float3(0.0f, 0.0f, 0.0f)) || + (!bg->inputs[1]->link && bg->inputs[1]->value.x == 0.0f)) { + vector<ShaderInput*> inputs = bg->outputs[0]->links; + + foreach(ShaderInput *sock, bg->inputs) { + if(sock->link) + disconnect(sock); + } + + foreach(ShaderInput *input, inputs) + disconnect(input); + + removed[bg->id] = true; + any_node_removed = true; + } + } + } else if(node->special_type == SHADER_SPECIAL_TYPE_MIX_CLOSURE) { MixClosureNode *mix = static_cast<MixClosureNode*>(node); diff --git a/intern/cycles/render/graph.h b/intern/cycles/render/graph.h index 9130f7f04a0..f9ac16787e6 100644 --- a/intern/cycles/render/graph.h +++ b/intern/cycles/render/graph.h @@ -79,7 +79,8 @@ enum ShaderNodeSpecialType { SHADER_SPECIAL_TYPE_MIX_RGB, /* Only Mix subtype */ SHADER_SPECIAL_TYPE_AUTOCONVERT, SHADER_SPECIAL_TYPE_GEOMETRY, - SHADER_SPECIAL_TYPE_SCRIPT + SHADER_SPECIAL_TYPE_SCRIPT, + SHADER_SPECIAL_TYPE_BACKGROUND, }; /* Enum diff --git a/intern/cycles/render/nodes.cpp b/intern/cycles/render/nodes.cpp index 625b829ba24..653bd5dd19c 100644 --- a/intern/cycles/render/nodes.cpp +++ b/intern/cycles/render/nodes.cpp @@ -1946,6 +1946,8 @@ void EmissionNode::compile(OSLCompiler& compiler) BackgroundNode::BackgroundNode() : ShaderNode("background") { + special_type = SHADER_SPECIAL_TYPE_BACKGROUND; + add_input("Color", SHADER_SOCKET_COLOR, make_float3(0.8f, 0.8f, 0.8f)); add_input("Strength", SHADER_SOCKET_FLOAT, 1.0f); add_input("SurfaceMixWeight", SHADER_SOCKET_FLOAT, 0.0f, ShaderInput::USE_SVM); |