Commit: 0639ba8ea58bc775bfa3436e1ba9831ece78404d Author: Thomas Dinges Date: Wed Nov 18 18:47:56 2015 +0100 Branches: master https://developer.blender.org/rB0639ba8ea58bc775bfa3436e1ba9831ece78404d
Cycles / Shader graph: Fallback to Sharp closures for very small roughness. We fallback to Sharp closures for Glossy, Glass and Refraction nodes now, in case the Roughness input is disconnected and 0 (< 1e-4f to be exact). This way we gain a few percentages of performance, in case the user did not manually set the closure type to "Sharp" in the UI. Sharp will probably be removed from the UI as a followup, not needed anymore with this internal optimization. Original idea by Lukas Stockner(Differential Revision: https://developer.blender.org/D1439), code implementation by myself. =================================================================== M intern/cycles/render/graph.cpp M intern/cycles/render/graph.h M intern/cycles/render/nodes.cpp M intern/cycles/render/nodes.h =================================================================== diff --git a/intern/cycles/render/graph.cpp b/intern/cycles/render/graph.cpp index a342eae..6a9b724 100644 --- a/intern/cycles/render/graph.cpp +++ b/intern/cycles/render/graph.cpp @@ -354,7 +354,13 @@ void ShaderGraph::copy_nodes(set<ShaderNode*>& nodes, map<ShaderNode*, ShaderNod } } } +/* Graph simplification */ +/* ******************** */ +/* Step 1: Remove unused nodes. + * Remove nodes which are not needed in the graph, such as proxies, + * mix nodes with a factor of 0 or 1, emission shaders without contribution... + */ void ShaderGraph::remove_unneeded_nodes() { vector<bool> removed(num_node_ids, false); @@ -550,6 +556,14 @@ void ShaderGraph::remove_unneeded_nodes() } } +/* Step 3: Simplification.*/ +void ShaderGraph::simplify_nodes() +{ + foreach(ShaderNode *node, nodes) { + node->optimize(); + } +} + void ShaderGraph::break_cycles(ShaderNode *node, vector<bool>& visited, vector<bool>& on_stack) { visited[node->id] = true; @@ -590,7 +604,7 @@ void ShaderGraph::clean() /* TODO(dingto): Implement */ /* 3: Simplification. */ - /* TODO(dingto): Implement */ + simplify_nodes(); /* 4: De-duplication. */ /* TODO(dingto): Implement */ diff --git a/intern/cycles/render/graph.h b/intern/cycles/render/graph.h index 8169e60..fa2de37 100644 --- a/intern/cycles/render/graph.h +++ b/intern/cycles/render/graph.h @@ -196,6 +196,7 @@ public: virtual void attributes(Shader *shader, AttributeRequestSet *attributes); virtual void compile(SVMCompiler& compiler) = 0; virtual void compile(OSLCompiler& compiler) = 0; + virtual void optimize() {}; virtual bool has_surface_emission() { return false; } virtual bool has_surface_transparent() { return false; } @@ -275,6 +276,7 @@ public: void relink(vector<ShaderInput*> inputs, vector<ShaderInput*> outputs, ShaderOutput *output); void remove_unneeded_nodes(); + void simplify_nodes(); void finalize(bool do_bump = false, bool do_osl = false); int get_num_closures(); diff --git a/intern/cycles/render/nodes.cpp b/intern/cycles/render/nodes.cpp index 7ac872b..d8d88b4 100644 --- a/intern/cycles/render/nodes.cpp +++ b/intern/cycles/render/nodes.cpp @@ -1878,6 +1878,18 @@ GlossyBsdfNode::GlossyBsdfNode() add_input("Roughness", SHADER_SOCKET_FLOAT, 0.2f); } +void GlossyBsdfNode::optimize() +{ + /* Fallback to Sharp closure for Roughness close to 0. + * Note: Keep the epsilon in sync with kernel! + */ + ShaderInput *roughness_input = get_input("Roughness"); + if(!roughness_input->link && roughness_input->value.x <= 1e-4f) { + closure = CLOSURE_BSDF_REFLECTION_ID; + distribution = ustring("Sharp"); + } +} + void GlossyBsdfNode::compile(SVMCompiler& compiler) { closure = (ClosureType)distribution_enum[distribution]; @@ -1918,6 +1930,18 @@ GlassBsdfNode::GlassBsdfNode() add_input("IOR", SHADER_SOCKET_FLOAT, 0.3f); } +void GlassBsdfNode::optimize() +{ + /* Fallback to Sharp closure for Roughness close to 0. + * Note: Keep the epsilon in sync with kernel! + */ + ShaderInput *roughness_input = get_input("Roughness"); + if(!roughness_input->link && roughness_input->value.x <= 1e-4f) { + closure = CLOSURE_BSDF_SHARP_GLASS_ID; + distribution = ustring("Sharp"); + } +} + void GlassBsdfNode::compile(SVMCompiler& compiler) { closure = (ClosureType)distribution_enum[distribution]; @@ -1958,6 +1982,18 @@ RefractionBsdfNode::RefractionBsdfNode() add_input("IOR", SHADER_SOCKET_FLOAT, 0.3f); } +void RefractionBsdfNode::optimize() +{ + /* Fallback to Sharp closure for Roughness close to 0. + * Note: Keep the epsilon in sync with kernel! + */ + ShaderInput *roughness_input = get_input("Roughness"); + if(!roughness_input->link && roughness_input->value.x <= 1e-4f) { + closure = CLOSURE_BSDF_REFRACTION_ID; + distribution = ustring("Sharp"); + } +} + void RefractionBsdfNode::compile(SVMCompiler& compiler) { closure = (ClosureType)distribution_enum[distribution]; diff --git a/intern/cycles/render/nodes.h b/intern/cycles/render/nodes.h index 39709c2..2b205c4 100644 --- a/intern/cycles/render/nodes.h +++ b/intern/cycles/render/nodes.h @@ -310,6 +310,8 @@ class GlossyBsdfNode : public BsdfNode { public: SHADER_NODE_CLASS(GlossyBsdfNode) + void optimize(); + ustring distribution; static ShaderEnum distribution_enum; }; @@ -318,6 +320,8 @@ class GlassBsdfNode : public BsdfNode { public: SHADER_NODE_CLASS(GlassBsdfNode) + void optimize(); + ustring distribution; static ShaderEnum distribution_enum; }; @@ -326,6 +330,8 @@ class RefractionBsdfNode : public BsdfNode { public: SHADER_NODE_CLASS(RefractionBsdfNode) + void optimize(); + ustring distribution; static ShaderEnum distribution_enum; }; _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org http://lists.blender.org/mailman/listinfo/bf-blender-cvs