정의는 매우 간단하다.

 

폴리곤 표면 각각을 기준으로 하는 별도의 3축 (xyz 축) 공간

 

이미 탄젠트 공간에 대한 개념이 있는 사람만 이해할 수 있는 정의이다. (이게 무슨 정의냐?)

 

어떤 개념이든 당위성을 알고 있어야 이해가 쉽듯, 우리는 저 탄젠트 공간이 왜 필요한지부터 짚고 넘어가보자

 

3D 물체의 울퉁불퉁한 질감표현을 위해 노멀맵을 쓴다는 것은 아마 다들 알고 있을 것이다.

(노멀맵이 뭐지? 하시는 분은 이 포스팅을 먼저 읽기보다 노멀맵에 대한 다른 포스팅을 먼저 읽으신 후 보길 권장한다)

왼쪽이 원본 오른쪽이 노멀맵이 적용된 재질

 

이 노멀맵은 각 픽셀이 어떤 노멀을 가지는지를 텍스쳐로 저장한 데이터고, 우리는 픽셀 셰이더에서 이 노멀과 빛 방향과의 내적을 통해 라이팅 연산을 수행한다.

 

바로 이 부분에서 의문점 한가지가 발생한다.

벡터와 벡터끼리 계산을 위해선 공간을 맞춰줘야 한다.

빛 방향이 만약 월드 공간 기준이라면 노멀 방향도 월드 공간이어야만 한다는 것이다 (제대로 된 연산결과를 위해)

 

문제는 우리가 노멀맵이라고 익히 알고 있는 것들은 모두 '탄젠트 공간' 을 기준으로 저장되어 있다는 것이다.

(뭔가 파란색이 많이 보이고 중간중간 빨간색도 섞인듯 안섞인듯 한 바로 그 텍스쳐 있자나요?!)

 

그럼 선택지는

1. 탄젠트 공간상의 노멀을 빛방향이 존재하는 공간으로 보내든지,

2. 빛방향의 공간을 탄젠트 공간으로 보내든지

중 하나일 것이다.

 

첫번째 방법은 각 픽셀마다 이 변환을 해줘야 하는데 (픽셀 셰이더에서 수행), 이건 부담이 크다.

두번째 방법은 버텍스 셰이더에서 빛방향을 탄젠트 공간으로 변환해 주면 되기 때문에 픽셀 셰이더에서 연산하는 것보다 연산량이 절약된다.

 

퍼포먼스를 위해선 사실 선택의 여지가 없이 두번째 방법을 써야 한다(이 외 TBN 전치행렬을 이용한 연산이득도 포함이다)

 

이제 탄젠트 공간이 왜 필요한지 이해가 가는가?

정리하자면, 노멀 텍스쳐가 이미 탄젠트 공간을 기준으로 저장되어 있기 때문에 연산을 위해선 필수불가결한 것

 

좋다. 텍스쳐가 탄젠트 공간 기준으로 되어 있다는데 그럼 뭐 당연히 탄젠트 공간 필요하겠네

아 근데 다른 공간도 많은데 왜 탄젠트 공간이라는 걸로 저장하는거야?

 

물론 다른 방법도 있다. 바로 물체 기준으로 노멀 정보를 저장하는 것 (이것이 개념적으로 좀 더 명확하다, 직관적이다)

실제로 노멀맵 텍스쳐의 타입은 두가지로 나뉘는데

물체 공간 노멀맵(좌), 탄젠트 공간 노멀맵(우)

왼쪽 노멀들은 신발의 로컬 공간 기준으로 저장한 반면

오른쪽은 각각의 표면 공간을 기준으로 저장한다.

 

로컬 공간 기준?? 표면 공간 기준??

 

아랫 줄 이미지 2개는 각 정점별로 노멀 정보 및 좌표계를 표현한 것이다.

노멀 정보는 회색선으로 표시되었고, 빨간색, 파란색, 녹색은 좌표계 xyz 축을 표시한 것이다.

 

왼쪽을 보면 각 정점마다 좌표계가 모두 동일하고, 노멀인 회색선만 방향이 다르다.

이 말인 즉슨 모든 노멀 정보는 이 신발 공간 기준으로 설정되어 있다는 것.

그래서 이 회색 선인 노멀값 범위는 -1.0 ~ 1.0 일 것이고 이를 텍스쳐로 저장하면 위 중간 이미지처럼 휘황찬란한 색감의 텍스쳐가 보이는 것이다.

 

오른쪽이 이제 문제의 탄젠트 공간 노멀맵인데, 자세히 보면 각 정점마다 좌표계가 모두 다름을 발견 할 수 있다.

(각 정점별로 녹색, 파란색, 빨간색 선의 방향이 다 다르다.)

 

이 좌표계는 정점의 노멀이 Z 축인 정점별 고유의 좌표계이고 이 좌표계 기준으로 노멀 정보를 저장한 것을 탄젠트 공간 노멀맵 이라고 부르는 것이다.

 

이런 이유로 탄젠트 공간 노멀맵은 파란색이 압도적으로 많다

거의 모든 표면은 바깥쪽인 Z 축을 향해 있을 테니까 대응되는 blue 채널 색감이 더 많을 수밖에..

 

엥? 그럼 개념적으로 직관적인 로컬공간 노멀맵 안쓰고 왜 이렇게 어려운 탄젠트 노멀맵 써요?

 

기본적으로 메시 변형이 없는 돌이나 산 전봇대 등은 탄젠트 노멀맵 안써도 된다. 심지어 탄젠트 공간변환은 물체공간 노멀맵보다 비용이 비싸기까지 하다!

하지만 캐릭터 피부나 회전하는 물체 등은 런타임동안 노멀 방향이 수시로 변하는데, 물체 공간 노멀맵을 써버리면 이 노멀 방향을 매 프레임 새로 계산해야 한다.

 

하지만 만약 정점의 노멀을 기준으로 정보가 저장되어 있다면?? 노멀이 어떻게 지지고 볶아지든 그 상대값이 저장되어 있기 때문에 런타임동안 노멀방향이 변하더라도 문제없다.

 

이 외 저장할 데이터가 적다는 점, 다른 모델에 재사용 할 수 있다는 점 등 손해보다 이득이 많기 때문에 탄젠트 공간 노멀맵을 쓰면 컴퓨터가 행복해한다. (우리만 불행하면 된다. 탄젠트 공간 개념 배워야 하잖아..ㅠㅠ)

 

탄젠트 노말..왜 써야 하는지 이해가 되셨을까요?

 

 

 

 

 

 

 

 

 

 

'컴퓨터 그래픽스' 카테고리의 다른 글

내적과 외적의 활용  (0) 2020.06.12
화소당 비트수  (0) 2020.03.18
  • tex2D(sampler2D,TEXCOORD)
    • 버텍스 셰이더에서 전달받은 정점의 UV 좌표 (해당 정점이 텍스쳐의 어느 점을 그릴 것인지) 와 실제 텍스쳐를 이용해 해당 픽셀에 그려질 텍스쳐 색상값을 구하는 함수
    • 첫번째 인자는 텍스쳐 (=텍스쳐를 셰이더에서 쓰기 위해선 sampler 과정을 거친 sampler2D 자료형을 써야함), 두번째 인자는 정점의 UV 좌표이다.
    • 리턴 값으로는 float4 형태의 색상값을 받는다.
  • float
    • shader가 받아들일 자료형 중 가장 범위가 큼 (GPU별로 다르긴 하지만 32bit ~ 16bit로 할당됨)
  • half
    • float 값 범위의 1/2 
    • float 보다 덜 정밀한 값을 다룰 때 사용
  • fixed
    • 일반적으로 11bit 이며 범위는 -2.0 ~ 2.0
    • 간단한 컬러 작업 수행에 용이

외적 활용

  • 평면의 법선벡터(노멀)을 구할때 사용
    • 삼각형의 세점을 알고 있다고 하면 벡터 2개를 구할 수 있고 그 두 벡터의 외적을 구하면 이게 곧 평면의 노멀벡터가 됨

 

  • 적이 캐릭터의 왼쪽에 있는지 오른쪽에 있는지 판별할때
    • 월드 좌표계의 Up벡터, 캐릭터의 Forward방향 벡터를 F, 캐릭터에서 적방향으로의 벡터를 A라 하면 Up · (A × F) 값이 0보다 크면 캐릭터의 오른쪽, 0보다 작으면 왼쪽에 있음을 알 수 있다.

 

  • 벽에 부딪혀 미끄러지는 캐릭터의 방향을 계산할때

외적의 활용 1
외적의 활용 2

*위 설명은 오른손 좌표계 기준으로서, 왼손 좌표계를 채용하는 Unity에서는 외적의 방향이 반대이다*

 

[출저] RAPAPA DEV STORY

http://rapapa.net/?p=2974

 

'컴퓨터 그래픽스' 카테고리의 다른 글

Tangent Space (탄젠트 공간)  (0) 2020.12.30
화소당 비트수  (0) 2020.03.18

모니터에 색을 표현하기 위해선 먼저 화소에 색을 적용시켜야 한다.

그 화소들이 모여 모니터에 색을 뿌려주기 때문인데, 바로 이 화소에 몇가지의 색을 표현하냐에 따라 그림파일의 크기가 달라진다.

 

가령 frame plat(?)이 9개라고 가정하면 화소 하나가 표현할 수 있는 색의 가짓수는 2^9 개가 되는데 색상은 RGB의 조합으로 표현이 가능하므로, 각각 3 plat씩 할당한다면, R, G, B 각각 2^3 = 8가지 색상이 표현 가능하다.

 

그렇다면 우리가 익히 쓰고있는 RGB 값을 0~255로 표현하는 방법은 화소 하나당 몇비트를 할당받고 있는걸까?

2^8 = 256 이므로 256가지 색상이 표현가능. R하나를 표현하는데 8비트를 필요로 한다는 것이다. 나머지 G, B 도 합치면 R : 8bit, G : 8bit, B : 8bit 총 24bit가 화소 하나에 할당이 된다. (여기에 알파값 : 투명도 정보까지 포함한다면 32bit가 됨)

자 그렇다면 해상도가 얼마냐에 따라 해당 그림의 용량이 계산가능하다.

 

1024 x 768 해상도 : 1024 x 768 x 24bit = 18874368 bit = 2359296byte = 2.359MB

 

이렇다는 말은 해상도가 1 늘어나면 24bit씩 용량이 증가한다는 뜻이므로 그림파일은 최대한 용량을 아껴 써야 한다.

 

'컴퓨터 그래픽스' 카테고리의 다른 글

Tangent Space (탄젠트 공간)  (0) 2020.12.30
내적과 외적의 활용  (0) 2020.06.12

+ Recent posts