[D3DX] Vertex Normal
라이팅을 계산하는 방법에는 크게 두가지가 있는데
하나는 면(폴리곤) 마다 하나씩 NormalVector(법선벡터) 를 할당해줘서 면단위로 라이팅을 계산하는 방법과
또 하나는 정점(버텍스)마다 하나씩 NormalVector 를 할당해줘서 버텍스 단위로 라이팅을 계산하는 방법이다.
전자를 사용하면 명암이 폴리곤 단위로 입혀지므로 뚝뚝 끊겨있다는 느낌을 받을것이다
반면에 후자를 사용하면 DirectX 내부적으로 버텍스 사이에 보간을 해서(추측임) 라이팅이 부드럽게 나오도록 할 것이다.
CreateTeapt 같은 곡면이 있는 메쉬를 화면에 그려보면 라이팅(Diffuse)이 폴리곤의 경계를 구분할수 없을 정도로 아주 부드럽게 들어가있다는 것을 발견할 수 있다.
그럼 버텍스 마다 법선벡터를 어떻게 정의해야할까?
A라는 버텍스가 있다고할때, 이 A 버텍스를 공유하는 이 폴리곤들 각각의 법선벡터를 구한후 평균값을 버텍스 A의 법선벡터로 정하면 된다.(이 버텍스를 공유하고있는 폴리곤은 1개 일수도있고 2개일수도있고. 100개가 될수도있다.)
그렇다면 버텍스 마다 자신을 공유하고있는 폴리곤들을 어떻게 관리하지.?
버텍스당 매핑되는 polygons 라는 배열변수를 선언해서 폴리곤들의 인덱스값을 넣어놓는다든가 해서 초기에 한번 계산하고 메모리에서 해제해 버리는 방법을 생각하고있다(어차피 법선벡터는 한번 계산되어진후에는 다시 계산될 필요가없으므로)
=====================================================================================================
여기까지가 퍼온글인데 법선벡터가 다시 계산되어질 필요가 없다는건 잘못된 말이다
예를들어 삼각형 모양의 빗변 법선벡터는 스케일이 일어나는경우 법선의 방향이 빗변과 틀려지는 경우가
생기기때문에 법선 계산이 다시 이루어져야 한다
'수학 (Mathematics) > 3D수학' 카테고리의 다른 글
직교투영 확대 축소 (0) | 2012.11.02 |
---|---|
폴리곤중간의 텍스처 좌표 구하기 (0) | 2012.11.02 |
Directx Aspect 비율 (0) | 2012.11.02 |
회전행렬에서 회전축'회전각의 분리(angular displacement) (0) | 2012.11.02 |
d3dx9math.h 함수가 하는 일 설명 (0) | 2012.11.02 |