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
이러한 특별한 텍스처 프로퍼티값들은 필요시 요긴하게 사용할 수 있다.
참고
-
'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 |