Unity HLSL 셰이더 매크로 가이드
이 문서는 Unity의 HLSL 셰이더에서 사용되는 다양한 매크로 및 기능에 대한 간단한 설명과 예제를 포함하고 있습니다. 이 매크로들은 플랫폼 간 호환성을 지원하고, 셰이더를 더 효율적으로 작성하는 데 도움을 줍니다.
플랫폼 매크로
Unity는 여러 타겟 플랫폼을 지원하며, 각 플랫폼에 맞는 매크로를 제공하여 셰이더 코드의 조건부 컴파일을 가능하게 합니다.
| 매크로 | 설명 |
|---|---|
SHADER_API_D3D11 |
Direct3D 11을 타겟으로 합니다. |
SHADER_API_GLCORE |
데스크톱 OpenGL Core (GL 3/4)을 타겟으로 합니다. |
SHADER_API_GLES |
OpenGL ES 2.0을 타겟으로 합니다. |
SHADER_API_VULKAN |
Vulkan을 타겟으로 합니다. |
셰이더 모델 매크로
셰이더 모델에 따라 코드를 분기할 수 있도록 도와줍니다. 예를 들어:
#if SHADER_TARGET < 30
// 세부 기능이 제한된 경우
#else
// 더 나은 기능을 사용할 수 있는 경우
#endif
Unity 버전 매크로
Unity 버전에 따라 코드의 조건부 실행을 할 수 있습니다.
| 매크로 | 설명 |
|---|---|
UNITY_VERSION |
현재 Unity 버전의 숫자 값입니다. |
예제:
#if UNITY_VERSION >= 202000
// Unity 2020 이상의 특수 기능을 사용할 수 있습니다.
#endif
플랫폼 차이 헬퍼 매크로
HLSL에서의 플랫폼별 코드 관리를 용이하게 해주는 매크로들입니다.
| 매크로 | 용도 |
|---|---|
UNITY_BRANCH |
실제 브랜치를 요구하는 조건에서 사용합니다. |
UNITY_NO_SCREENSPACE_SHADOWS |
모바일 플랫폼에서 스크린 공간 섀도우맵을 비활성화합니다. |
UNITY_CAN_COMPILE_TESSELLATION |
테셀레이션 셰이더를 컴파일할 수 있는지 표시합니다. |
섀도우 매핑 매크로
섀도우 매핑을 구현할 때 사용되는 매크로입니다.
| 매크로 | 용도 |
|---|---|
UNITY_DECLARE_SHADOWMAP(tex) |
섀도우맵 텍스처 변수를 선언합니다. |
UNITY_SAMPLE_SHADOW(tex, uv) |
지정된 UV 좌표에서 섀도우맵을 샘플링합니다. |
상수 버퍼 매크로
Direct3D 11에서는 모든 셰이더 변수를 상수 버퍼로 그룹화해야 합니다.
| 매크로 | 설명 |
|---|---|
CBUFFER_START(name) |
상수 버퍼 블록을 시작합니다. |
CBUFFER_END |
상수 버퍼 블록을 종료합니다. |
예제:
CBUFFER_START(MyRarelyUpdatedVariables)
float4 _SomeGlobalValue;
CBUFFER_END
텍스처 및 샘플러 선언 매크로
셰이더 코드에서 텍스처와 샘플러를 선언하는 방법입니다.
| 매크로 | 용도 |
|---|---|
UNITY_DECLARE_TEX2D(name) |
텍스처 및 샘플러 페어를 선언합니다. |
UNITY_SAMPLE_TEX2D(name, uv) |
샘플러로부터 텍스처 샘플을 가져옵니다. |
셰이더 예제
다음은 게임 오브젝트의 뎁스를 렌더링하는 간단한 셰이더 예제입니다.
Shader "Render Depth" {
SubShader {
Tags { "RenderType"="Opaque" }
Pass {
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct v2f {
float4 pos : SV_POSITION;
float2 depth : TEXCOORD0;
};
v2f vert (appdata_base v) {
v2f o;
o.pos = UnityObjectToClipPos(v.vertex);
UNITY_TRANSFER_DEPTH(o.depth);
return o;
}
half4 frag(v2f i) : SV_Target {
UNITY_OUTPUT_DEPTH(i.depth);
}
ENDCG
}
}
}
결론
Unity HLSL 셰이더의 다양한 매크로를 활용하여 플랫폼 간의 호환성을 높이고, 더 효율적인 코드를 작성할 수 있습니다. 이 문서에서 제시한 매크로와 예제를 통해 셰이더 개발의 기본적인 이해를 돕기를 바랍니다. 추가 질문이 있다면 Unity 공식 문서를 참조하시기 바랍니다.