[Bf-blender-cvs] [0639ba8] master: Cycles / Shader graph: Fallback to Sharp closures for very small roughness.

Thomas Dinges noreply at git.blender.org
Wed Nov 18 18:54:34 CET 2015


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;
 };




More information about the Bf-blender-cvs mailing list