Custom Function 노드
설명
Custom Function 노드를 사용하면 셰이더 그래프에 커스텀 HLSL 코드를 삽입할 수 있습니다. 이렇게 하면 필요할 때 추가 수준의 컨트롤(예: 세분화된 최적화 수행)이 가능합니다. 문자열 모드를 사용하여 작은 함수를 그래프에 직접 작성하거나, 외부 HLSL 포함 파일을 참조할 수 있습니다. Custom Port 메뉴를 사용하여 노드 자체에서 고유한 입력 및 출력 포트를 정의하십시오.
사용 방법
Create Node 메뉴를 사용하여 Custom Function 노드를 생성하십시오. 기본적으로 새 Custom Function 노드에는 입력 또는 출력 포트가 없습니다. 그래프 인스펙터에서 Node Settings를 열고 Custom Function 메뉴 및 Custom Port 메뉴에 액세스하십시오.
Custom Function 메뉴
메뉴 항목 | 설명 |
---|---|
Inputs | 노드의 입력 포트를 정의하는 Custom Port 메뉴입니다. |
Outputs | 노드의 입력 포트를 정의하는 Custom Port 메뉴입니다. |
Type | 함수 타입 선택자입니다. 외부 파일 또는 문자열을 참조할 파일을 선택하여 노드에 함수를 직접 입력합니다. |
이름 | 최종 생성된 코드에 있는 이 커스텀 함수 이름의 일부입니다. 접미사는 _half 또는 _float 함수 타입입니다. |
Source | 외부 HLSL 포함 파일을 참조하는 에셋 필드입니다. File 모드에서만 사용 가능합니다. |
Body | HLSL 코드를 입력하는 텍스트 상자입니다. String 모드에서만 사용 가능합니다. |
문자열을 통한 함수 정의
String
모드를 선택하면 그래프가 셰이더 함수를 생성합니다. Name
필드는 생성된 함수의 이름을 정의하고 Body
필드는 생성된 함수의 내용을 정의합니다. Unity는 인수, 중괄호 및 인덴트 범위를 자동으로 처리합니다. String
모드에서는 Body
필드에 half
또는 float
대신 $precision
토큰을 사용할 수 있습니다. Unity는 노드가 처리될 때 해당 노드의 정밀도에 따라 이를 올바른 타입으로 교체합니다.
위 이미지의 예시는 다음 함수를 생성합니다.
void MyFunction_float(float3 A, float B, out float3 Out)
{
Out = A + B + 1/2;
}
파일을 통한 함수 정의
File
모드를 선택하면 그래프가 셰이더 함수를 자동으로 생성하지 않습니다. 이 모드는 생성된 최종 셰이더에 포함 레퍼런스를 삽입하고, 참조된 파일 내에서 함수를 사용합니다. Name
필드는 호출하려는 함수의 이름과 일치해야 합니다. Source
필드에는 함수가 포함된 HLSL 파일에 대한 레퍼런스가 포함됩니다.
Custom Function 노드에 File
모드를 사용하는 경우 수동으로 함수의 포맷을 올바르게 지정해야 합니다. 셰이더 그래프에 대한 커스텀 함수를 생성할 때 주의해야 할 한 가지 사항은 정밀도 접미사입니다. 생성된 코드는 함수 이름에 정밀도 접미사를 추가합니다. 또한 포함 파일 함수는 원하는 정밀도 접미사(아래에 표시된 것처럼 _float
)를 추가하거나 _float
및 _half
접미사가 있는 여러 함수를 포함해야 하지만, Name
필드는 정밀도 접미사를 포함하지 않아야 합니다.
//UNITY_SHADER_NO_UPGRADE
# ifndef MYHLSLINCLUDE_INCLUDED
# define MYHLSLINCLUDE_INCLUDED
void MyFunction_float(float3 A, float B, out float3 Out)
{
Out = A + B;
}
# endif //MYHLSLINCLUDE_INCLUDED
File
모드를 사용하면 그래프의 커스텀 함수를 유연하게 사용할 수 있습니다. 아래에 매트릭스과 함께 표시된 것처럼, 함수 범위 외부에서 일관된 변수를 정의할 수 있습니다.
//UNITY_SHADER_NO_UPGRADE
# ifndef MYHLSLINCLUDE_INCLUDED
# define MYHLSLINCLUDE_INCLUDED
float4x4 _MyMatrix;
void MyFunction_float(float3 A, float B, out float3 Out)
{
A = mul(float4(A, 0.0), _MyMatrix).rgb;
Out = A + B;
}
# endif //MYHLSLINCLUDE_INCLUDED
동일한 파일에서 여러 함수를 정의하고 참조된 함수에서 호출할 수 있습니다. 또는 동일한 파일을 참조하되, 다른 Custom Function 노드의 다른 함수를 사용할 수도 있습니다.
//UNITY_SHADER_NO_UPGRADE
# ifndef MYHLSLINCLUDE_INCLUDED
# define MYHLSLINCLUDE_INCLUDED
float3 MyOtherFunction_float(float3 In)
{
return In * In;
}
void MyFunction_float(float3 A, float B, out float3 Out)
{
A = MyOtherFunction_float(A);
Out = A + B;
}
# endif //MYHLSLINCLUDE_INCLUDED
다른 함수가 들어 있는 다른 파일을 포함할 수도 있습니다.
//UNITY_SHADER_NO_UPGRADE
# ifndef MYHLSLINCLUDE_INCLUDED
# define MYHLSLINCLUDE_INCLUDED
# include "Assets/MyOtherInclude.hlsl"
void MyFunction_float(float3 A, float B, out float3 Out)
{
A = MyOtherFunction_float(A);
Out = A + B;
}
# endif //MYHLSLINCLUDE_INCLUDED
Custom Function 노드 재사용
Custom Function 노드는 그 자체로 단일 노드 인스턴스입니다. 입력, 출력 및 함수 레퍼런스를 다시 생성하지 않고 동일한 커스텀 함수를 재사용하려면 하위 그래프를 사용하십시오. 하위 그래프는 Create Node 메뉴에 나타나며, 이를 통해 커스텀 함수를 공유하거나 재사용할 수 있습니다.
하위 그래프에서 커스텀 함수를 직접 생성하거나, 기존 Custom Function 노드를 마우스 오른쪽 버튼으로 클릭하고 Convert to Sub Graph
를 선택하십시오. 적절한 입력 및 출력 포트를 추가하려면 그래프 인스펙터 및 Custom Port 메뉴를 사용하십시오. 그러면 다른 하위 그래프 내에서도 커스텀 함수를 필요한 만큼 재사용할 수 있습니다.
텍스처 와이어 작업
버전 10.3부터 셰이더 그래프에는 CFN(Custom Function Node)과 하위 그래프가 일관된 방식으로 텍스처 와이어에서 데이터를 입력 및 출력할 수 있도록 5가지 새로운 데이터 구조를 제공합니다. 새로운 구조를 통해 SamplerState는 GLES2 플랫폼에서 컴파일하고 myInputTex.samplerstate
및 myInputTex.texelSize
를 통해 텍스처에 연결된 데이터에 액세스할 수 있습니다.
네 가지 구조는 텍스처 타입용이고, 나머지 한 가지는 샘플러 상태용입니다.
- UnityTexture2D
- UnityTexture2DArray
- UnityTexture3D
- UnityTextureCube
- UnitySamplerState
이전 버전의 셰이더 그래프에서 생성된 CFN은 이 변경 후에도 계속 작동합니다. 자동 업데이트의 일환으로, Unity는 이를 새로운 Bare 노드 타입으로 전환합니다. 이 타입은 이전 입력 및 출력 동작을 복제합니다. 다른 모든 타입은 새 구조체를 전달합니다.
하지만 텍스처 또는 샘플러 상태 타입을 출력으로 생성하는 CFN을 수동으로 업그레이드해야만 일관된 작동을 보장하고 새로운 설계의 이점을 누릴 수 있습니다. Unity는 10.3 이상에서 셰이더 그래프를 열 때 이러한 타입의 예전 Custom Function 노드에 경고를 표시합니다.
업그레이드 방법
- 모든 입력 및 출력 타입을 Bare에서 non-Bare로 변경합니다.
문자열 타입: HLSL 문자열이 이미 Unity의 텍스처 액세스 매크로(예:
SAMPLE_TEXTURE2D
)를 사용하는지 확인합니다.파일 타입: 함수 파일에서 Bare 타입(예: Texture2D)을 새 구조체 타입(예: UnityTexture2D)으로 교체합니다.
- HLSL 코드가 플랫폼별 또는 비표준 텍스처 작업을 사용하는 경우 그러한 구조를 고려하도록 텍스처에 액세스하는 방식을 전환해야 합니다. 예를 들어
myInputTex.GetDimensions(...)
는myInputTex.tex.GetDimensions(...)
가 됩니다.
10.3 버전부터 myInputTex.samplerstate
및 myInputTex.texelSize
를 통해 텍스처와 연결된 데이터에 액세스할 수 있습니다.