Skip to content
Branch: master
Find file Copy path
Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
64 lines (38 sloc) 4.81 KB

Custom Function Node



Shader Graph allows you to easily author custom shaders in Unity. However, because our default Nodes can't cover everything you want to make, the package now comes with a Custom Function node in the Node Library.

The Custom Function node lets you inject your own custom HLSL code in Shader Graphs. You can either write small functions directly into graphs using the string mode, or reference external HLSL include files. You can also use the Custom Port Menu to define your own input and output ports on the node itself.

How to Use

Use the Create Node Menu to create Custom Function nodes. By default, new Custom Function nodes don't have any input or output ports.

Use the gear icon in the top right corner of the node to open the Custom Port Menu and Custom Function Menu.

02 03

Custom Function Menu

Menu Item Description
Inputs A Custom Port Menu that defines the input ports of the node.
Outputs A Custom Port Menu that defines the output ports of the node.
Type A drop-down menu where you set the type of function. Select File to reference an external file, or string to directly input functions to the node.
Name The name of the custom function in the final generated code.
Source An asset field to reference the external HLSL include file. Only available in File mode.
Body A text box where you enter HLSL code. Only available in String mode.

Defining the Function via String

If you select String mode, the graph generates the shader function. The Name field defines the name of the generated function, and the Body field defines the contents of the generated function. The arguments, braces, and indent scope are handled automatically. In String mode you may use the token $precision instead of half or float when filling out the Body field. This will be replaced by the correct type, based on that node's precision, when the node is processed.


The example above generates the following function:


Defining the Function via File

If you select File mode, the graph does not automatically generate the shader function. File mode injects an include reference in the final generated shader, and uses a function from within the referenced file. The Name field must match the name of the function you wish to call. The Source field contains a reference to the HLSL file that includes the function.


When you use File mode for the Custom Function node, you must manually format the functions properly. One thing to note when creating custom functions for Shader Graph is the precision suffixes. The generated code appends a precision suffix to function names. Your include file function must also append your desired precision suffix (shown below with _float), or contain multiple functions with both _float and _half suffixes, but your Name field must not include the precision suffix.


File mode allows for more flexbility with custom functions in a graph. You can define uniform variables outside of the function scope, as shown here with a matrix.


You can define multiple functions in the same file, and call them from your referenced function. Alternatively, you can reference the same file, but use different functions from different Custom Function nodes.


You can even include other files that contain other functions.


Reusing Custom Function Nodes

The Custom Function node, on its own, is a single node instance. If you wish to re-use the same custom functions without re-creating the inputs, outputs, and function referencing, use Sub Graphs. Sub Graphs appear in the Create Node Menu, and they allow you to share or re-use your custom functions.


Create your custom function either directly in a Sub Graph, or right-click the existing Custom Function node and select Convert to Sub Graph. Add the appropriate input and output ports using the Blackboard and Custom Port Menu. After this, you can reuse your custom function as many times as needed, even within other Sub Graphs.

You can’t perform that action at this time.