Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--intern/cycles/render/graph.cpp16
-rw-r--r--intern/cycles/render/graph.h2
-rw-r--r--intern/cycles/render/nodes.cpp36
-rw-r--r--intern/cycles/render/nodes.h6
4 files changed, 59 insertions, 1 deletions
diff --git a/intern/cycles/render/graph.cpp b/intern/cycles/render/graph.cpp
index a342eaed373..6a9b7244ced 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 8169e606f1a..fa2de3703c0 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 7ac872b8416..d8d88b4851e 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 39709c26398..2b205c44d42 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;
};