5.3.2 128 비트 색상
R G B A 각각 32bit씩 부동소수점 표현 가능
XMVector 형식으로 색상을 표현할 수 있고 색상 연산을 수행할 때 SIMD의 혜택을 받을 수 있음
5.3.3 32 비트 색상
XMCOLOR 구조체는 32bit 색상을 표현한다.
32 bit인 XMCOLOR 는 ARGB 배치를 사용한다.
XMVECTOR를 XMCOLOR로 변환하는 함수 : XMStoreColor
XMCOLOR를 XMVECTOR로 변환하는 함수 : XMLoadColor
128비트 색상은 정밀도가 높은 색상 연산이 필요한 곳(픽셀 셰이더)에 쓰인다.
128비트 색상은 유효자릿수가 많아서 산술 정밀도가 높아 산술오차가 과도하게 누적되는 일이 없다.
최종적으로 모니터에 출력되는 픽셀 색상은 후면 버퍼에 32비트 색상으로 저장된다.
5.4 렌더링 파이프라인
5.5 입력 조립기 단계 (IA 단계)
정점
정점은 공간적 위치 정보(x, y, z) 외에도 조명을 위한 법선 벡터 정보, 텍스처를 위한 텍스처 좌표를 동시에 포함할 수 있다.
mCommandList->IASetVertexBuffers // 정점 버퍼뷰 set 명령을 명령 목록에 추가
기본도형 위상구조
점, 점 목록, 선 목록, 선 띠, 삼각형 목록, 삼각형 띠
인접성 정보를 가진 기본도형 ( 삼각형 목록을 만들 때 옆에 붙어있는
N(1~ 32)개의 제어진 패치 목록 (정점 자료를 N개의 제어점들로 이루어진 패치 목록으로 해석해야 함)
책의 예제에서는 대부분 삼각형 목록을 사용한다.
mCommandList->IASetPrimitiveTopology // 위상구조 set 명령을 명령 목록에 추가
색인
정점의 순서를 인덱스들의 배열로 저장하여 도형을 그리는 방법을 정의
mCommandList->IASetIndexBuffer // 인덱스 버퍼뷰 set 명령을 명령 목록에 추가
5.6 정점 셰이더 단계
정점 하나를 받아서 정점 하나를 출력하는 함수
world transform, view transform, 투영 변환 진행됨
시야 변환은 카메라 위치를 원점으로 하는 local 좌표계로 변환을 해야 하기 때문에 카메라 local 좌표계를 world 좌표계로 변환하는 행렬의 역행렬을 사용한다.
투영 변환은 카메라(화면)의 종횡비 r, 수직 시야각 α, 가까운 평면 거리(투영되는 창) n, 먼 평면 거리 f를 이용하여
카메라 기준 좌표를 동차 절단 공간(homogeneous space) 으로 변환한다.
동차 나누기 (xyzw를 w 값으로 나눈 이후)에는 NDC(정규화된 장치 좌표)가 된다.
5.7 테셀레이션 단계
기하구조를 테셀레이션하기 전에 정점 셰이더에서 애니메이션이나 물리 계산을 낮은 주파수에서 수행할 수 있다.
Direct3D 11에서 새로 도입된 단계, 필요하지 않으면 생략할 수 있는 단계
기하구조를 GPU에서 테셀레이션하는 수단을 제공한다.
주어진 메시의 삼각형들을 더 잘게 쪼개서 새로운 삼각형들을 만드는 과정이다.
테셀레이션 단계는 내부적으로 3단계로 구성된다.
1. 덮개 셰이더 단계 (hull shader)
ㄴ 상수 덮개 셰이더 : 입력 조립기 단계에서 삼각형들 대신에 제어점 패치를 입력받고, 패치마다 상수 덮개 셰이더가 실행되는데, 테셀레이션 계수들을 출력한다.
ㄴ 제어점 덮개 셰이더 : 제어점마다 호출되며 제어점의 수를 늘릴 수 있다. (곡면을 제어하는 점을 만들 수 있다.)
2. 테셀레이터 단계 (tessellator)
ㄴ 하드웨어가 테셀레이션 계수를 덮개셰이더에서 얻은 테셀레이션 계수 기반으로 새로운 정점(매개변수 좌표 (u,v))을 만듬
3. 영역 셰이더 단계 (Domain shader)
ㄴ 제어점 덮개 셰이더의 출력 패치 제어점, 테셀레이터가 반환하는 매개변수 좌표,
ㄴ 테셀레이터가 출력한 정점들에 대해서 정점의 실제위치를 설정하고 동차 절단 공간으로 변환
ㄴ 제어점을 이용해서 베지에 곡면을 구성하는 곡면위의 정점 위치를 계산할 수 있다.
5.8 기하 셰이더 단계
생략 가능한 단계, 테셀레이션 단계를 사용하는 경우 생략할 수 없다.
기본도형을 입력받아 GPU에서 새로운 기하구조들로 확장하거나 폐기할 수 있다.
기하 셰이더의 출력을 메모리의 버퍼에 저장해 두고 나중에 활용하는 것이 가능하다.
5.9 절단
하드웨어가 시야 절두체 바깥에 있는 기하구조를 Clipping 해주는 작업
5.10 래스터화 단계
1. 뷰포트 변환
원근 나누기가 수행되어 정점들이 NDC 공간 좌표계가 되면
정규화된 x, y 값이 후면 버퍼의 크기에 비례하여 변환됨.(픽셀 단위가 된다)
2. 후면 선별
삼각형을 구성하는 정점들의 감기는 방향이 시계 반대 방향인 삼각형을 폐기한다.
3. 정점 특성의 보간
원근 보정 보간.. ?
5.11 픽셀 셰이더 단계
뷰포트 변환에 의해 만들어진 픽셀 단편 (=중간 픽셀: 모든 기하구조의 앞면을 포함)
픽셀 단편들의 색상을 결정하는 셰이더 단계
각 픽셀에 대해 단순 고정 상수 색깔을 돌려줄 수도 있고, 조명, 반사, 그림자효과들에 의해 계산된 색상을 줄 수도 있다.
5.12 출력 병합기 단계
픽셀 단편들 중 z 성분에 의한 깊이 판정이나 스텐실 판정에 의해 기각되는 픽셀 단편을 제외하고 나머지 픽셀 단편들은 후면 버퍼에 기록된다.
혼합도 여기서 일어난다. (새 픽셀이 후면 버퍼의 기존 픽셀을 완전히 덮어쓰는 것이 아니라 두 픽셀을 일정한 공식에 따라 섞은 결과를 기록하는 것, 반투명 같은 특수 효과를 내는 데 쓰인다.)
'읽은 책 > DirectX 12를 이용한 3D 게임 프로그래밍 입문' 카테고리의 다른 글
7. Direct3D의 그리기 연산 제2부 (0) | 2022.06.17 |
---|---|
6. Direct3D의 그리기 연산 (0) | 2022.06.16 |
4. Direct3D의 초기화(2) (0) | 2022.06.13 |
4. Direct3D의 초기화(1) (0) | 2022.06.13 |
3. 변환 (0) | 2022.06.12 |