본문 바로가기
Shader

Texcoord. xyzw와 UV1, UV2와의 관계

by 대마왕J 2021. 2. 11.

이 부분이 많이 헷갈리게 작성된 부분입니다. 그래서 정리가 필요하긴 한데요 

일단 이걸 설명하려면 먼저 Texcoord 레지스터 부터 알아야 합니다. 

Texcoord는 기본적으로 텍스쳐 좌표를 옮기기 위해 만들어진 녀석입니다 

docs.microsoft.com/en-us/windows/win32/direct3dhlsl/texcoord---ps

 

texcoord - ps - Win32 apps

Interprets texture coordinate data (UVW1) as color data (RGBA).

docs.microsoft.com

텍스쳐 좌표계는 아시는대로 주로 UV, 즉 float2 를 사용합니다만

사실  UVW 라고 하는 3차원 좌표계도 있다는 것을 알고 계실 겁니다. 

그렇게 되면 float3 지요. 

 

즉 UV는 UVW일수도 있어서 float3 만큼은 가지고 있어야 한다는 말입니다. 

 

그리고 그래픽 카드의 레지스터에서도 texcoord의 자리를 잡아 놓은게, float4 만큼을 잡아 놨습니다. 

즉 texcoord0 도 float4 , texcoord1도 float4 .. 

 

즉 정리하자면

texcoord0 는 x,y,z,w 를 가지고 있습니다만

UV 데이터는 많으면 3개, 보통은 2개를 가지고 있어서 

texcoord0 의 x,y 가 UV0 의 u,v 입니다 

 

즉 이렇게 대입된다고 말할 수 있지요 

보통 w 값은 잘 안쓰입니다. 그래서 보통은 1이 들어가 있다고 합니다. 

 

증명하기 위해서 다음과 같이 해 보겠습니다. 

 

이렇게 그냥 UV0번과 UV1 번을 더하는 아무 의미없는 노드를 만들어 보았습니다. 

그리고 그걸 Generate  해서 코드로 변환해 보았습니다. 

 

그러자 Texcoord0 번에 float2만 이용해서 UV가 생성되고, 

Texcoord1번에 float2 만 이용해서 두 번째 UV 인 라이트맵 UV가 불러와 진 것을 알 수있습니다.

즉 UV 0번과 1번은 각각 Texcoord0번과 1번임을 알 수 있습니다. 

texcoord는 float4인데, 두 개만 쓴거죠. 그럼 두 개는? 놉니다. 랄라라 

노는 게 제일 좋아
UV0의 float4를 두 개씩 나눠서 봤습니다. 

이걸 증명해 보았습니다. UV의 XY에는 UV의 값이 정상적으로 들어가 있고, 

BA를 RG로 출력했더니 0,1 이 나왔습니다. 즉 UV의 float4에는 U,V,0,1 값이 들어 있단 얘기입니다. 

 

이것까지는 아주 명쾌합니다.  texcoord0 는 UV0 이라는 거죠  texcoord1이 UV1 입니다. 

 

 

 

그럼 슈리켄의 버텍스 스트림에서의 UV2 는?


그럼 이번엔 이상한것. 슈리켄의 커스텀 버텍스 스트림에서 UV2는 뭐냐!! 라는 거죠 

 

여기서는 사실 UV2는 아무 의미 없습니다 (...) 그냥 UV라는 float2 값을 하나 더 추가해 준다라는 의미외에 없습니다. 

실제 의미는 무조건 TEXCOORD0  안에 들어 있기 때문이지요. 

 

즉 '의미없이 이름붙여서 그냥 비어있는 zw 값을 채워준다' 라는 것 뿐입니다. 진짜는 TEXCOORD 이지 앞에 붙어 있는 이름이 중요한게 아니니까요. 커스텀 데이터가 TEXCOORD1을 써야 하기 때문에 굳이 빈 값을 넣어준 거지 두 번째 채널을 넣어준게 아닙니다.

(이것은 버텍스 셰이더가 스트림이어서 어쩔 수 없이 이어지게 짜야 하는 이유도 있습니다만 그건 다음에) 

 

그래서 여기랑 사실상 두 번째 UV 채널과는 기본적으로 아무 상관이 없습니다. 그냥 이름뿐이지요 (일단 이름부터 UV0부터시작했다면 UV1이어야 하는것 아닙니까. 이미 총체적 난국...) 

 

* 물론, 저걸 의미있게 '만들어 줄 ' 수도 있습니다. 

개념상으로 아래처럼 다시 TEXCOORD0를 만들어 준다면, 저 값에 정말로 UV2가 들어가게 할 수 있습니다.

커스텀이다 이거지요. 아래처럼 만들어 준다면 정말로 texcoord0.zw 가 두 번째 UV가 되게 할 수 있습니다. 그렇지만...

물론 위 그림은 이해를 돕기 위해 만든 그림일 뿐이고, 사실상 버텍스 스트림이라 버텍스 셰이더에서 작성해 줘야 하기 때문에 픽셀 셰이더의 texcoord 밖에 접근 못하는 '노드'에서는 저렇게 하면 버텍스 스트림에서의 역할을 해주지 못합니다. 개념상의 그림일 뿐이다 이거죠 (코드라면 버텍스 셰이더 단계에서 만들어 줄 수 있습니다) 

 

반응형

'Shader ' 카테고리의 다른 글

URP 2019 에서 2020으로 업그레이드 할 때 Shader Error  (0) 2021.03.24
Normal Blending (Detail map)  (2) 2021.02.22
돋보기 효과 만들기  (0) 2021.02.11
Shader.PropertyToID  (2) 2021.02.09
URP Position Transform  (0) 2021.01.27

댓글