You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
A shader graph is composed of various combinations of <nodes> and <nodegraphs> elements which can be connected together via child <inputs> and <outputs>.
This document first provides some background on the composition and semantics for shader graphs and then discuss usage in some user scenarios.
Basic Components
A <node> is atomic and is not represented by other nodes. Each node has a unique name. A valid contains only alphanumeric characters and cannot
contain a path separator: /.
graph TD
node1
node2
node3
Loading
Both <nodegraph>'s and documents are categorized as a graph elements.
Nodegraphs can contain 0 or more nodes or nodegraphs and 0 or more direct child <input>s or <output>s.
Nodes within a nodegraph or document are considered to be within the "scope" of the graph element. Nodegraph inputs and outputs are in the same scope as direct child nodes.
Though a document is considered to be a graph element direct child <input>s and <output>s are not allowed. A document node graph where no data flows in or out. At this time, documents cannot contain or
reference other documents as children.
graph TD
subgraph document
my_node
my_nodegraph
end
Loading
<input>s and <output>s on <node>s or <nodegraph>s define what is connectable. There can be 0 or more inputs and 1 or more outputs on a node or nodegraph.
Having no outputs is "allowed" but these nodes /nodgraphs are generally of no use as there is no starting point / root for evaluation.
classDiagram
class node {
+string name
+float in1
+color3 in2
+color3 out1
+int out2
}
class nodegraph {
+string name
+float in1
+color3 in2
+color3 out1
+int out2
}
Loading
Connectivity
For subsequent diagrams the connections are shown with an
upstream element connected to a downstream element by an arrow.
The child element of the downstream element is shown if required to
avoid ambiguity.
Elements may be <input>s or <output>s depending on specification
rules.
Rules
Shader graphs are directed acyclic graphs.
A <node> or <nodegraph><output> may be connected one or more <input> on another node or nodegraph<input> within the same scope.
The act of adding or removing nodegraphinputs and outputs can be thought of as publishing the public interface for the graph.
A node should never have inputs / outputs added or removed which are not part of their definition -- in fact this will be tagged a node instance which has no matching definition if a validation check is performed.
Compound and Functional Nodegraphs and "Flattening" and "Publishing"
If node is implemented by a nodegraph, then the nodegraph is called a functional nodegraph. Otherwise it is called a compound nodegraph.
Thus a more complete definition of a shader graph is that:
It is composed of a series of connected nodes and compound nodegraphs.
One or more of these nodes may be implemented as functional graphs.
If the node instance is replaced with the functional graph implementation then the node essentially "becomes" a compound graph. This operation is called flattening a node instance.
If all nodes are taken out of the scope of their parent nodegraphs then all that is left is a series of connected nodes. This operation is is called flattening a nodegraph.
The reverse operation to add nodes to nodegraphs allows users to logically group nodes and/or publisih it's public interface.
If a new definition <nodedef> is created and the nodegraph becomes a functional graph then can be thought of as publishing a new definition.
if flattened would look something like this if the parent of the nodegraph was a document. The interface <input> and <output> elements are not present as this is disallowed within the document scope.
The reverse process could create a nodegraph, with inputs and outputs added to create the public interface for the nodegraph.
Shader Generation Graphs
When dealing with shader generation shader graphs are simplified to having only nodes with inputs and outputs "ports".
The key components are:
Shader Node: Basically corresponds to a node.
Shader Port: A connectable attribute of a Shader Node. Can either be Input or Output Ports.
Public Ports: Are bindable as shader code inputs or exposed as the root for evaluation as an output.
Private Ports: Inputs and Outputs which are not exposed.
All original nodes are flattened to remove the notion of a graph hierarchy
and replace any nodes which are represented as functional graphs.
Upstream Traversal
Upstream traversal is fairly simple where the root to start from should be an <output> on a node or nodegraph. Traversal will naturally only follow direct connections.
This is straightforward when:
There are no nodegraphs within the shader graph.
Or all of the nodes reside within a single nodegraph.
In this case only node inputs connect to upstream outputs.
Examples
Interior of nodegraph to upstream nodegraphs and nodes
Logically a both a Document and a NodeGraph are considered to be containers of nodes or a "node graph".
However a Node which may have an implementation as a graph is not considered to be a container. This means
traversal up and downstream from a given node requires special casing.
Another issue is that in order to keep a minimal size, only those inputs and which are explicit connected to or
assigned non-default values will exist on the instance of a Node or Nodegraph, even though they are part of the
interface definition.
Any connections which within Nodegraphs which connect interior Node inputs to Nodegraph inputs also currently have
special syntax.
All connections are specified on a downstream input instead of as a structure which provides both the input and output. This makes downstream traversal much less straightforward to perform than upstream.
Materials as of 1.38 are nodes and traversal can find upstream shaders to allow a full material graph to be traversed.
Recommendations
In order to create a "complete" graph, when instances are created all inputs and outputs should be instantiated. This can be done via utilities which scan the associated NodeDef (definition) and add inputs and outputs with default values.
An NodeGraph itself should have all of it's inputs specified even if it's a functional graph for the same reason.
The text was updated successfully, but these errors were encountered:
MaterialX Graph Handling
Introduction
A
shader graph
is composed of various combinations of<nodes>
and<nodegraphs>
elements which can be connected together via child<inputs>
and<outputs>
.This document first provides some background on the composition and semantics for shader graphs and then discuss usage in some user scenarios.
Basic Components
<node>
is atomic and is not represented by other nodes. Each node has a unique name. A valid contains only alphanumeric characters and cannotcontain a path separator:
/
.<nodegraph>
's and documents are categorized as a graph elements.<input>
s or<output>
s.<input>
s and<output>
s are not allowed. A document node graph where no data flows in or out. At this time, documents cannot contain orreference other documents as children.
<input>
s and<output>
s on<node>
s or<nodegraph>
s define what is connectable. There can be 0 or more inputs and 1 or more outputs on a node or nodegraph.Connectivity
upstream element connected to a downstream element by an arrow.
avoid ambiguity.
<input>
s or<output>
s depending on specificationrules.
Rules
<node>
or<nodegraph>
<output>
may be connected one or more<input>
on another node ornodegraph
<input>
within the same scope.<nodegraph>
<input>
may be connected to one or more interior node's<input>
within the same scope.<output>
s may be connected to one or more nodegraph outputs within the same scope.Interface Building / Publishing Interfaces
The act of adding or removing
nodegraph
input
s andoutput
s can be thought of as publishing the public interface for the graph.A
node
should never have inputs / outputs added or removed which are not part of their definition -- in fact this will be tagged a node instance which has no matching definition if a validation check is performed.Compound and Functional Nodegraphs and "Flattening" and "Publishing"
If node is implemented by a nodegraph, then the nodegraph is called a functional nodegraph. Otherwise it is called a compound nodegraph.
Thus a more complete definition of a shader graph is that:
If a new definition
<nodedef>
is created and the nodegraph becomes a functional graph then can be thought of as publishing a new definition.Flattening Example
if flattened would look something like this if the parent of the nodegraph was a document. The interface
<input>
and<output>
elements are not present as this is disallowed within the document scope.The reverse process could create a nodegraph, with inputs and outputs added to create the public interface for the nodegraph.
Shader Generation Graphs
When dealing with shader generation shader graphs are simplified to having only nodes with inputs and outputs "ports".
The key components are:
All original nodes are flattened to remove the notion of a graph hierarchy
and replace any nodes which are represented as functional graphs.
Upstream Traversal
Upstream traversal is fairly simple where the root to start from should be an
<output>
on a node or nodegraph. Traversal will naturally only follow direct connections.This is straightforward when:
In this case only node inputs connect to upstream outputs.
Examples
Interior of nodegraph to upstream nodegraphs and nodes
Cascading nodegraph to nodegraph
Sample AMD material
Workflows
traversal up and downstream from a given node requires special casing.
assigned non-default values will exist on the instance of a Node or Nodegraph, even though they are part of the
interface definition.
special syntax.
Recommendations
The text was updated successfully, but these errors were encountered: