정의는 매우 간단하다.
폴리곤 표면 각각을 기준으로 하는 별도의 3축 (xyz 축) 공간
이미 탄젠트 공간에 대한 개념이 있는 사람만 이해할 수 있는 정의이다. (이게 무슨 정의냐?)
어떤 개념이든 당위성을 알고 있어야 이해가 쉽듯, 우리는 저 탄젠트 공간이 왜 필요한지부터 짚고 넘어가보자
3D 물체의 울퉁불퉁한 질감표현을 위해 노멀맵을 쓴다는 것은 아마 다들 알고 있을 것이다.
(노멀맵이 뭐지? 하시는 분은 이 포스팅을 먼저 읽기보다 노멀맵에 대한 다른 포스팅을 먼저 읽으신 후 보길 권장한다)
이 노멀맵은 각 픽셀이 어떤 노멀을 가지는지를 텍스쳐로 저장한 데이터고, 우리는 픽셀 셰이더에서 이 노멀과 빛 방향과의 내적을 통해 라이팅 연산을 수행한다.
바로 이 부분에서 의문점 한가지가 발생한다.
벡터와 벡터끼리 계산을 위해선 공간을 맞춰줘야 한다.
빛 방향이 만약 월드 공간 기준이라면 노멀 방향도 월드 공간이어야만 한다는 것이다 (제대로 된 연산결과를 위해)
문제는 우리가 노멀맵이라고 익히 알고 있는 것들은 모두 '탄젠트 공간' 을 기준으로 저장되어 있다는 것이다.
(뭔가 파란색이 많이 보이고 중간중간 빨간색도 섞인듯 안섞인듯 한 바로 그 텍스쳐 있자나요?!)
그럼 선택지는
1. 탄젠트 공간상의 노멀을 빛방향이 존재하는 공간으로 보내든지,
2. 빛방향의 공간을 탄젠트 공간으로 보내든지
중 하나일 것이다.
첫번째 방법은 각 픽셀마다 이 변환을 해줘야 하는데 (픽셀 셰이더에서 수행), 이건 부담이 크다.
두번째 방법은 버텍스 셰이더에서 빛방향을 탄젠트 공간으로 변환해 주면 되기 때문에 픽셀 셰이더에서 연산하는 것보다 연산량이 절약된다.
퍼포먼스를 위해선 사실 선택의 여지가 없이 두번째 방법을 써야 한다(이 외 TBN 전치행렬을 이용한 연산이득도 포함이다)
이제 탄젠트 공간이 왜 필요한지 이해가 가는가?
정리하자면, 노멀 텍스쳐가 이미 탄젠트 공간을 기준으로 저장되어 있기 때문에 연산을 위해선 필수불가결한 것
좋다. 텍스쳐가 탄젠트 공간 기준으로 되어 있다는데 그럼 뭐 당연히 탄젠트 공간 필요하겠네
아 근데 다른 공간도 많은데 왜 탄젠트 공간이라는 걸로 저장하는거야?
물론 다른 방법도 있다. 바로 물체 기준으로 노멀 정보를 저장하는 것 (이것이 개념적으로 좀 더 명확하다, 직관적이다)
실제로 노멀맵 텍스쳐의 타입은 두가지로 나뉘는데
왼쪽 노멀들은 신발의 로컬 공간 기준으로 저장한 반면
오른쪽은 각각의 표면 공간을 기준으로 저장한다.
로컬 공간 기준?? 표면 공간 기준??
아랫 줄 이미지 2개는 각 정점별로 노멀 정보 및 좌표계를 표현한 것이다.
노멀 정보는 회색선으로 표시되었고, 빨간색, 파란색, 녹색은 좌표계 xyz 축을 표시한 것이다.
왼쪽을 보면 각 정점마다 좌표계가 모두 동일하고, 노멀인 회색선만 방향이 다르다.
이 말인 즉슨 모든 노멀 정보는 이 신발 공간 기준으로 설정되어 있다는 것.
그래서 이 회색 선인 노멀값 범위는 -1.0 ~ 1.0 일 것이고 이를 텍스쳐로 저장하면 위 중간 이미지처럼 휘황찬란한 색감의 텍스쳐가 보이는 것이다.
오른쪽이 이제 문제의 탄젠트 공간 노멀맵인데, 자세히 보면 각 정점마다 좌표계가 모두 다름을 발견 할 수 있다.
(각 정점별로 녹색, 파란색, 빨간색 선의 방향이 다 다르다.)
이 좌표계는 정점의 노멀이 Z 축인 정점별 고유의 좌표계이고 이 좌표계 기준으로 노멀 정보를 저장한 것을 탄젠트 공간 노멀맵 이라고 부르는 것이다.
이런 이유로 탄젠트 공간 노멀맵은 파란색이 압도적으로 많다
거의 모든 표면은 바깥쪽인 Z 축을 향해 있을 테니까 대응되는 blue 채널 색감이 더 많을 수밖에..
엥? 그럼 개념적으로 직관적인 로컬공간 노멀맵 안쓰고 왜 이렇게 어려운 탄젠트 노멀맵 써요?
기본적으로 메시 변형이 없는 돌이나 산 전봇대 등은 탄젠트 노멀맵 안써도 된다. 심지어 탄젠트 공간변환은 물체공간 노멀맵보다 비용이 비싸기까지 하다!
하지만 캐릭터 피부나 회전하는 물체 등은 런타임동안 노멀 방향이 수시로 변하는데, 물체 공간 노멀맵을 써버리면 이 노멀 방향을 매 프레임 새로 계산해야 한다.
하지만 만약 정점의 노멀을 기준으로 정보가 저장되어 있다면?? 노멀이 어떻게 지지고 볶아지든 그 상대값이 저장되어 있기 때문에 런타임동안 노멀방향이 변하더라도 문제없다.
이 외 저장할 데이터가 적다는 점, 다른 모델에 재사용 할 수 있다는 점 등 손해보다 이득이 많기 때문에 탄젠트 공간 노멀맵을 쓰면 컴퓨터가 행복해한다. (우리만 불행하면 된다. 탄젠트 공간 개념 배워야 하잖아..ㅠㅠ)
탄젠트 노말..왜 써야 하는지 이해가 되셨을까요?
'컴퓨터 그래픽스' 카테고리의 다른 글
내적과 외적의 활용 (0) | 2020.06.12 |
---|---|
화소당 비트수 (0) | 2020.03.18 |