유니티 엔진 (Unity Engine)

[Unity] 유니티 셰이더 코드에서 _MainTex_TexelSize 변수의 정체는?

원소랑 2024. 3. 19. 16:16
728x90

셰이더 코드는 참조하다보니 _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 셰이더 프로퍼티 액세스 - 특수 텍스처 프로퍼티

https://docs.unity3d.com/kr/current/Manual/SL-PropertiesInPrograms.html#:~:text=%EC%A1%B4%EC%9E%AC%ED%95%A0%20%EC%88%98%20%EC%9E%88%EC%8A%B5%EB%8B%88%EB%8B%A4.-,%ED%8A%B9%EC%88%98%20%ED%85%8D%EC%8A%A4%EC%B2%98%20%ED%94%84%EB%A1%9C%ED%8D%BC%ED%8B%B0,-%EC%85%B0%EC%9D%B4%EB%8D%94/%EB%A8%B8%ED%8B%B0%EB%A6%AC%EC%96%BC%20%ED%94%84%EB%A1%9C%ED%8D%BC%ED%8B%B0%EB%A1%9C

 

Cg/HLSL에서 셰이더 프로퍼티 액세스 - Unity 매뉴얼

셰이더는 프로퍼티 블록에서 머티리얼 프로퍼티를 선언합니다. 셰이더 프로그램에서 일부 프로퍼티에 액세스하려는 경우 동일한 이름과 매칭 타입으로 Cg/HLSL 변수를 선언해야 합니다.

docs.unity3d.com

 

관련 코드는 아래 GitHub 코드 참조. _TexelSize 외에도 몇몇 프로퍼티를 생성하고 있는 걸 확인.

https://github.com/Unity-Technologies/Graphics/blob/master/Packages/com.unity.shadergraph/Editor/Data/Graphs/Texture2DShaderProperty.cs#L70

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

 

유니티 교과서 개정6판

COUPANG

www.coupang.com

 

<대마왕의 유니티 URP 셰이더 그래프 스타트업>

https://link.coupang.com/a/bs8qyC

 

대마왕의 유니티 URP 셰이더 그래프 스타트업

COUPANG

www.coupang.com


<리얼-타임 렌더링(REAL-TIME RENDERING) 4/e>
https://link.coupang.com/a/8VWas

 

리얼-타임 렌더링 4/e

COUPANG

www.coupang.com

 

<이득우의 게임 수학:39가지 예제로 배운다! 메타버스를 구성하는 게임 수학의 모든 것>
https://link.coupang.com/a/9BqLd

 

이득우의 게임 수학:39가지 예제로 배운다! 메타버스를 구성하는 게임 수학의 모든 것

COUPANG

www.coupang.com

 

유니티 에셋 스토어 링크
https://assetstore.unity.com?aid=1011lvz7h

 

에셋스토어

여러분의 작업에 필요한 베스트 에셋을 찾아보세요. 유니티 에셋스토어가 2D, 3D 모델, SDK, 템플릿, 툴 등 여러분의 콘텐츠 제작에 날개를 달아줄 다양한 에셋을 제공합니다.

assetstore.unity.com

(링크를 통해 도서/에셋 구입시 일정액의 수수료를 지급받습니다.)


 

728x90
반응형