그래픽스/DirectX12

[Directx12][5장]렌더링 파이프라인

우향우@ 2023. 3. 21. 21:32

기초 지식

1.렌더링

그래픽 프로그래밍에서 렌더링이란 점과 기하구조 등으로 표현된 3차원의 기하학적 데이터들을 특정 카메라를 기준으로 하여 그 카메라에 보이는 2차원 이미지를 그리는 것을 말한다.

우리가 실제로 2차원 이미지로 볼 때 다음과 같은 특성으로 3차원의 형태를 인식한다.

1.소실점

2.원근감

3.앞물체에 뒷물체가 가려짐

4.조명과 그림자

여기서 1과 2번은 원근 투영 변환으로 구현한다.

3번은 깊이 버퍼링으로, 4번은 각각의 조명,그림자 알고리즘등으로 구현한다.

2.메시

그래픽 프로그래밍에서는 3차원 물체를 삼각형 면들의 합으로 근사하여 표현한다. 이를 삼각형 메시라고 한다. 경우에 따라서는 특정 장면을 점이나 선으로 표현할 때도 있다.

3.색상

컴퓨덧셈터에서는 색상을 R,G,B 삼원색의 합으로 표현한다. 각 색을 적절한 세기로 혼합하여 방대한 색상을 표현할 수 있게 된다.

색상 연산

색상의 연산은 벡터의 연산과 마찬가지로 덧셈, 뺄셈등이 사용된다. 이때 색상의 범위(0~1 또는 0~255)를 넘어서는 안되게 제한 해주어야한다. 내적과 외적은 색상의 연산으로는 거의 사용되지 않는다.

ⓧ는 성분별 곱셈(또는 변조)라 불리며 다음과 같은 의미를 가진다.

(a1,a2,a3) ⓧ (b1,b2,b3) = (a1b1,a2b2,a3b3)

두 벡터의 각 항을 곱해 각 항에 넣는 연산이다.

DirectX 색상 타입

DirectX에서는 다음 두 타입으로 색상을 다룬다.

XMVECTOR: 128bit / 32bit x 4 / 0~1로 정규화 / VECTOR : (R,G,B,A)

XMCOLOR: 32bit / 8bit x 4 / 0~255로 정규화 / INT_32,INT_8공용체 : A8R8G8B8

XMVECTOR는 SIMD의 해택을 받지만 XMCOLOR는 그렇지 않기에 기존 벡터타입처럼 서로 적재,저장해가며 사용하면 된다.

렌더링 파이프라인

0.개요

렌더링 파이프라인은 3차원의 기하구조들과 카메라들을 계산하여 2차원 이미지에 그리는 일련의 과정이다. DirectX에서는 자원의 등록 및 서술을 마무리한 후 Draw명령을 실행하면 렌더링 파이프라인이 수행 되어 등록해둔 2d 텍스처에 완성된 2d 이미지가 그려진다.

렌더링 파이프라인의 단계들은 다음과 같다.

입력 조립기(LA)

정점 셰이더(VS)

ㅣ덮개 셰이더(HS)

테셀레이션 단계들 ㅣ테셀레이터

ㅣ영역 셰이더(DS)

기하셰이더(GS)

↓ → 스트림 출력(SO)

절단

래스터화

픽셀 셰이더(PS)

출력 병합기(OS)

필수적인 단계들은 다음과 같다.

입력 조립기(LA)

정점 셰이더(VS)

절단

래스터화

픽셀 셰이더(PS)

출력 병합기(OS)

1.입력 조립기

메모리에서 기하 자료들을 읽어 기본도형으로 조립하여 데이터들을 정리한 뒤 다음 단계로 넘겨준다.

특성만 잘 서술해주면 하드웨어에서 자동으로 진행해준다.

기하 자료들은 정점버퍼와 색인버퍼로 저장되있다.

정점버퍼 : 도형들을 구성하는 정점들의 목록

색인버퍼: 정점들이 어떻게 연결되어 점, 선 , 삼각형을 이루는지 정점버퍼의 색인들을 기본도형 위상구조에 맞추어 배치한 색인 목록

기본 도형 위상구조는 정점(색인)들의 나열을 특정한 구조로 해석하는 방법이다.

EX) 기본 도형 위상구조 중 삼각형 목록은 나열된 정점(색인)들을 3개 씩 나누어 하나의 삼각형으로 해석하는 방식이다.

2.정점 셰이더

정점 셰이더는 각 정점들 별로 호출되어 연산을 수행하는 셰이더이다.

기본적으로 해당 메시의 지역 좌표와 세계변환X시야변환X투영변환 행렬을 받아 둘을 곱해 동차절단공간의 좌표로 변환하여 넘겨주는 역할을 수행한다.

세계변환행렬 : 지역 좌표 -> 세계 좌표

시야변환: 세계 좌표 -> 시야 좌표 (카메라 기준의 직각좌표)

투영변환: 시야 좌표 -> 동차 절단 좌표 (w나누기(정규화)전의 투영 좌표)

이때 동차절단공간으로의 변환은 기하셰이더까지 역할을 미룰 수 있다.

3. 테셀레이션 단계들

테셀레이션 단계들에서는 삼각형을 다 작은 삼각형들로 나누는 기술을 사용하는 단계이다. 불필요할 시 생략 가능하다.

4. 기하셰이더

기하셰이더는 기본도형의 정점들과 특성을 입력으로 받아 기본도형마다 한번 씩 호출된다. 한 정점을 받아 한 정점을 출력해야하는 정점셰이더와 달리 기하셰이더는 기본도형의 추가 및 삭제(입력 도형에 대한)가 가능하다는 특징이 있다.

5. 절단

시야 절두체 안에 완전히 포함되지 않는 도형들은 아예 렌더링을 안하면 되지만 일부만 걸치는 도형들은 절단하여 새로운 형태로 만들어야한다. 그러한 도형들을 절단하여 새로운 정점들을 생성해 다시 구조를 잡아주는 역할을 수행하는 단계이다.

하드웨어에서 자동으로 진행해준다.

6. 래스터화

래스터화는 총 3개의 역할을 수행한다.

  1. 뷰포트 변환: 절단 후에 전달 된 정점들의 xy좌표를 뷰포트속 픽셀좌표로 변환한다. 만약 뷰포트에 깊이 min max제한이 있다면 깊이도 제한해준다.
  2. 후면 선별 : 외적을 이용하여 후면 삼각형들을 렌더링에서 제외한다.
  3. 보간: 정점들로 이루어진 기본도형을 채우는 픽셀들의 특성값들을 계산한다. 각 픽셀의 특성 값은 그 도형을 이루는 정점들의 특성들을 픽셀의 위치에 따라 보간 하여 계산한다. 이때 단순 삼각 산형 보간을 사용하면 투영과정에 일어난 비선형적 변환에 의해 특성값이 제대로 계산되지 않는다. 따라서 이를 고려한 원근 보정 보간이라고 하는 보간 방법을 사용하여 보간한다.

이는 하드웨어에서 자동으로 진행해준다.

보간을 수행하고 나면 그 픽셀의 특성을 담아 각 픽셀에 대해 픽셀셰이더가 호출된다.

7. 픽셀 셰이더

픽셀 셰이더는 래스터화 단계에서 계산된 특성을 입력으로하여 각 픽셀 단편에 대해 호출된다. 픽셀 셰이더는 그러한 특성과 추가 자원들을 계산하여 그 픽셀 단편의 색상을 출력한다.

여기서 픽셀 단편은 아직 깊이, 스텐실 판정이나 혼합등에 의해 변형되거나 다른 색상에 덮어 씌어질 가능성이 있으므로 최종적인 픽셀 생상은 아니기에 픽셀 대신 사용하는 단어이다.

8. 출력 병합기

출력 병합기 단계는 픽셀 셰이더로부터 픽셀 단편들을 넘겨받아 깊이, 스텐실 판정, 혼합등을 적용하여 최종적인 픽셀의 색상들을 결정하는 단계이다. 최종적인 픽셀의 색상이 결정되면 그에 따라 실제 텍스처 자원에 이미지를 그린다.

출력병합기 단계가 마무리되면 타켓 텍스처에 2d 이미지가 완성되며 렌더링 파이프라인이 마무리된다.

하드웨어에서 자동으로 진행해준다.

참고서적

DirectX 12를 이용한 3D 게임 프로그래밍 입문