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/background.cpp | |
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/background.cpp')
-rw-r--r-- | intern/cycles/render/background.cpp | 27 |
1 files changed, 17 insertions, 10 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; } |