본문 바로가기
면접 준비

[면접 준비][Graphics] 렌더링 파이프라인(Rendering Pipeline)

by 스테디코디스트 2023. 7. 23.
반응형

1. 렌더링 파이프라인

- 렌더링 파이프라인(Rendering Pipeline) 또는 그래픽스 렌더링 파이프라인(Graphics rendering pipeline)이라고 부름

- 3차원으로 만들어진 모델을 2차원에 투영하는 렌더링 과정의 프로세스를 자세하게 표현한 것

- 컴퓨터에 데이터로 존재하는 3D 리소스가 모니터에 출력되는 과정이 렌더링 파이프라인을 따름

2. 렌더링 파이프라인의 과정

- 첨부된 사진과 같은 과정에 따라 화면에 도형을 표시한다.

- 초록색은 필수적인 과정이고, 주황색은 사용자가 조작이 가능한 과정이다.

 

1) Input Assembler(입력 조립)

- 렌더링 파이프라인의 첫 단계, Vertex Specification 이라고도 불림

- 이 단계는 CPU에서 렌더링을 수행할 도형의 정점 정보들을 정점 버퍼라는 자료구조에 담아 GPU로 운반함

- GPU는 CPU의 자원에 직접 접근이 불가능하므로 CPU에서 정점 버퍼라고 부르는 메모리에 필요한 정보를 담아 GPU로 전달해준다.

- 정점 버퍼는 위치, 노말, 색상, uv 값들을 담고 있고, 이 값들은 구조체가 아닌 직렬화된 형태(배열)로 담겨 있다.

- GPU는 이러한 정점 버퍼를 전달받아 정점 데이터(구조체)로 조립한다.

- 조립하는 과정에서 삼각형과 같은 기본 도형(primitive, 이하 프리미티브)로 조립해주기 때문에 입력 조립 단계라고 한다.

- 이렇게 조립된 프리미티브가 정점 쉐이더(Vertex Shader)에 입력된다.

 

cf) GPU(Graphics Processing Unit)

- 그래픽 처리 장치

- 컴퓨터 시스템에서 그래픽 연산을 빠르게 처리하여 결과값을 모니터에 출력하는 연산 장치

- VPU(Visual Processing Unit) 라고도 함

- 현대의 GPU는 컴퓨터 그래픽과 영상 처리에 매우 효과적으로 사용되며, 고도의 병행 구조는 큰 덩어리의 영상 데이터가 병행 처리되는 알고리즘에 다용도 CPU보다 능률적임

- 그래픽과 관련된 연산을 할 때 CPU의 부담을 크게 줄일 수 있음

 

cf) CPU(Central Processing Unit)

- 중앙 처리 장치

- 컴퓨터 시스템을 통제하고 프로그램의 연산을 실행/처리하는 가장 핵심적인 컴퓨터의 제어 장치

- 외부에서 정보를 입력받고, 기억하고, 컴퓨터 프로그램의 명렁어를 해석하여 연산하고, 외부로 출력하는 역할을 함

- 컴퓨터 부품과 정보를 교환하면서 컴퓨터 시스템 전체를 제어하는 장치

- 기계어로 쓰인 컴퓨터의 명령어를 해석하여 실행함

 

2) Vertex Shader 

- Input Assembler 단계에서 정점 데이터(프리미티브)를 입력 받아 공간 좌표계를 변환해준다.

- 기본적으로 도형들이 가지는 공간인 Local Space 좌표를 모든 물체들이 하나의 공간에 위치하도록 World Space 좌표로 변환하고, 실제 플레이어가 바라보는 카메라가 중심이 되는 공간인 View Space로 변환한 뒤, 투영을 통해 투영 공간인 Clip Space로 변환한다.

 

<공간 변환 순서 정리>

오브젝트 공간 -> M -> 월드 공간 -> V -> 카메라 공간 -> P -> 클립 공간 -> Cliping -> NDC

 

<공간 변환 과정>

- 공간 변환은 각각의 행렬 연산을 통해 이루어짐

- 변환 행렬은 총 3가지 -> Model, View, Projection

- M, V, P는 각각의 변환 행렬 이름이며, 변환 자체를 가리킴

[1] M(Model)

오브젝트 공간 -> 월드 공간

Model Space(Object Space, Local Space) -> World Space

- 각 오브젝트 마다 자신의 피벗 위치를 원점(0,0,0)으로 하는 좌표공간을 가짐(local space)

- 게임 내의 월드는 단 하나의 위치를 원점으로 하는 좌표공간을 가짐(world space)

- 모델 변환은 각 오브젝트의 좌표 공간을 변환하여 하나의 월드 공간에 통합하는 과정

- 이 과정에서 이동(Translate), 회전(Rotate), 크기(Scale) 변환이 이루어짐

- 이 세가지 변환은 각각 행렬을 통해 수행되고 이를 하나의 행렬로 만든 것을 TRS 행렬이라고 함

- TRS 행렬은 이름과는 반대인 S행렬 x R행렬 x T행렬 의 순서로 되어있고, 벡터와 곱해질 때, 벡터를 우측에 두어 T부터 연산되게 만든다. (SxRxTxV = SxRx(TxV) = Sx(RxTV) = SxRTV = SRTV, 즉 연산이 수행되는 순서는 TRS 순서이다.)

- 만약 각각 따로 곱한다면 행렬을 좌측에두고 T,R,S의 순서로 곱한다.(VxT -> VTxR -> VTRxS -> VTRS)

 

[2] V(View)

월드 공간 -> 카메라 공간

Wordl Space -> View Space

- 카메라 공간은 카메라의 위치가 원점(0,0,0)이고 카메라가 바라보는 방향이 z축인 공간을 의미한다.

- 뷰 변환은 오브젝트를 화면에 그려내기 쉽도록 카메라를 기준으로 공간을 변환하는 과정이다.

 

[3] P(Projection)

카메라 공간 -> 클립 공간

View Space -> Clip Space

- 카메라 기준의 정점 위치를 화면에 보이기 위한 정점 위치로 변환한다.

- 화면에 렌더링 될 수 있는 영역을 나타내는 절두체(Frustum)가 정의되고 이 절두체는 Near Cliping Plane, Far Cliping Plane, Field of View를 통해 정의한다.

- 절두체를 완전히 벗어나는 폴리곤들은 모두 버려지고, 절두체의 경계에 걸쳐있는 폴리곤들은 일단 유지한다.

- 컬링(culling) : 절두체 영역 밖에 그릴 필요가 없는 물체들을 제거

- 클리핑(cliping) : NDC에 의해 절두체 영역에 걸쳐있는 부분을 제거

- 클립 공간(clip space) : 컬링, 클리핑을 통해 메쉬들을 잘라내어 최종적으로 카메라 시야에 보이는 메쉬들만 위치한 공간

- 원근감이 없는 직교 투영(Orthographic Projection)과 원근감이 있는 원근 투영(Perspective Projection)이 있다.

- 클립 공간의 좌표계는 사실상 3D가 아닌 4D이다.

- 클립 공간의 모든 X,Y 좌표는 (-1, 1) 범위에 존재하며, Z좌표는 (0, 1) 범위에 존재한다. (OpenGL에서는 Z좌표도 (-1, 1) 범위에서 존재한다고 한다.)

- W 값은 카메라에서 멀수록 커지며, 추후 NDC로의 변환에 사용된다.

- 클립 공간의 4D 좌표계를 동차 좌표계(Homogeneous Coordinates)라고 한다.

- 이러한 클립 공간의 x,y,z 좌표를 깊이 w로 나누어 3차원으로 변환하는 과정을 거쳐 모든 원근법이 구현되고, 이러한 원근 분할을 마친 좌표계인 NDC를 최종출력한다. [x,y,z,w] -> [x/w, y/w, z/w]

cf) 절두체

- 카메라가 볼 수 있는 공간의 부피를 정의함

- 시야각(Field of View), 가까운 평면(Near Cliping Plane), 먼 평면(Far Cliping Plane)에 의해 정의됨

- 절두체를 이용한 데이터의 제외 처리를 클리핑(Cliping)이라 부름

 

cf) NDC(Normal Device Coordinate)

- 정규 좌표

- 이 좌표계의 원점은 화면 정중앙에 위치함

- NDC를 사용하면 해상도에 따른 화면좌표 계산이 단순화됨(x좌표를 계산할 때 계산하는 과정을 줄일 수 있고, 해상도를 제외한값을 계산해두면 해상도가 변할 경우에도 쉽게 실제 화면 좌표를 계산할 수 있게 됨)

- 클립 공간 외부의 좌표를 잘라내고 4차원의 동차좌표계를 3차원으로 변환하여 생성

- 즉, 화면 해상도 차이에 빠르게 적응하기 위한 도구

 

3) Tesselation(생략 가능)

- 주어진 모델의 정점을 더 잘게 쪼개어 디테일한 표현을 할 때 사용

- 카메라와의 거리에 따라 디테일의 정도를 조절하는 세부 수준(LOD, Level Of Detail) 메커니즘을 구현하여 관찰자가 가깝게 보는 부분만 세부묘사가 들어가 더 많은 삼각형을 효율적으로 사용 가능

- 메모리에는 기본 다각형(Low-Poly) 메시를 담아두어 메모리를 절약하고, 필요할 때만 즉석으로 세분화하여 효율적으로 메모리를 관리할 수 있음

- 애니메이션이나 물리 처리와 같은 연산들은 Low-Poly 메시에서 수행하여 계산량을 줄이고, 렌더링에만 tesselation을 이용하여 렌더링을 품질을 올릴 수 있음

- DirectX11부터 도입 됨

 

4) Geometry Shader(생략 가능)

- Vertex Shader에서 생성되지 않은 임의의 정점을 추가하거나 삭제하여 모델을 수정할 수 있는 셰이더

- Vertex Shader에서 할 수 없는 점, 선, 삼각형 등의 도형을 생성할 수 있는 기능이 있음

- Tesselation이나 그림자 효과, 큐브 맵을 한번의 처리로 렌더링하는 데에 주로 사용

 

5) Rasterization

- 정점 정보를 완전히 결정한 3D 도형을 2D상에 표현하기위해 실제 픽셀 데이터(프래그먼트)로 변환해주는 단계

- 뷰포트 변환(Viewport Transformation)과 스캔 변환(Scan Transformation) 단계를 거친다.

 

[1] 뷰포트 변환(Viewport Transformation)

- 3차원의 NDC공간 상의 좌표를 2D 스크린 좌표로 변환

- (-1, 1) 범위였던 x,y 좌표를 화면 해상도 범위로 변환(좌측하단이 원점(0, 0)으로 변경)

- 2D 공간으로 변환하지만, 사실 z값은 깊이 값으로 사용하기 위해 그대로 유지함

 

[2] 스캔 변환(Scan Transformation)

- 프리미티브(삼각형 등의 기본 도형)를 통해 프래그먼트를 생성하고 프래그먼트를 채우는 픽셀들을 찾아냄

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

 

6) Pixel Shader(Fragment Shader)

- DirectX에서는 Pixel Shader, OpenGL, Unity에서는 Fragment Shader라고 부름

- 렌더링 될 각각의 픽셀들의 색을 계산

- Rasterizer가 전달한 프래그먼트 수인 모델이 화면에서 차지하는 픽셀의 개수만큼 실행됨

- 투명도 처리, 조명 처리, 그림자 처리, 텍스쳐에 색상을 입히는 것 모두 픽셀 셰이더의 역할임

- 셰이더를 통해 색상을 변화시키는 것은 모두 픽셀 셰이더의 역할이라고 볼 수 있음

- 픽셀 셰이더는 각 픽셀들의 색상과 깊이 값을 출력으로 전달

- 깊이 값은 Z-Buffer에, 색상 값은 Color-Buffer에 저장된다. (버퍼는 텍스쳐라고 생각하면 됨)

- 이러한 버퍼들을 통칭 스크린 버퍼(Screen Buffer)라고 부름

 

cf) 텍스쳐

- 컴퓨터 그래픽의 표면에 적용되는 비트맵 이미지

 

7) Output Merge(출력 병합)

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

- 알파 값(투명도)과 깊이 값 등을 통해 픽셀끼리 경쟁하여 색을 정하거나 합쳐 최종적으로 화면에 그려질 픽셀을 정함

- 픽셀들을 화면에 출력하기 위해 다음의 마지막 연산들을 수행한다. (Z-Test, Stencil Test, Alpha Blending)

- 각각의 픽셀 위치마다 여러 오브젝트의 픽셀이 겹쳐 있을 수 있음 -> 이러한 겹치는 픽셀들을 연산을 이용해 픽셀의 최종 색상을 판단

 

cf) 프레임 버퍼(Frame Buffer)

- 한 프레임의 스크린 버퍼들

- 구조

1) Color Buffer : 색상 값 텍스쳐

2) Z-Buffer : 깊이 값 텍스쳐

3) Stencil Buffer : 픽셀을 렌더링 또는 폐기하기 위한 마스크 텍스쳐

 


<면접 예시 답안>

Q. 렌더링 파이프라인이란 무엇인가요?

렌더링 파이프라인이란 3차원 상의 물체를 2차원의 컴퓨터 화면에 실제적으로 표현하기 위한 과정을 말합니다. 크게 Input Assembler -> Vertex Shader -> Rasterization -> Pixel Shader -> Output Merge의 과정을 거치게 됩니다. Input Assembler에서는 CPU가 물체의 정점들의 정보를 정점 버퍼로 변환하여 GPU로 넘겨주고 GPU는 받은 정점 버퍼를 정점 데이터로 조립하여 삼각형과 같은 기본 도형으로 만들어 준 뒤 Vertex Shader로 넘겨주게 됩니다. Vertex Shader에서는 정점 데이터를 토대로 공간 좌표계를 변환시키는데, Local Space에서 World Space, View Space, 최종적으로 투영공간인 Clip Space로 변환시킨 정점 데이터를 출력하여 넘겨줍니다. 다음으로는 Raterization 단계에서는 3D상에 표현된 물체를 2D상 좌표인 Screen Space로 변환하고, 물체를 픽셀로 분해해주는 과정입니다. 이후에 Pixel Shader에서는 렌더링 될 각각의 픽셀에 입힐 색상들을 계산하여 최종적으로 Output Merge 단계에서 화면에 그려질 픽셀을 정해 색상을 입혀 화면에 출력하게 됩니다.


<참고 자료>

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

 

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

 

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

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

rito15.github.io

https://dlgnlfus.tistory.com/135

 

2장 - 렌더링 파이프라인

렌더링 파이프라인은 3D 세계에 대한 기하학적 표현과 이 세계를 바라보는 관점을 정의하는 가상 카메라를 이용해 2D 이미지를 만들어내는 역할을 담당한다.왼쪽의 3D 세계에 배치된 물체와 카메

dlgnlfus.tistory.com

https://velog.io/@seok9403/%EA%B7%B8%EB%9E%98%ED%94%BD%EC%8A%A4-%ED%8C%8C%EC%9D%B4%ED%94%84%EB%9D%BC%EC%9D%B8

 

그래픽스 파이프라인

오브젝트를 화면에 표현하기 위한 일련의 작업들화면에 색을 칠하는 프로그램. 원래 그림자(shading) 계산목적이였다.단순하고 병렬적으로 계산가능한 작업들을 gpu에서 계산할 수 있었는데 이를

velog.io