TRANSFORM_TEX

반응형

UnityCG.cginc 폴더에 보면 이런게 있다


// Transforms 2D UV by scale/bias property

#define TRANSFORM_TEX(tex,name) (tex.xy * name##_ST.xy + name##_ST.zw)


코드에서는 UnityCG.cginc를 include 해서 아래와 같이 사용한다.

o.uv = TRANSFORM_TEX(v.uv, _MainTex); 


그런데 이게 어떤 기능일까?

아래 참고 매뉴얼을 보면 이러한 설명이 되어 있다.


특별한 텍스처 프로퍼티들

shader/material 프로퍼티로 설정한 각 텍스처에서, 유니티는 추가정보를 벡터 프로퍼티로 덧붙인다.


Texture tiling & offset

머티리얼은 종종 기울기와 오프셋 필드를 머티리얼의 텍스처를 위해 가지는데

이 정보는 float4 {텍스처 이름}_ST 항목으로 셰이더로 전달되어 진다.

x는 X 기울기값

y는 Y 기울기값

z는 X 오프셋값

w는 Y 오프셋값

예를 들어, 만약 셰이더가 _MainTex라는 텍스처를 가진다면 기울기 정보는 

_MainTex_ST 벡터가 될 것이다.


o.uv = TRANSFORM_TEX(v.uv, _MainTex);  와 같이 코딩한 채로 위 값을 고쳐보면

텍스처가 이상하게 변하는 것을 볼 수 있다.

Tiling은 몇장의 텍스처를 사용할 것인가를 나타낸다.

예를 들어 x가 1로 되어 있을 경우 아래와 같이 한장의 텍스처를 사용한다.



x가 2로 되어 있을 경우 아래와 같이 같은 범위에서 두장의 텍스처를 사용한다.

즉 1by1 정 사각형에 가로 세로 몇장의 텍스처를 사용할 것인지를 나타낸다.


offset값은 uv 흘리기로 이해하면 쉽다.

uv가 0~1사이 이므로 offset을 1로 하면 0으로 한 것과 같이 다시 처음부터 시작이다.

정수값 ~ 정수값+1 사이의 값이 의미가 있다.


그러므로 만약 위와 같이 Tiling 1,1  그리고 offset 값 0,0 으로 쓴다는게 약속이 된다면

아래의 매크로를 해 줄 필요가 없다.

TRANSFORM_TEX( v.uv, _Tex );



이는 위 값들이 미리 규칙에 맞게 선언 해 둔 float4 _MainTex_ST; 값에 전달되어 지고

TRANSFORM_TEX의 매크로로 변환되어 결과값 계산이 아래와 같이 되기 때문이다.

o.uv = v.uv * _MainTex_ST.xy + _MainTex.zw; 


그리고 추가로 아래와 같이 코드를 고쳐 보자.

o.uv = v.uv;

위 이미지의 값을 아무리 고쳐도 아무런 변화가 없는 것을 볼 수 있다.


또 {텍스처 이름}_TexelSize 는 텍스처의 크기 정보를 가진다.

x : 1.0/width

y : 1.0/height

z : width

w : height

이러한 특별한 텍스처 프로퍼티값들은 필요시 요긴하게 사용할 수 있다.


참고 

- Cg/HLSL 쉐이더 프로퍼티 접근

-

'Unity > Unity Graphics' 카테고리의 다른 글

Depth and Normal Texture (Part 1)  (2) 2016.04.29
#pragma multi_compile  (0) 2016.04.23
Performance Tips when Writing Shaders  (0) 2016.04.15
Unity Tags  (0) 2016.04.12
Built in shader variables  (0) 2015.10.30
TAGS.

Comments