노멀매핑이란..
노멀 매핑이란 많은 수의 정점을 가진 오브젝트(모델)의 법선 벡터들을 텍스쳐의 텍셀로 기록하여, 보다 낮은 수의 폴리곤 오브젝트(모델)에 매핑하여 조명 연산할 때 음영을 현재 모델보다 더 퀄리티(입체감) 있게 나타내기 위한 눈속임이라고 볼 수 있다.
노말값을 정점의 위를 향하게 해놨는데, 호출되는 픽셀쉐이더는 보간되는 노말값을 가져가니까 결국 어느 픽셀을 찍어도 같은 방향이다. 세기의 평균치가 똑같다.
그래서 빛이 들어오더라도 노말값의 평균이 같기 때문에 빛의 밝기가 똑같게 보인다.
즉, 평면 내에서는 디렉셔널라이트에 의한 빛의 차이가 없게 보인다.
그나마 반사광에 의한 차이가 있다.
반사광은 보는 사람이 어디있냐에 따라서 똑같이 튕겨도 밝게 보이는 지점과 밝게 보이지 않는 지점이 있기 때문이다.
노말맵을 사용하면, 정점이 제공해주는 노말값을 사용하는 것이 아니라 텍스쳐와 똑같이 생긴 노말맵 텍스쳐를 준비해서 그 노말맵 텍스쳐에서 텍스쳐를 추출할 지점과 같은 지점의 노말값을 추출하여 원래 노말이 아닌 노말맵에서 제공해주는 노말로 보이게 한다.
이를 이용해서 원래라면 평면인데 울퉁불퉁한 느낌을 낼 수 있다.
노말맵 방식 2가지 (우리는 2번째 방식을 사용한다)
같은 상황이더라도 노말맵의 좌표계가 다르면 이미지의 색상이 다르다.
색상만으로도 노말맵을 어떤 방식으로 사용했는지 비교할 수 있다.
1. 알록달록
2. 청록색?계열
둘의 차이점 ?
ex) 3D상에서 노말맵핑을 하는데 만약 캐릭터를 한다면?
캐릭테 옷에 들어있는 색상값이 노말값이어야한다
노말은 방향벡터이기 때문에 방향벡터 xyz 방향값을 색상으로써 rgb에 넣는다.
방향벡터를 노말로 전환한다고 하면 어떤 색이든 나올 수 있다.
방향벡터 xyz가 어느 방향이든 가리킬 수 있다. 이걸 색상으로 전환하면 무슨 색이 되더라도 이상하지 않다.
색상이 다양한색이 나와야 같다고 생각이 들 수 있다. (1번 방식처럼)
노말맵에 들어있는 색상 값이 실제 적용될 물체에 적용됐을 때의 방향이 그대로 들어가있다.
이 방식(1번 노말맵)엔 문제가 2가지 있다.
매쉬에 택스쳐를 입혀서 노말도 텍스쳐에 샘플해서 적용시키려하는데, 매쉬는 월드에 있는 오브젝트들이 사용한다
매쉬를 사용하는 오브젝트는 회전되어 있을 수도 있고, 크기를 늘렸다 줄였다 할 수도 있다. (위치는 상관x)
로컬스페이스에서 방향값을 기준으로 노말 텍스쳐의 방향값을 뽑아놨어야 노말을 적용시키고 나서 같이 회전을 시켜서 월드에 보낼 수 있다.
뷰스페이스면 매쉬를 오브젝트 혼자서 사용하고 모든 상태가 고정이 되어있어야한다(월드에 회전 x, 크기 늘렸다 줄였다 x) ==> 이는 말이 되지 않음..
오브젝트에 사용할 매쉬를 골랐으면, 오브젝트를 월드상에서 마음대로 움직이고 회전하고 할 수 있어야하기 때문에 색상 안에다 미리 방향을 정해둘 수 없다.
지금까지는 한 번 로컬에서 만들어 놓으면 로컬스페이스안에서 바뀔 일이 없기 때문에 로컬스페이스에 넣어놨어도 사용하는 매쉬들을 고정된 형태에서 사용했다.
하지만, 이젠 로컬스페이스에서도 형태가 바뀔 수 있다.
배치를 할 때 다른 형태로 배치를 할 수 있기 때문이다. (ex. 아이언맨 피규어를 원하는 모양으로 바꿔서 진열장에 배치)
로컬스페이스상에서 다른 형태로 계속 바뀌면 미리 텍스쳐상에서 준비해놨던 로컬스페이스상 기준에 노말맵이 의미가 없어진다. => 1번째 문제점
1번 노말맵을 사용하면 로컬상에서 변하는 거에 대응을 할 수 없다.
매쉬를 평면매쉬 기준으로 그려져 있는 노말맵이면, 다른 매쉬로 변경했을 때 적용이 되지 않는다. => 2번째 문제점
노말맵 텍스쳐상에 색깔만 봐도 고정된 노말이 들어있기 때문에 노말값이 로컬기준으로 어느 방향이든 될 수 있다.
2번 노말 텍스쳐도 들어있는 색상값은 고정이다.
하지만, 대응형이다. => 매쉬 형태가 달라져도 적용시킬 수 있다.
들어있는 값 자체가 아래처럼 표시된 곳의 기준의 노말값이 들어있는게 아니라, 자신만의 좌표계가 따로 있다.
=> 탄젠트 스페이스 (본인만의 고유 좌표계)
2번째 노말값은 탄젠스 스페이스 기준으로 노말값이 들어있다.
탄젠트 벡터는 접선 벡터여서 탄젠트 스페이스를 접선 스페이스라고 부르기도 한다.
(위로 향하는게 노말 (법선)
탄젠트가 접선
둘의 수직이 바이노말 종법선)
탄젠트 스페이스는 적용시키고 싶은 지점에 표면을 그리고 거기서 기울어진 방향, 접선마다 상대적인 좌표가 된다.
고정되어있는 rgb값이 있다 하더라도, 적용될 물체의 표면마다 계산을 해서 거기에 맞게 변형해서 가져다 쓴다.
즉, 표면은 상대적인 개념이다.
ex) 탄젠트 스페이스에서 좌표계가 (0, 0, 1)이 잡히면, 우리가 원래 사용하던 노말(정점에서 제공해주는 노말)이랑 똑같다는 의미이다.
(0, 0, 1)이 아니라 살짝 기울어져 있다면 거기서 살짝 기울어진 방향을 의미하게 된다.
적용되는 위치마다 자기만의 표면좌표계가 있다.
적용되는 위치를 원점이라 생각하고 거기서 법선으로 진행하는 방향을 x축이라고 보고 올라가는 방향을 z축으로 보고 바이노말 방향을 y축이라고 봤을 때의 좌표계를 넣어둔다는 얘기이다.
표면도 원래 정점이 보유하고 있던 노말, 탄젠트, 바이노말이 있을 것이다.
탄젠트 스페이스 상에 있는 방향값이 적용하는 표면으로 와서 방향을 알아야한다.
오브젝트 연산 시 로컬, 월드 좌표계로 변환하여 좌표계를 동기화 한 뒤 연산을 수행했던 것 처럼 노말맵에 담긴 Normal정보를 각 정점의 탄젠트 스페이스로 변환(동기화)해 주어야 제대로된 연산을 수행할 수 있다.
노멀맵을 각 정점의 탄젠트 공간으로 변환시키기 위해 탄젠트 행렬을 만들어 주어야 하는데 아래의 사진과 같다.
여기서 T는 Tangent, B는 Binormal, N은 Normal 이다.
'DirectX 11 3d' 카테고리의 다른 글
230512 MRT 출력 - Deferred MRT (0) | 2023.05.15 |
---|---|
230511 멀티랜더타겟(MRT) (0) | 2023.05.13 |
230509 skybox 개선 (스피어->큐브) (0) | 2023.05.11 |
230508 (0) | 2023.05.11 |
220504 (0) | 2023.05.10 |