게임 프로그래밍

[그래픽스] 렌더링 파이프라인

스스배 2023. 12. 30. 17:35

렌더링 파이프라인

 

매쉬가 가진 3D 정점 정보를 정해진 절차에 따라 2D 정보로 변환하여 모니터 화면에 출력하는 과정

 

DirectX11의 렌더링 파이프라인

 

 

전체 요약

더보기

첫번째, Input Assembler는 이 Render States로 들어온 vertex data들을 조립합니다.

이걸 Vertex Shader에 넘겨주면 버텍스 데이터를 바탕으로 연산 하고 위치를 조정합니다.

세번째 단계인 Tesselator는 폴리곤을 늘려주는 연산을 합니다.

Geometry Shader는 버텍스마다 특정한 연산을 통해서 폴리곤을 추가로 생성합니다. 여기까지 버텍스 연산을 완료하게 됩니다.

다음으로 Rasterizer는 3D공간을 2D공간으로 변환해주는 과정입니다. 그 아래 단계의 Perspective Transformation은 행렬 연산입니다.

Clipping은 화면에서 보이지 않는 오브젝트를 제거하고, Culling으로 다른 오브젝트에 가려져서 안보이는 오브젝트를 제거합니다.

Triangle Rasterization에서 실제 픽셀로 만들어주고, Depth Prepass에서 뎁스를 간단하게 계산합니다.

다음으로 Depth Test에서는 특정 오브젝트가 가려져서 안보이게 만들던지, 아니면 다른 물체 위로 올라와야 하는지 등의 오브젝트간 뎁스를 조정합니다.

Stencil Test는 스텐실 버퍼라는 값을 가지고 비교합니다. 예를들어, 값이 1일때 A를, 2일때 B를 보여줄지 등의 동작을 수행합니다. 일종의 커스텀 버퍼입니다. 그리지 않아도 될 오브젝트를 정리하는 과정입니다.

다음으로 Fragment Shader 또는 Pixel Shader 라고 불리는 단계인데요, 이 계산은 상당히 무겁습니다. 그래서 이전까지 그리지 않을 오브젝트들을 제거하고 정리해서 보이는 픽셀에만 프레그먼트 쉐이더 계산을 하게되죠.

다음으로 output merger입니다.

Alpha Test로 알파가 보이는 것인지 아닌지의 테스트를 하고 Alpha Blending에서 알파를 섞어서 어떻게 보이게 할지 결정합니다.

그리고 Anti — Aliasing에서 픽셀들을 부드럽게 해주는 처리 및 각종 포스트 프로세싱을 처리합니다.

이 과정이 모두 끝나면 마지막으로 Render Target인 back buffer에 해당 오브젝트를 그려줍니다.

back buffer에 한 프레임에서 그릴 모든 그리기 작업이 끝나면 back buffer를 front buffer로 전환하여 화면에 노출하게 됩니다.

요약하면 vertex 데이터를 쉐잎으로 만들고 도형화시킨 뒤 픽셀로 만들어서 색을 입히고 알파값을 적용해 나가는 과정이죠!

 

1. Input Assembler(입력 조립)

CPU에서 GPU에 데이터를 전달하는 단계

정점 데이터로 컬러, UV, 노말, 위치를 가지고 있으며 배열 형태로 GPU에 데이터를 전송해주고

GPU는 얻은 데이터를 아래와 같은 구조체 형태로 조립함

struct VS_IN
{
	float3		vPosition : POSITION;
	float3		vNormal : NORMAL;
	float4		vColor : COLOR;
};

 

해당 단계에서 프리미티브(기본 도형) 형태로 데이터를 조립한다고 해서 입력 조립 단계라고 부름

 

드로우 콜 = 배치(batch)

Draw Primitive Call (DP Call) 과 Render State를 합친 용어

 

DP Call: 도형과 같은 매쉬 그리기 요청 

Render State: 각 리소스의 렌더링 정보 . 쉐이더, 텍스쳐, 메시 와 같은 리소스가 GPU Memory의 어느 주소에 있는지, 알파 블렌딩이 꺼졌는지, z test가 켜졌는지 등

이중 매티리얼과 쉐이더에 관련된 상태와 명령들은 set pass call이라고 함

 

RenderState 이후 DP Call로 이어짐CPU가 GPU에게 Draw Call을 보낼 때 Command Buffer를 통해 보냄

 

배칭(batching) : 드로우콜을 줄일때 자주하는 작업인 매터리얼과 아틀라스를 묶어서 여러 메시를 하나의 드로우콜로 만들어주는 것

 

※ 다른 머티리얼 또는 쉐이더를 사용하면  set pass call이 발생함. set pass call CPU에 가해지는 비용이 큼

 

 

 

 

2. Vertex Shader (정점 쉐이더)

정점 데이터를 이용해 로컬->월드->뷰->투영 변화를 시행

 

2.1 월드 변환

각 로컬 스페이스 좌표로 지정된 매쉬를 월드 좌표를 기준으로 통합하는 과정

크기->자전->이동->공전->부모 행렬 변환 순으로 변화를 시행함

 

2.2 뷰 변환 (카메라 변환)

 

카메라를 원점으로 하며 카메라가 바라보는 방향이 +z가 되는 공간 

R(euler) = R(roll) * R(pitch) * R(yaw)

뷰 변환 행렬: 카메라 이동의 역행렬 * R(yaw)의 역행렬 * R(pitch)의 역행렬 * R(roll)의 역행렬 (DirectX)

뷰 변환 역행렬: 카메라의 월드 행렬

 

2.3 투영 단계

뷰 공간상의 좌표를 일정하게 정규화된 좌표계로 변경하는 작업

원근 나누기를 하기 전 동차 좌표계로 변경

 

NearPlane, FarPlane, FOV(Field of view)(시야각), 화면의 x와 y 스케일를 기준으로 변환 함

 

 

원근 투영

절두체를 이용해서 오브젝트가 카메라보다 멀 수록 스케일이 작아짐

 

직교 투영

정육면체를 이용해서 카메라의 거리와 상관없이 오브젝트의 크기를 같게 함

보통 UI에 많이 쓰임

 

3. Tesselation (생략 가능)

Tesselation 단계는 주어진 모델의 정점을 추가하거나 잘게 쪼개어 디테일하게 표현하는 단계

이는 LOD(Level of Detail)을 적용하여 여러 해상도로 표현 가능한 모델을 마련했는데, 그 모델들끼리의 변환이 부자연스러운 경우를 Tesselation으로 자연스럽게 표현

 

일반적으로 가까운 거리의 물체는 고해상도로, 먼 거리의 물체는 저해상도로 표현하여 성능을 향상시키는데, 고해상도로 표현되었을 때 보여져야 할 텍스쳐 형태를 높이 맵으로 저장해놓고 실제 모델에 필요한 만큼의 레벨만큼만 적용하는 식으로 테셀레이션을 활용하면 하나의 모델에 대해 여러 해상도의 모델 데이터를 가지고 있을 필요가 없다.

4. Geometry Shader(생략 가능)

기본 도형에서 정점을 추가하거나 삭제하여 모델을 변경할 수 있는 셰이더이다. Geometry Shader로 정점 정보를 조금 추가하여 표현할 수 있는 모델이라면 그만큼의 정점 정보를 빼고 저장할 수 있으니 디스크 용량과 그래픽 메모리 절약에 도움이 될 수도 있으며, 테셀레이션 등으로 추가된 정점들을 표현할 때도 사용된다.

 

예를 들어 1개의 포인트를 이용해 지오메트리 단계에서 4개의 버텍스를 만들어 텍스처 표현 

 

 

5. 레스터라이저(Rasterizer)

5.1 클리핑

절두체 바깥에 있는 도형들을 전부 잘라내는 과정

 

5.2 원근 분할

클립스페이스의 (x,y,z)를 w로 나눠 원근을 표현하는 단계, z나누기를 한다고도 부름

이 단계를 통해 NDC(normalized device coordinates) 공간으로 변함

 

5.3 후면 컬링

후면을 찾아내어 렌더링이 안되게 함

 

5.4 뷰포트 변환

(-1 ~ 1) 사이였던 X, Y 좌표를 화면 해상도 크기에 맞춰 변환 

아래 수식에 맞춰 변환 됨

X = (X + 1) * Viewport.Width * 0.5 + Viewport.TopLeftX

Y = (1 - Y) * Viewport.Height * 0.5 + Viewport.TopLeftY

Z = Viewport.MinDepth + Z * (Viewport.MaxDepth - Viewport.MinDepth)

 

5.5 스캔 변환

프리미티프(삼각형등 도형)을 이용해 프레그먼트를 생성하고 

프레그먼트를 채우는 픽셀을 생성한다.

각 픽셀마다 정점 데이터(위치, 노말, 색상) 등을 보간하여 할당

 

6. 픽셀 셰이더

- 픽셀별 데이터를 산출하는 단계

- 깊이 및 스텐실 테스트를 함 (알파 테스트)

- 텍스터를 매쉬에 샘플링 함

- 최대 32비트 4구성 (R,G,B,A) 요소를 픽셀 데이터로 출력 가능

- 알파 블랜딩시의 투명도를 정함

 

7. 출력 병합

렌더링 파이프 라인의 마지막 단계

 

파이프라인 상태, 픽셀 셰이더에서 생성된 픽셀 데이터, 렌더링 대상의 내용 및 깊이/스텐실 버퍼의 내용을 조합하여 최종 렌더링된 픽셀 색을 생성

  • Z-Test
  • Stencil Test
  • Alpha Blending

 

 


참고

 

https://maxlevel-trace.tistory.com/19

 

[DirectX11] 3D에서의 WVP변환과정. (렌더링파이프라인)

WVP변환이란? WVP변환은 컴퓨터그래픽스에서 최종적으로 2D모니터에 출력하기 위한 위치변환과정 중 하나이고, 그중에서 Clip Space로 변환하기위한 과정이다. (DirectX 기준) World 어떤 공허한 공간이

maxlevel-trace.tistory.com

https://learn.microsoft.com/ko-kr/windows/win32/direct3d11/d3d10-graphics-programming-guide-output-merger-stage

 

출력 병합기 단계 - Win32 apps

OM(출력 병합기) 단계는 파이프라인 상태, 픽셀 셰이더에서 생성된 픽셀 데이터, 렌더링 대상의 내용 및 깊이/스텐실 버퍼의 내용을 조합하여 최종 렌더링된 픽셀 색을 생성합니다.

learn.microsoft.com

https://rito15.github.io/posts/rendering-pipeline/

 

렌더링 파이프라인 간단 정리

렌더링 파이프라인 구조 요약(DirectX 9 기준)

rito15.github.io

https://medium.com/@thkim2/%EB%A0%8C%EB%8D%94%EB%A7%81-%ED%8C%8C%EC%9D%B4%ED%94%84%EB%9D%BC%EC%9D%B8%ED%95%9C%ED%85%8C-%EB%93%9C%EB%A1%9C%EC%9A%B0%EC%BD%9C-%ED%95%98%EA%B8%B0-1-drawcall-f1f694c73ba3

 

렌더링 파이프라인에게 드로우콜 하기 (1) : DrawCall

렌더링 파이프라인과 드로우콜에 대해 순차적으로 알아보는 시간을 가져보도록 하겠습니다.

medium.com

https://medium.com/@thkim2/%EB%A0%8C%EB%8D%94%EB%A7%81-%ED%8C%8C%EC%9D%B4%ED%94%84%EB%9D%BC%EC%9D%B8%EC%9D%84-%ED%86%B5%ED%95%B4-%EB%93%9C%EB%A1%9C%EC%9A%B0%EC%BD%9C-%ED%95%98%EA%B8%B0-2-rendering-pipeline-ec0cf6f4c4bc

 

렌더링 파이프라인에게 드로우콜 하기 (2) : Rendering Pipeline

이전 시간에는 드로우콜에 대해 알아보았습니다. 다음으로 렌더링 파이프라인에 대해 알아볼게요.

medium.com

https://velog.io/@cedongne/Graphics-%EB%A0%8C%EB%8D%94%EB%A7%81-%ED%8C%8C%EC%9D%B4%ED%94%84%EB%9D%BC%EC%9D%B8-%EC%9A%94%EC%95%BD

 

[Computer Graphics] 렌더링 파이프라인 요약

3차원으로 만들어진 모델을 2차원 픽셀 데이터로 변환하는 렌더링 과정인 렌더링 파이프라인(Rendering Pipeline)에 대해 알아보자.

velog.io

 

'게임 프로그래밍' 카테고리의 다른 글

[하드웨어] CPU와 GPU  (0) 2023.12.30
[3D] 사원수(쿼터니언)  (0) 2023.12.29
구와 평면의 충돌  (0) 2023.12.28
rapidjson 설치 방법  (0) 2023.03.22