곱 순서
Scaleing : 크기
Rotation X,Y,Z : 자전
Translation : 이동
D3DXMatrixRotationAxis(공전)
Parent : 부모행렬 ( 다른 사물에 종속되어있다면, 그 사물이 움직일 때 동일한 연산을 한다.
자식한테 물려줄때는 스케일링은 포함시키지 않는다.
뷰의 위치에서(카메라의 위치에서) 정점으로 향하는 방향과 반사각의 cos값을 구해야한다.
카메라의 위치를 따로 안넘기고 카메라의 트랜스폼의 뷰의 역행렬을 넘겨준다.
노말맵 : 울퉁불퉁하게 보이려고하는거. 법선벡터들(버텍스든 픽셸이든) 조절해서 흉내낸다.
대부분의 노말맵은 푸른빛을 많의 띈다. rgb중 빛값이 높기 때문.
r,g,b 중 세번째인 b값이 높다는건데 벡터는 x,y,z로 표시한다. 즉 서로 세번째 값이 매칭되고
z값이 높다.라는건데 법선벡터방향이 z랑 매칭된다.
이 매핑은 탄젠트 공간상의 법선을 노멀맵에 저장한다. 탄젠트 공간이란 normal이 항상 z축이 되는 공간이다.
좀 더 쉽게 설명하면 폴리곤마다 다른 x,y,z축을 가지고있다고 생각하면 된다.
z 축의 양의 방향이 항상 표면의 바깥쪽을 향하는 공간을 말합니다.
z축이 물체의 깊이를 나타내는 월드공간과 분명히 다른 표면마다 정의 된 공간입니다.
월드 공간에서 접선공간으로 변환하는 행렬을 3가지 벡터를 합쳐서 만들 수 있습니다.
먼저 z축은 항상 바깥쪽을 향하는 정점의 법선(Normal)과 같습니다.
x 축 그림에서 u나 v는 표면을 달리는 축이므로 텍스처의 uv좌표 중 u나 v 중에 하나로 정해서 이걸 접선(Tangent)로 삼으면 됩니다.
접선공간의 축은 직교행렬이여야 하므로 나머지 한 축은 모든 축과 직교여야 합니다.
이 축을 구하는 건 벡터의 외적을 이용하면 쉽습니다. 법선과 접선을 외적해 마지막 한 축인 종법선(Binormal)을 구해줍니다.
나머지 tangent축과 bionormal축은 언제나 normal과 수직이며, tangent와 biornaml끼리는 수직일 필요가 없다.
결국 tangent와 binormal은 같은 평면 위에 존재하는 축이다.
우리는 법선을 기준으로 x축값과 y축값이 필요하다.
접선 (Tangent) : X
종법선 (Bionormal) : Y
노멀맵으로 구해야한다. 노멀맵에서 X값이 높은부분은 벡터가 왼쪽으로 많이 기울어진 부분.
초록빛이 많이 띄는거는 Y값이 많이 가리키는 곳이다.
첫번째 해야할것. 접선과 종법선을 구해야함. 하나만 구하면 나머진 외적하면 됨.
접선의 기준은 텍스쳐 UV기준으로 구해야한다.
메쉬 생성 -> 탄젠트생성 (T,N,값 구함) -> 픽셀셰이더에서 T,N 외적해서 B값 구함.
T,B,N이랑 노말맵의 RGB값 곱하고 정규화.
즉, 결국 노말맵의 RGB값을 통해 벡터를 구하는거다. 가상의 법선벡터.
종법선과 접선을 구해서 이 좌표체계에 맞게 변환을 시킨다음 노멀값 적용.
이 과정을 먼저 한 후에 디퓨즈값 계산이랑 정반사값 계산.
========================================================================
법선맵이 항상 파란 이유
파란색이면 b 채널을 얘기한다. 이것은 법선의 z이고 z의 방향은 표면의 바깥쪽 방향이다.
따라서 z값이 최소한 0보다 크다는 얘기이다. 그럼 z 값의 범위가 0 ~ 1이라는 얘기이고 이것을 텍스쳐에 저장하면
0.5 ~ 1이 되므로 어느 픽셀을 뽑던 간에 파란색이 최소한 절반은 들어가 있다는 얘기이다.
========================================================================
기타 조명기법.
블린-퐁(Blinn-Phong): 퐁과 거의 비슷한 기법. 현재도 많이 사용함
오렌-네이어(Oren-Nayar): 표면의 거친 정도를 고려한 난 반사광 조명기법
쿡-토런스(Cook-Torrance): 표면의 거친 정도를 고려한 정 반사광 조명기법
구면조화 조명기법(spherical harmonics lighting): 오프라인에서 간접광을 사전 처리한 뒤, 실시간에서 이를 주변광으로 적용할 때 사용할 수 있음