[Unity] 유니티 셰이더 코드에서 _MainTex_TexelSize 변수의 정체는?
셰이더 코드는 참조하다보니 _MainTex_TexelSize; 라는 변수를 선언만 하고 바로 사용하는 모습들을 종종 보게 됨. 내장 변수인 것 같은데, 어떤 값을 담는지 설명은 검색해도 보이던데 어디서 어떻게 생성해서 값을 할당 해주는 것인지에 대한 내용이 잘 보이지 않더라.
일단 이 변수는 유니티 엔진 내부에서 생성 및 할당해주는 변수는 확실하고, 관련 설명은 아래 유니티 공식 문서에서 서술하고 있음.
주의해야 할 부분은, _MainTex_TexelSize 라는 이름의 변수명을 생성해주는 것이 아니고, {TextrueName}_TexelSize 라는 이름으로 생성해준다는 것. 셰이더를 작성할 때 보통 _MainTex 프로퍼티를 생성하기 때문에 결론적으로 _MainTex_TexelSize 라는 변수가 만들어졌던 것.
_MainTex_TexelSize 는 float4 프로퍼티로 생성되는데, 셰이더에서 선언할 때는 half4 타입으로 선언해도 되는 모양. 각 요소의 값은 아래와 같음.
x는 1.0/너비.
y는 1.0/높이.
z는 너비.
w는 높이.
즉 화면 가로x세로 해상도가 1024x768 이면
_MainTex_TexelSize.x 는 1/1024
_MainTex_TexelSize.y 는 1/768
Unity 공식 문서, Cg/HLSL 셰이더 프로퍼티 액세스 - 특수 텍스처 프로퍼티
관련 코드는 아래 GitHub 코드 참조. _TexelSize 외에도 몇몇 프로퍼티를 생성하고 있는 걸 확인.
internal override void ForeachHLSLProperty(Action<HLSLProperty> action)
{
HLSLDeclaration decl = (generatePropertyBlock ? HLSLDeclaration.UnityPerMaterial : HLSLDeclaration.Global);
action(new HLSLProperty(HLSLType._Texture2D, referenceName, HLSLDeclaration.Global));
action(new HLSLProperty(HLSLType._SamplerState, "sampler" + referenceName, HLSLDeclaration.Global));
action(new HLSLProperty(HLSLType._float4, referenceName + "_TexelSize", decl));
if (useTilingAndOffset)
{
action(new HLSLProperty(HLSLType._float4, referenceName + "_ST", decl));
}
}
게임 개발에 필수적인 내용을 담는 명서들을 소개합니다.
<유니티 교과서 개정6판>(유니티 최신 버전)
https://link.coupang.com/a/be3P0t
<대마왕의 유니티 URP 셰이더 그래프 스타트업>
https://link.coupang.com/a/bs8qyC
<리얼-타임 렌더링(REAL-TIME RENDERING) 4/e>
https://link.coupang.com/a/8VWas
<이득우의 게임 수학:39가지 예제로 배운다! 메타버스를 구성하는 게임 수학의 모든 것>
https://link.coupang.com/a/9BqLd
유니티 에셋 스토어 링크
https://assetstore.unity.com?aid=1011lvz7h
(링크를 통해 도서/에셋 구입시 일정액의 수수료를 지급받습니다.)