본문으로 바로가기

[DX12] 5. 렌더링 파이프라인

category Computer Science/DirectX 2024. 6. 6. 10:32

5.1 3차원으로 보이도록 하는 요소

인간이 2차원인 이미지를 보고 3차원 공간으로 느낄 수 있도록 해주는 요소로는 원근, 차폐, 음영, 그림자가 있다.

  • 원근: 멀리 있는 물체가 작아 보인다.
  • 차폐: 불투명 물체 뒤에 있는 물체는 불투명 물체에 가려진다.
  • 음영: 물체가 빛을 가하면 인해 입체감이 표현된다.
  • 그림자: 광원의 위치를 알 수 있으며 물체와 그림자의 간격을 통해 지면과의 거리를 인지하게 된다.

5.2 모형의 표현

컴퓨터 그래픽스에서는 3차원 물체를 데이터화하기 위해서 삼각형으로 구성된 메시를 사용한다. 삼각형을 사용하는 이유는 모든 3차원 구조를 근사할 수 있는 2차원 도형이기 때문이다. 일반적으로 3차원 모델 데이터는 3D 모델러 툴(Max, Blender 등)로 제작한다.

5.3 컴퓨터 색상의 기본 개념

모니터에서 픽셀을 표현할 때는 빨간색(R) 녹색(G) 파란색(B) 빛을 섞어서 방출한다. 그리고 각 색상은 0~1.0까지의 빛의 세기(Intensity)로 표현할 수 있다. 따라서 컴퓨터 그래픽스에서 색상을 표현할 때는 색상 벡터로 나타낼 수 있다.

색상 벡터에서는 일부 벡터 연산을 사용할 수 있다.

  • 벡터의 덧셈(뺄셈): 두 색상값을 더하거나 빼서 새로운 색상을 만든다.
  • 스칼라 곱셈(나눗셈): 색상 값에 스칼라 값을 곱하거나 나누어 전체적인 강도를 조정한다.
  • 성분별 곱셈: 각 성분별로 곱셈을 하는 것으로 조명 공식에서 주로 사용된다. 색상마다 반사율이 다를 때 유용하게 사용 가능하다.
  • 벡터의 내적과 외적: 색상 벡터에서 내적과 외적은 의미 없다.

5.4 렌더링 파이프라인의 개요

렌더링 파이프라인은 3차원 장면을 2차원 이미지로 생성하는데 필요한 일련의 단계를 뜻한다.

5.5 입력 조립기 단계

입력 조립기(Input Assembler, IA) 단계는 메모리에서 기하 자료(정점(Vertext) 색인(Index)) 정보를 읽어와서 기본 도형을 조립하는 단계.

5.5.1 정점(Vertex)

기하학에서 정점은 공간의 위치 뜻하는데, Direct3D에서는 위치 정보뿐만 아니라 해당 점의 법선벡터, 텍스처 좌표 정보 등도 포함된 데이터이다.

5.5.2 기본도형 위상구조

정점 데이터 에는 정점으로 어떤 도형(점, 선, 삼각형 등)을 만들지에 대한 정보는 없기 때문에 정점 자료를 이용해서 기하학적 기본도형을 형성하기 위해서는 Direct3D에 기본도형 위상구조를 설정해줘야 한다.

  • 인터페이스: ID3D12GraphicsCommandList::IASetPrimitiveTopology

생성 가능한 기본도형 구조는 D3D_PRIMITIVE_TOPOLOGY 열거형을 참고.

5.5.3 색인(Index)

정점으로 삼각형을 만들고, 삼각형으로 다각형 도형을 만들다 보면 중복되는 정점이 발생한다. 중복되는 정점을 제거하기 위해서 색인(Index)을 사용한다.

색인은 하나의 삼각형을 그리기 위해서 사용할 정점의 인덱스 정보이며, 색인 정보가 있기 때문에 하나의 정점은 여러 삼각형에 사용될 수 있다.

5.6 정점 셰이더 단계

정점 셰이더(Vertex shader)를 가장 원초적으로 정의하면 정점 하나를 입력받아서 정점 하나를 출력하는 함수이다. 정점 셰이더 함수의 내용은 프로그래머가 구현해서 GPU에 제출하며, GPU는 모든 정점에 대해 병렬로 정점 셰이더 연산을 수행한다.

정점 셰이더 단계에서는 월드 변환, 뷰변환, 투영 변환이 진행되며, 조명, 변위 매핑 등 수많은 특수 효과를 수행할 수 있다.

정점 셰이더 단계는 아래의 두 게시글을 참고.

5.7 테셀레이션 단계

테셀레이션은 주어진 메시의 삼각형들을 더 잘게 쪼개서 원래 메시에는 없는 세부적인 디테일을 만들어 낼 수 있다. 테셀레이션의 특징은 다음과 같다.

  • 카메라와 가까운 메시에 테셀레이션을 적용하는 방식으로 LOD를 조절할 수 있다.
  • 메모리에는 폴리곤수가 적은 메시를 저장하여 메모리를 절약할 수 있다.
  • 애니메이션이나 물리 처리 같은 연산에는 테셀레이션을 적용하지 않고 랜더링에만 테셀레이션을 적용하여 계산량을 줄일 수 있다.
  • (Direct11 이후부터) GPU에서 처리되기 때문에 빠르다.
  • 선택적으로 적용 여부를 설정할 수 있다.

5.8 기하 셰이더 단계

기하 셰이더는 기본도형을 입력받아서 그것을 임의로 변형할 수 있는 단계이다. 정점 셰이더는 입력받은 정점의 수와 출력되는 정점의 수가 동일하지만 기하 셰이더는 변경될 수 있다.

5.9 절단 단계

불필요한 연산을 줄이기 위해서 절두체 외부에 있는 기하구조를 예외처리하는 단계가 절단 단계이다. 절단 단계에서 하나의 다각형이 모두 예외처리 되어서 폐기될 수 있고, 절두체 경계에 걸친 다각형은 새로운 절단된 다각형을 형성한다. 절단 연산은 하드웨어가 수행된다.

5.10 래스터화 단계

래스터화기 단계는 투영된 삼각형으로부터 픽셀 색상을 계산하는 단계이다. 래스터화 단계에는 뷰포트 변환, 후면선별, 정점 특성의 보간 단계가 있다.

5.10.1 뷰포트 변환

절단 공간의 좌표에 원근 나누기를 수행하면 정규화된 장치 좌표(NDC)로 변환된다. NDC 공간에서 2차원 이미지를 형성하는 점들은 후면 버퍼의 한 직사각형 뷰포트 영역으로 변환된다.

뷰포트 변환을 마치게 되면 x, y 성분은 픽셀 단위의 값, z 성분은 깊이 버퍼링에 사용해야 하므로 유지한다.

5.10.2 후면 선발

3차원 장면에서 물체의 뒷면은 보이지 않는다. 렌더링에서 불필요한 연산을 줄이기 위해 물체의 뒷면에 해당하는 삼각형은 그리지 않는다. 후면을 구분하는 기준은 물체의 법선벡터의 방향이다.

5.10.3 정점 특성의 보간

각 정점의 정보(위치, 법선, 텍스처 좌표)를 정점이 이루는 삼각형 픽셀에 보간하는 단계. 투영된 물체를 선형 보간하게 되면 간격이 고르지 않는 문제가 발생하기 때문에 Direct3D에서 쓰이는 원근 보정 보간을 사용한다. 원근 보정 보간은 하드웨어에서 수행된다.

5.11 픽셀 셰이더 단계

픽셀 셰이더는 프로그래머가 작성하고 GPU가 실행하는 프로그램으로 각 픽셀 단편(Pixel fragment)에 대해 실행된다. 픽셀 셰이더는 보간된 정점 특성을 입력받아 하나의 색상을 출력한다.

5.12 출력 병합기 단계

픽셀 셰이더가 생성한 픽셀 단편을 입력받아 후면 버퍼에 기록하는 단계. 깊이 & 스텐실 판정을 진행하고, 혼합(blending) 단계도 진행된다.

 

 


출처:

한빛미디어 출판 <DirectX 12를 이용한 3D 게임 프로그래밍 입문>