Files
CartoonRPG/Library/PackageCache/com.unity.visualeffectgraph@2973a8ac1070/Documentation~/Operator-CustomHLSL.md
Caleb Sandford deQuincey 02c4b5ab66 Adding in new packages
2025-06-05 22:59:18 +01:00

2.0 KiB

Custom HLSL Operator

Menu Path : Operator > HLSL > Custom HLSL

The Custom HLSL Operator allows you to write an HLSL function that takes inputs and produce outputs. For general information about Custom HLSL nodes, refer to Custom HLSL Nodes.

Specific constraints

  • Function must either return a value or have at least one out/inout parameter
  • Function do not support parameters of type VFXAttributes
  • Function can take a maximum of 4 parameters

Each function parameter with no access modifier or in/inout access modifier will match an input port.
The return value will match the operator output. If you use the access modifier out or inout for some function parameters, then they will generate an output port.

Here is an example of a valid function declaration:

float Distance(in float3 a, in float3 b)
{
  return distance(a, b);
}

Another example with an out modifier:

bool IsClose(in float3 a, in float3 b, float threshold, out float d)
{
  d = distance(a, b);
  if (d >= threshold)
    return true;
  return false;
}

A sample with comments

/// a: the tooltip for parameter a
/// b: the tooltip for parameter b
float Distance(in float3 a, in float3 b)
{
  return distance(a, b);
}

You can also give a name to the output for the return value.
In the sample below, the output port in the graph will be named sqr

/// return: sqr
float Square(in float t)
{
  return t * t;
}

Include other HLSL files

You can include any valid HLSL file with the standard #include directive. The path to the included file can be:

  • Relative to the VFX asset where the block will be used
  • Absolute starting from the Assets/ folder.
  • Absolute starting from the Packages/ folder.

For the Custom HLSL operator, the #include directive is only supported when used with hlsl file (not embedded code).

#include "HLSL/common.hlsl"

float SomeFunctionName(in float someValue)
{
    // use any function or variable declared in the included file
}