# Create a custom node by reflection from HLSL Create custom nodes by reflection from HLSL files and automatically make them available in the Shader Graph node library. ## Reflect an HLSL function into a Shader Graph node Follow these steps: 1. Create an empty HLSL file anywhere in your Unity project: from the Editor's menu, select **Assets** > **Create** > **Shader** > **Empty HLSL**. 1. Write your HLSL function. 1. Add the following include at the top of the file: `#include "ShaderApiReflectionSupport.hlsl"`. 1. Precede the function declaration with `UNITY_EXPORT_REFLECTION`. 1. Save the HLSL file. ### Example ``` #include "ShaderApiReflectionSupport.hlsl" UNITY_EXPORT_REFLECTION float3 MyCustomFunction( float3 param1, float param2) { return param1 * param2; } ``` ## List the reflected node in Shader Graph's Create Node menu. To make a reflected node available in Shader Graph's [**Create Node** menu](Create-Node-Menu.md), you minimally have to assign it a provider key. To specify a provider key value, in the HLSL include file, precede the function with the following hint: ``` /// /// MyValue /// ``` By default, as soon as you specify a provider key, Unity places the reflected node in the **Reflected by Path** category and uses its corresponding function name to identify it. However, you can use [additional reflection hints](Custom-nodes-hlsl-reflection-hints-reference.md) to the HLSL include file to specify custom category and node display names, and more. For more details, refer to the next section. ## Further customize the reflected node To further customize the behavior and appearance of the reflected function node and its parameters in Shader Graph, you have to precede the function with a list of [reflection hints](Custom-nodes-hlsl-reflection-hints-reference.md) in the HLSL include file. There are two types of hints: * Function hints for the function node as a whole. * Parameter hints for the node parameters and ports. ### Add function hints Add function hints (`funchints`) to further customize the node as a whole. For example, to specify a provider key, a display name, and a **Create Node** menu search category for the node, use the following : ``` /// /// MyCustomUniqueID /// My Very Custom Function /// Custom/MyFunction /// ``` Make sure to meet the following criteria: * Use a `` xml tag pair to wrap the list. * Start all lines with a triple-slash (`///`). ### Add parameter hints Add parameter hints (`paramhints`) to further customize the node parameters and ports. For example, to specify input port display names, types, and default values, use the following: ``` /// /// Color /// /// 1,1,0 /// /// /// Range /// 0, 1 /// 0.25 /// ``` Make sure to meet the following criteria: * Use a `` xml tag pair to wrap the list for each parameter. * For `paramname`, use the name of the parameter as you specified it in the HLSL function. * Start all lines with a triple-slash (`///`). ## Complete example The following code snippet groups all the example cases provided in the previous sections. You can use it as is in your project to test the feature. ``` #include "ShaderApiReflectionSupport.hlsl" /// /// MyCustomUniqueID /// My Very Custom Function /// Custom/MyFunction /// /// /// Color /// /// 1,1,0 /// /// /// Range /// 0, 1 /// 0.25 /// UNITY_EXPORT_REFLECTION float3 MyCustomFunction( float3 param1, float param2) { return param1 * param2; } ``` ## Additional resources - [Introduction to HLSL in Shader Graph](Custom-nodes-hlsl-introduction.md) - [Node Reference sample](Shader-Graph-Sample-Node-Reference.md): in the `Utility` folder, refer to the `ReflectedFunction` graph. - [Reflected function hints reference](Custom-nodes-hlsl-reflection-hints-reference.md)