-
23. 법선 매핑 (Normal Mapping)과 그림자 매핑 (Shadow Mapping)Software/DirectX 2024. 5. 24. 10:55728x90
Table of Contents
1. 법선 매핑(Normal mapping)
2. 그림자 매핑(Shadow mapping)
2.1 직교 투영(Orthographic projection)
2.2 알고리즘
2.3 편향과 앨리어싱(Bias and Aliasing)
2.4 비율 근접 필터링(PCF)1. 법선 매핑(Normal mapping)
- 텍스쳐의 질감에 따른 빛 변화를 표현하기 위해 텍스쳐와 같은 크기의 법선 정보를 지닌 법선 맵(normal map)을 활용하는 매핑이다.
- 각 텍셀에 RGB자료가 아닌 압축된 x,y,z 좌표성분들이 담겨 있고 이 좌표 성분들로 정규화된 법선 벡터를 정의한다.
- photoshop 등에서 메시로 부터 법선 맵을 만들어주는 도구를 제공한다.
- 텍스쳐 좌표의 u방향을 T, v방향을 B, 법선방향을 N으로한 TBN기저를 정점마다 계산해야한다.
- 계산된 TBN기저를 세계 공간으로 옮겨서 빛과 법선이 같은 좌표계에 있게 한 후 빛색상을 계산한다.
2. 그림자 매핑(Shadow mapping)
- 그림자 매핑은 3차원 공간 상에서 생기는 그림자를 모방하는 알고리즘이다.
- 그림자 매핑을 하는 데 있어서 필요한 첫 번째 작업은 광원의 시점에서 본 장면의 깊이 값들을 버퍼에 기록하는 것이다.
- 그림자 매핑에 사용되는 깊이 스탠실 버퍼를 그림자 맵(shadow map)이라고 부른다.
- 그림자 맵의 해상도가 높을수록 그림자의 품질이 올라가지만 연산량과 메모리가 늘어난다.
- 그림자 맵을 셰이더의 한 입력으로 두어서 그림자 적용 알고리즘을 구현해 그림자를 표현한다.
2.1. 직교 투영(Orthographic projection)
- 직교 투영(정사영)은 투영한 결과 값이 투영하기 전과 같은 투영 방식을 말한다.
- 그림자 매핑에서 평행광이 만들어 내는 그림자를 본뜰 때에 이 직교 투영이 필요하다.
- 직교 투영은 전적으로 선형이다. 원근 나누기(w성분)이 없다.
- 직교 투영 행렬을 곱하면 바로 NDC좌표가 나온다. 원근 투영처럼 원근 나누기가 필요없다.
- 광원의 시점에서 투영 할 때 절두체 바깥에 있는 기하구조에는 텍스쳐를 입힐 필요가 없다.
- 직교 투영 행렬에서 W값을 1로 놓으면 원근나누기가 그대로 이므로 직교투영행렬로 사용할 수 있다.
- 따라서 하나의 셰이더 프로그램으로 원근투영과 직교투영 모두에 사용할 수 있게 되지만 직교 투영시 불필요한 나누기가 수행된다.
2.2. 알고리즘
- 그림자 매핑 알고리즘의 핵심은 광원의 시점에서 본 장면 깊이를 텍스쳐 대상 렌더링 기법을 이용해 깊이 버퍼에 기록하는 것이다.
- 이 깊이 버퍼를 그림자 맵이라고 부른다.
- 장면 깊이를 렌더링 하고 나면 그림자 맵에는 광원 시점에서 본 모든 픽셀들의 깊이 값이 담기게 된다.
- 그림자 맵이 완성되면 카메라 시점에서 렌더링 하되, 각 픽셀p 계산에서 광원과 픽셀 사이의 거리 d를 먼저 계산한다.
- 카메라 시점에서 픽셀을 렌더링 할 때, 해당 픽셀을 지나는 물체의 광원과의 거리를 비교해서 해당 물체보다 깊이가 낮은 물체가 있으면 그림자 안에 있는 것으로 판정한다.
2.3. 편향과 앨리어싱(Bias and Aliasing)
- 그림자 맵의 해상도는 유한하기 때문에 광원 시점에서 본 장면 깊이의 이산적 표본화(Discrete sampling)라고 볼수 있다.
- 따라서 그림자 여드름(shadow acne)라고 불리는 앨리어싱 문제가 발생한다.
- 일정한 편향치(Bias)를 그림자 맵 깊이들에 더해서 깊이 값들을 일괄적으로 이동시키면 계단현상이 완화된다.
- 편향치를 너무 크게 잡으면 그림자와 물체가 분리되는 피터 팬 효과(Peter-panning)이 발생한다.
- 광원 방향을 기준으로 삼각형의 기울기가 클수록 편향치도 커야 하기 때문에 모든 기하구조에 대해 다른 편향치를 적용해야 한다.
- 다각형마다 광원에 대한 다각형의 기울기를 을아내서 기울기에 비례하는 기울기 비례 편향치(slope-scaled-bias)를 구해야한다.
2.4. 비율 근접 필터링(PCF)
- 투영 텍스쳐 좌표가 그림자맵의 한 텍셀과 정확하게 일치하지 않는 문제가 발생한다. 색상 텍스쳐에서는 겹선형 보간으로 해결한다.
- 그림자 맵에서는 겹선형 보간으로 해결할 수 없다(깊이 값들의 평균을 내면 픽셀이 그림자 안에 있는지 잘못판정 될 수 있기 때문)
- 마찬가지 이유로 그림자 맵에서는 밉맵도 생성할 수 없다
- 깊이 값들이 아닌 판정 결과들을 보간해서 이를 해결할 수 있다. 이를 비율 근접 필터링(Percentage closer filtering)이라고 한다.
728x90'Software > DirectX' 카테고리의 다른 글
25. D3D 프레임워크 만들기 (0) 2024.05.24 24. 애니메이션 ( Animation ) (0) 2024.05.24 22. 입방체 매핑 ( Cube Mapping ) (0) 2024.05.24 21. 인스턴싱 (Instancing)과 절두체 선별 (Frustum Culling) (0) 2024.05.24 20. 1인칭 카메라 (0) 2024.05.24