GRAPHICS PROGRAMMING

셰이더 프로그래밍에서 ## 연산자. 토큰 결합 연산자(token-pasting operator)

jplee 2025. 5. 30. 03:22
Properties {
    _Metallic0("Metallic 0", Range(0,1)) = 0.0
    _Metallic1("Metallic 1", Range(0,1)) = 0.0
    _Metallic2("Metallic 2", Range(0,1)) = 0.0
}
CBUFFER_START(UnityPerMaterial)
    float _Metallic0;
    float _Metallic1;
    float _Metallic2;
CBUFFER_END
// 배열 초기화 시
float metallicValues[3] = {
    METALLIC(0),   // → _Metallic0
    METALLIC(1),   // → _Metallic1
    METALLIC(2)    // → _Metallic2
};

// 개별 호출 시
float m0 = METALLIC(0);
float m1 = METALLIC(1);

 

역할과 동작 원리

## 연산자는 크게 두 가지의 연산자로서 역할을 한다.
첫 째 토큰 결합(token pasting) 연산자 이고 둘 째로는 동적 식별자 생성 역할이다. 다른건 차치하고 동적 식별자만 보자.
메탈릭 값 같은 여러 개의 유사한 프로퍼티 변수를 인덱스만 바꿔가며 사용해야 할 때, 일일이 이름을 타이핑하지 않아도 매크로로 자동 생성할 수 있다.
예를 들어 #define METALLIC(idx) _Metallic##idx 와 같이 정의하면 METALLIC(1) 호출 시 전처리 단계에서 _Metallic과 1이 결합되어 _Metallic1이라는 변수명이 생성된다. 
이 과정을 통해 프로퍼티 블록에 정의된 _Metallic0, _Metallic1, _Metallic2 같은 변수들을 인덱스만으로 유연하게 참조할 수 있으며, 코드 유지보수성과 재사용성을 크게 향상시킨다.