Unity HLSL 셰이더 키워드 사용 가이드
이 문서는 Unity의 HLSL에서 셰이더 키워드를 선언하고 사용하는 방법에 대해 설명하며, 다양한 활용 및 응용 예제를 제공합니다.
셰이더 키워드 정의
셰이더 키워드는 특정 기능을 활성화하거나 비활성화하는 데 사용됩니다. HLSL 코드 내에서 #pragma 지시문을 사용하여 키워드를 선언할 수 있습니다.
키워드 선언 예시
#pragma shader_feature REFLECTION_TYPE1 REFLECTION_TYPE2 REFLECTION_TYPE3
셰이더 지시문 종류
| 지시문 종류 | 설명 |
|---|---|
| shader_feature | 정적 브랜칭을 위한 키워드 조합에 대한 배리언트 생성 |
| multi_compile | 모든 가능한 키워드 조합에 대한 배리언트 생성 |
| dynamic_branch | 동적 브랜칭을 통해 배리언트 생성이 없음 |
키워드 세트 사용
셰이더 키워드는 여러 개의 키워드를 세트로 묶어 동시에 활성화하거나 비활성화할 수 있습니다.
예시
#pragma shader_feature REFLECTION_TYPE1 REFLECTION_TYPE2 REFLECTION_TYPE3
#pragma shader_feature RED GREEN BLUE WHITE
커스텀 조건부 코드 작성
HLSL에서 if 문을 사용하여 조건부 코드를 작성할 수 있습니다. 키워드를 기반으로 특정 셰이더 코드의 실행 여부를 결정할 수 있습니다.
예시
#pragma multi_compile QUALITY_LOW QUALITY_MED QUALITY_HIGH
if (QUALITY_LOW)
{
// 저품질 설정 코드
}
인스펙터를 통한 키워드 제어
Unity 인스펙터 또는 C# 스크립트를 사용하여 셰이더 키워드를 활성화하거나 비활성화할 수 있습니다.
정적 vs 동적 브랜칭
- 동적 브랜칭: 각 키워드에 대해 균일한 부울 변수를 생성하여 조건부 코드를 처리.
- 정적 브랜칭: 활성화된 배리언트를 조건부 코드와 함께 GPU에 전송.
지역 키워드 만들기
기본적으로 키워드는 전역입니다. _local을 사용하여 키워드를 지역으로 선언할 수 있습니다.
예시
#pragma shader_feature_local QUALITY_LOW QUALITY_MED QUALITY_HIGH
특정 단계에 대한 키워드 제한
키워드를 특定 단계에만 적용하려면 접미사를 사용할 수 있습니다.
| 접미사 | 설명 |
|---|---|
| _vertex | 버텍스 단계에서 코드 포함 |
| _fragment | 프래그먼트 단계에서 코드 포함 |
| _hull | 헐 단계에서 코드 포함 |
예시
#pragma shader_feature_fragment RED GREEN BLUE
서포트되는 그래픽스 API
선언된 키워드는 OpenGL, Vulkan, DirectX의 그래픽스 API와 플랫폼에 따라 다르게 작동할 수 있습니다. 예를 들어 Metal에서는 _geometry와 _raytracing 접미사가 작동하지 않습니다.
비활성화된 키워드용 배리언트 생성
Unity는 특정 키워드가 비활성화될 경우를 대비해 추가 배리언트를 자동으로 생성할 수 있습니다.
예시
#pragma shader_feature EXAMPLE_ON
이 가이드는 Unity에서 HLSL을 사용하는 데 필수적인 정보를 제공하여 개발자들이 셰이더 키워드를 효과적으로 활용할 수 있도록 돕습니다. 다양한 예시를 통해 이해를 돕고, 다양한 상황에서의 활용 방안을 제시합니다.