5.7 테셀레이션 단계들
테셀레이션은 주어진 메시의 삼각형들을 더 잘게 쪼개서(세분) 새로운 삼각형들을 만드는 과정을 말한다. 새 삼각형들을 새로운 위치로 이동함으로써 원래 메시에는 없는 세부적인 특징을 만들어 낼 수 있다.
테셀레이션에는 여러 가지 장점이 있다.
- 카메라에 가까운 삼각형들에는 테셀레이션을 적용해서 세부도를 높이고, 먼 삼각형들에는 테셀레이션을 적용하지 않는 방식의 세부수준(level of detail: LOD) 메커니즘을 구현할 수 있다. 관찰자가 실제로 볼 수 있는 부분에만 더 많은 삼각형을 사용하게 되므로 효율적이다.
- 메모리에는 저다각형(low-poly) 메시, 즉 적은 수의 삼각형들로 이루어진 메시를 담아두고 즉석에서 삼각형들을 추가함으로써 메모리를 절약할 수 있다.
- 애니메이션이나 물리 처리 같은 연산들을 단순한 저다각형 메시에 대해 수행하고, 테셀레이션된 고다각형 메시는 렌더링에만 사용함으로써 계산량을 줄일 수 있다.
Direct3D 11에서 새로 도입되었다. Direct3D 11이 제공하는 API를 이용하면 테셀레이션이 전적으로 하드웨어에서 일어난다. 테셀레이션 단계는 선택적이다.
5.8 기하 셰이더 단계
기하 셰이더 단계는 선택적이다. 제 12장부터 사용한다. 기하 셰이더는 하나의 온전한 기본도형을 입력받아서 그것을 임의로 변형한다. 기하 셰이더의 주된 장점은 기하구조를 GPU에서 생성하거나 파괴할 수 있다는 것이다. 예를 들어 입력 기하구조를 여러 개의 기하구조들로 확장할 수 있고, 조건에 따라 입력 기하구조를 폐기할 수도 있다. 이와는 달리 정점 셰이더는 정점을 생성하지 못한다. 정점 셰이더는 항상 정점 하나를 받아서 정점 하나를 출력한다. 기하 셰이더의 흔한 용도는 점이나 선분을 사각형으로 확장하는 것이다.
기하셰이더는 출력을 스트림 출력 단계를 통해 메모리의 버퍼에 저장해 두고 나중에 활용하는 것이 가능하다.
5.9 절단
시야 절두체 바깥에 있는 기하구조는 폐기해야 한다. 경계면과 교차하는 기하구조는 절두체 내부의 것만 남도록 잘라내야 한다. 이를 절단(clipping) 연산이라고 부른다.
다각형을 절두체로 절단하려면 먼저 다각형을 절두체의 여섯 평면 각각으로 절단해야 한다. 다각형을 하나의 평면으로 절단한다는 것은, 다각형 중 평면의 양의 반공간(half space)에 있는 부분을 남기고 음의 반공간에 있는 부분은 폐기하는 것을 뜻한다. 이러한 절단 연산은 하드웨어가 수행한다(서덜런드-호지먼 절단 알고리즘).
어떤 점이 절두체 안에 있는 경우, 원근 나누기 이후의 그 점의 NDC 좌표 (x/w, y/w, z/w, 1)은 다음 부등식들을 만족한다.
따라서 원근 나누기 이전의 동차 절단 공간에서 4차원 점(x, y, z, w)가 시야 절단체 안에 있으려면 다음 조건들을 만족해야 한다.
결론적으로, 시야 절두체 안의 점들은 다음과 같은 4차원 평면들로 이루어진 영역 안에 있다.
5.10 래스터화 단계
래스터화 단계의 주 임무는 투영된 3차원 삼각형으로부터 픽셀 색상들을 계산하는 것이다.
5.10.1 뷰포트 변환
절단을 마치고 나면 하드웨어는 원근 나누기를 수행해서 동차 절단 공간 좌표를 정규화된 장치 좌표(NDC)로 변환할 수 있다. 그리고 일단 정점들이 NDC 공간으로 들어오면, 2차원 이미지를 형성하는 점들의 2차원 x, y좌표성분들이 후면 버퍼의 한 직사각형 영역으로 변환된다. 그 직사각형 영역이 바로 뷰포트이다.
이러한 뷰포트 변환을 마치고 나면 x, y 성분은 픽셀 단위의 값이 된다. 일반적으로 뷰포트 변환 시 z 성분은 변경하지 않는다(깊이 버퍼링에 상요해야 하므로).
5.10.2 후면 선발
하나의 삼각형에는 면이 두 개 있다. 삼각형 정점들이 v0, v1, v2의 순서로 감긴다고 할 때, 삼각형의 법선 n은 다음과 같이 정의된다.
이 법선이 가리키는 방향이 삼각형의 앞쪽에 하당하고 전면이다. 그 반대 방향은 삼각형의 뒤쪽이며 후면이다.
전면은 정점들이 시계방향으로 감기고 후면은 반시계방향으로 감긴다. 이는 Direct3D의 관례이다.
물체를 구성하는 삼각형들의 법선이 항상 물체의 바깥쪽을 향하도록 물체의 모형을 만든다고 가정하자. 그러면 카메라에는 다면체의 후면 삼각형들이 보이지 않는다. 후면 삼각형들은 모두 전면 삼각형들에 가려지기 때문이다. 전면 삼각형들이 후면 삼각형들을 가리므로, 후면 삼각형들은 그릴 필요가 전혀 없다. 파이프라인에서 그러한 후면 삼각형을 골라서 폐기하는 공정을 후면 선별이라고 부른다. 이러면 처리할 삼각형이 거의 절반으로 줄어든다.
5.10.3 정점 특성의 보간
정점 자료는 위치 정보뿐만 아니라 색상이나 법선 벡터, 텍스처 좌표 같은 추가적인 특성을 붙일 수 있다. 뷰포트 변환을 거친 후에는 정점의 그러한 특성들을 삼각형을 덮는 각 픽셀에 대해 보간해야 한다. 또한 정점의 깊이 값도 그런 식으로 보간해서, 각 픽셀에 깊이 버퍼링 알고리즘을 위한 깊이 값을 부여해야 한다.
정점 특성들은 3차원 공간에서 삼각형의 면을 따라 선형으로 보간된다. 그런데 보간된 특성을 그대로 화면 공간에 사상하면 간격이 고르지 않다.
다행히 Direct 3D에 쓰이는 원근 보정 보간이라고 하는 보간 방법에는 그런 문제가 발생하지 않는다. 어쨌든, 이러한 정점 특성 보간 덕분에 삼각형 내부 픽셀들을 위한 값들을 정점에 부착된 값들로부터 계산할 수 있게 된다.
5.11 픽셀 셰이더 단계
픽셀 셰이더는 각각의 픽셀 단편(pixel fragment)에 대해 실행된다. 기본적으로 픽셀 셰이더는 보간된 정점 특성들을 입력받아서 하나의 색상을 출력한다. 픽셀 셰이더는 그냥 고정된 상수 색상을 돌려주는 아주 간단한 것에서부터 픽셀당 조명, 반사, 그림자 효과 등 좀 더 복잡한 작업을 수행하는 것에 이르기까지 다양하다.
5.12 출력 병합기 단계
픽셀 셰이더가 생성한 픽셀 단편들은 렌더링 파이프라인의 출력 병합기 단계로 입력된다. 기각(폐지)되지 않은 픽셀 단편들은 후면 버퍼에 기록된다. 혼합도 이 단계에서 일어난다.
'그래픽스 > DirectX 12' 카테고리의 다른 글
[DirectX 12 3D게임 입문] Chapter 7.9: Direct3D의 그리기 연산 제2부 - 연습문제 (0) | 2023.11.21 |
---|---|
[DirectX 12 3D게임 입문] Chapter 6.13: Direct3D의 그리기 연산 - 연습문제 (0) | 2023.11.16 |
[DirectX 12 3D게임 입문] Chapter 5.6: 렌더링 파이프라인 - 정점 셰이더 단계 (1) | 2023.11.13 |
[DirectX 12 3D게임 입문] Chapter 5.5: 렌더링 파이프라인 - 입력 조립기 단계 (1) | 2023.11.11 |
[DirectX 12 3D게임 입문] Chapter 4.4: Direct3D의 초기화 - 시간 측정과 애니메이션 (0) | 2023.11.08 |