[URP] TEXTURE2D 메크로 (구 sampler2D)
유니티 CG와 HLSL쉐이더에서 각각 텍스처 샘플링하는 코드는 위와 같습니다.
CG에서는 텍스처와 샘플러를 합쳐서 변수 선언하지만 HLSL에서는 따로 변수 선언하는 차이점이 있습니다.
샘플러/샘플링이란?
간단히 요약하면 이미지(텍스처) 색상 정보를 쉐이더로 가져오는 행위를 뜻합니다.
샘플링 과정에서 아래 예시처럼 필터링을 하거나 UV반복 방식을 세팅할 수 있습니다.
sampler_ 뒤에 텍스처 변수명을 붙인다는것은, 유니티 엔진의 텍스처 Inspector에서 세팅한 샘플링 설정을 사용하겠다는 의미입니다.
엔진에서 세팅한 텍스처 샘플링 설정이 아닌, 쉐이더에서 자체적으로 샘플링 옵션을 세팅할 수 있습니다.
HLSL에서 샘플러 변수를 따로 선언하는 것으로 인한 장점입니다.
또한 하나의 쉐이더에 최대 샘플러 제한이 있는데, 위 코드처럼 샘플러를 우려먹으면 더 많은 텍스처를 사용할 수 있습니다.
참고로 최신 GPU칩셋에서는 보통 최대 샘플러 16개이지만, GLES2.0같이 구형 칩셋에서는 더 부족합니다.
TEXTURE2D 메크로의 기능
TEXTURE2D 메크로는 GPU칩셋에 알맞는 텍스처 & 샘플링 변수 선언해주는 메크로입니다.
Core RP Library의 Common.hlsl에 분기 처리가 되어 있고, 각 API hlsl파일에 TEXTURE2D 메크로가 선언되어 있습니다.
추가로 TEXTURE2D_X메크로는 VR같이 스테레오 인스턴싱을 자동으로 대응해주는 메크로입니다.
사실상 TEXTURE2D_X메크로를 사용하는것이 호환성이 가장 좋은 방식같습니다.
HLSL에서 기존 sampler2D사용하면 안되나?
PC및 GLES3.0이상 플랫폼에서 sampler2D를 사용했지만 문제점을 발견하지 못했습니다.
하지만 구버전 혹은 특정 플랫폼에서 이슈가 발생할 위험이 있을것 같습니다.
아래 유니티 공식 자료를 참고해보면 빌트인 CG쉐이더에서도 샘플러를 따로 선언하는 기능이 있지만 OpenGLES 구버전은 지원하지 않는다고 작성되어 있습니다.
이런점을 보아 엔진 내부에서 자동으로 변환하는것이 아닌 그냥 sampler2D를 지원하기 때문에 문제가 없었던것 같습니다.
https://docs.unity.cn/kr/2020.2/Manual/SL-SamplerStates.html
샘플러 상태 사용 - Unity 매뉴얼
대부분의 경우 텍스처를 셰이더에서 샘플링할 때 텍스처 샘플링 상태는 텍스처 설정에서 나옵니다. 기본적으로 텍스처와 샘플러는 함께 결합되어 있습니다. 다음은 DX9 스타일 셰이더 구문을 사
docs.unity.cn