범프매핑 구현 –법선 맵 구하기높이 맵에서 법선 맵으로 변환하려면 약간의 계산이 필요하다.기본 원리는 구하고자 하는 UV좌표의 한칸씩 옆에 있는 높이값의 평균을 이용해 두개의 벡터를 만들고 그 벡트들의 외적을 구하는 것이다.D3DXComputeNormalMap() 사용하면 된다.
범프매핑 구현 –법선 맵 구하기델타 x , 델타 y는 바로 옆에 것을 사용하려면 1로 잡으면 된다.나온 높이값에 비율을 적용시키면 그 비율 만큼 더 밝고 어두운 부분이 강해지거나 약해진다.UV중 U를 X축으로 V를 Y축으로 법선을Z축으로 저장하고 있다. 그래서 파랗구나...
범프매핑 구현 –법선 맵 구하기위에 방법을 사용하면 탄젠트 공간을 기준으로 법선을 저장하였다라고 말한다.탄젠트 벡터가 X , 종법선 벡터가 Y , 법선 벡터가 Z 왜 그냥 평범하게 노말값을 계산해서 저장하지 않고 이런 변환을 통해서 탄젠트 공간 기준의 노말값을 저장하는 것일까?
범프매핑 구현 –법선 맵 구하기오브젝트 공간 법선 맵생성 방법 : 그냥 모델에서 뽑으면 된다.장점사용하기 쉽다. ( 그냥 계산 하면 된다. )단점움직이는 물체에 적용하기엔 부적절하다.( 연산이 너무 많아진다. )
26.
범프매핑 구현 –법선 맵 구하기탄젠트 공간 법선 맵생성 방법 : 위의 방법대로 뽑으면 된다.장점법선을 변환할 필요는 없다.단점카메라 , 버텍스등을 탄젠트 공간으로 변환해야 한다.
27.
범프매핑 구현 –법선 맵 구하기오브젝트 공간 법선 맵을 사용한다고 가정하면 캐릭터가 애니메이션이라도 하는 날에는 법선들을 애니메이션에 맞게 변환해 주어야 하는데텍스쳐에서 뽑은 값이기도 하고 텍셀마다 처리를 하기 때문에 픽셀 쉐이더가계산량이 너무 많아진다.탄젠트 공간 법선 맵을 쓰자.
28.
범프매핑 구현 –법선 맵 구하기미리 법선 맵을 생성하고 사용하는 것이 더 좋다.NVDIA에서 제공하는 Photoshop 플러그인 Normal Map Plugin등 법선 맵을 만들어 주는 처리가 많다.요즘 툴들이 좋아서 모델 만들 때 같이 뽑혀 나온다.
29.
범프매핑 구현 –법선 맵 적용법선 맵을 적용하는 방법은 적용하고자 하는 물체의 버텍스, 카메라 , 조명등 계산에 필요한 것들을 탄젠트 공간으로 변환하고 계산하면 된다.탄젠트 공간에 대해 다시 정리하면T : Tangent VectorB : Binormal VectorN : Normal Vector이 3개가 기저인 공간이다.
범프매핑 구현 –법선 맵 적용로컬 좌표계 에서 탄젠트 공간으로 변환X -> U , Y -> V로 변환되어야 한다.
32.
범프매핑 구현 –법선 맵 적용삼각형의 각 버텍스를P0 , P1 , P2로 생각하자.그리고 각각 버텍스의UV좌표를( u0 , v0 ) , ( u1 , v1 ) , ( u2 , v2 )로 생각하자.이 삼각형 안의 한 점을 Q로 보고 UV좌표를( u , v )로 생각하자.탄젠트 공간으로 변환해주는 행렬은 다음과 같다.이 행렬을 구해보자.
범프매핑 구현 –법선 맵 적용정점들의 T , B 벡터들의 평균을 이용해서 계산하면 직교하지 않을 수 있다.안전하게 그램 – 슈미트 방법으로 직교하는 기저를 만들어 준다.D3DXComputeTangent() 사용T′ = T − (N · T)NB′ = B − (N · B)N − (T′ · B)T′/T′2
참고자료Real Time Rendering2판DirectX9 쉐이더 프로그래밍http://allosha.tistory.com/category/3D%20그래픽스%20매니악스/법선맵(노말맵)http://www.gamasutra.com/view/feature/1515/messing_with_tangent_space.php?page=1http://www.terathon.com/code/tangent.htmlhttp://en.wikipedia.org/wiki/Gram-Schmidt