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
This commit is contained in:
@@ -72,16 +72,23 @@ void Background::device_update(Device *device, DeviceScene *dscene, Scene *scene
|
|||||||
else
|
else
|
||||||
kbackground->volume_shader = SHADER_NONE;
|
kbackground->volume_shader = SHADER_NONE;
|
||||||
|
|
||||||
if(!(visibility & PATH_RAY_DIFFUSE))
|
/* No background node, make world shader invisible to all rays, to skip evaluation in kernel. */
|
||||||
kbackground->surface_shader |= SHADER_EXCLUDE_DIFFUSE;
|
if(scene->shaders[shader]->graph->nodes.size() <= 1) {
|
||||||
if(!(visibility & PATH_RAY_GLOSSY))
|
kbackground->surface_shader |= SHADER_EXCLUDE_ANY;
|
||||||
kbackground->surface_shader |= SHADER_EXCLUDE_GLOSSY;
|
}
|
||||||
if(!(visibility & PATH_RAY_TRANSMIT))
|
/* Background present, check visibilities */
|
||||||
kbackground->surface_shader |= SHADER_EXCLUDE_TRANSMIT;
|
else {
|
||||||
if(!(visibility & PATH_RAY_VOLUME_SCATTER))
|
if(!(visibility & PATH_RAY_DIFFUSE))
|
||||||
kbackground->surface_shader |= SHADER_EXCLUDE_SCATTER;
|
kbackground->surface_shader |= SHADER_EXCLUDE_DIFFUSE;
|
||||||
if(!(visibility & PATH_RAY_CAMERA))
|
if(!(visibility & PATH_RAY_GLOSSY))
|
||||||
kbackground->surface_shader |= SHADER_EXCLUDE_CAMERA;
|
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;
|
need_update = false;
|
||||||
}
|
}
|
||||||
|
@@ -374,6 +374,28 @@ void ShaderGraph::remove_unneeded_nodes()
|
|||||||
removed[proxy->id] = true;
|
removed[proxy->id] = true;
|
||||||
any_node_removed = 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) {
|
else if(node->special_type == SHADER_SPECIAL_TYPE_MIX_CLOSURE) {
|
||||||
MixClosureNode *mix = static_cast<MixClosureNode*>(node);
|
MixClosureNode *mix = static_cast<MixClosureNode*>(node);
|
||||||
|
|
||||||
|
@@ -79,7 +79,8 @@ enum ShaderNodeSpecialType {
|
|||||||
SHADER_SPECIAL_TYPE_MIX_RGB, /* Only Mix subtype */
|
SHADER_SPECIAL_TYPE_MIX_RGB, /* Only Mix subtype */
|
||||||
SHADER_SPECIAL_TYPE_AUTOCONVERT,
|
SHADER_SPECIAL_TYPE_AUTOCONVERT,
|
||||||
SHADER_SPECIAL_TYPE_GEOMETRY,
|
SHADER_SPECIAL_TYPE_GEOMETRY,
|
||||||
SHADER_SPECIAL_TYPE_SCRIPT
|
SHADER_SPECIAL_TYPE_SCRIPT,
|
||||||
|
SHADER_SPECIAL_TYPE_BACKGROUND,
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Enum
|
/* Enum
|
||||||
|
@@ -1946,6 +1946,8 @@ void EmissionNode::compile(OSLCompiler& compiler)
|
|||||||
BackgroundNode::BackgroundNode()
|
BackgroundNode::BackgroundNode()
|
||||||
: ShaderNode("background")
|
: ShaderNode("background")
|
||||||
{
|
{
|
||||||
|
special_type = SHADER_SPECIAL_TYPE_BACKGROUND;
|
||||||
|
|
||||||
add_input("Color", SHADER_SOCKET_COLOR, make_float3(0.8f, 0.8f, 0.8f));
|
add_input("Color", SHADER_SOCKET_COLOR, make_float3(0.8f, 0.8f, 0.8f));
|
||||||
add_input("Strength", SHADER_SOCKET_FLOAT, 1.0f);
|
add_input("Strength", SHADER_SOCKET_FLOAT, 1.0f);
|
||||||
add_input("SurfaceMixWeight", SHADER_SOCKET_FLOAT, 0.0f, ShaderInput::USE_SVM);
|
add_input("SurfaceMixWeight", SHADER_SOCKET_FLOAT, 0.0f, ShaderInput::USE_SVM);
|
||||||
|
Reference in New Issue
Block a user