Search

렌더링 파이프라인

Class
그래픽
Type
최적화
Created
2023/12/26 11:20
updated
2024/07/01 02:46
날짜

렌더링 파이프라인

렌더링 파이프라인이란 3D 장면을 최종 2D 이미지로 변환하는 일련의 과정을 말합니다.
렌더링 파이프라인을 정의하는 말이 많지만, 위 부분이 핵심입니다. 다른 부분들이 오히려 혼란을 초래하므로, 위 정의를 중심으로 렌더링 파이프라인의 개념을 이해하는 것이 바람직합니다.
렌더링 파이프 라인을 왜 알아야 하는가?
렌더링 파이프라인의 과정을 이해하는 것은 다음과 같은 이유로 중요합니다:
1.
성능 최적화 : 렌더링 파이프라인의 각 단계를 이해함으로써, 어떤 부분이 성능 병목 현상을 일으키는지 파악하고, 성능을 최적화할 수 있습니다.
a.
이 부분은 프로파일러로 분석할 수 있을 뿐만 아니라, 그 부분이 왜 문제를 일으키는지를 더 잘 이해하게 도와줍니다. 예를 들어, 3D UI가 설정된 한 UI가 업데이트될 때, 해당 UI를 그리는 캔버스의 다른 부분들도 업데이트될 수 있습니다. 이럴 때, CPU와 GPU에서 오버헤드가 발생하는 이유를 알 수 있고, 어떻게 해결해야 할지 고민할 수 있습니다.
2.
비주얼 퀄리티 향상 : 렌더링 파이프라인의 각 단계를 조절하여 최종 이미지의 품질을 높일 수 있습니다.
3.
문제 해결 : 렌더링 과정에서 발생하는 문제를 파악하고 해결하는 데 필수적입니다.
a.
사실, 클라이언트 프로그래머에게 이 부분은 가장 중요하다고 생각합니다. 어떤 문제가 발생하면, 그 문제를 셰이더 코드로 해결할 수 있는지, 포스트 프로세싱을 사용해야 하는지 등 렌더링 파이프라인에 대해 잘 이해하고 있다면 TA와 소통하며 문제를 해결할 수 있습니다.
4.
기술적 이해 : 게임 엔진이나 그래픽스 API의 작동 방식을 이해함으로써, 더 효율적이고 창의적인 방식으로 그래픽스 기능을 활용할 수 있습니다.
5.
새로운 기술 적용: 최신 그래픽스 기술과 트렌드를 이해하고, 자신의 프로젝트에 적용할 수 있습니다.
렌더링 파이프 라인의 주요 단계 5 + 1
랜더링 파이프라인의 주요 단계는 기본적으로 5단계이며, 마지막에는 결과물에 효과를 추가하는 1단계가 있습니다. 이를 아래와 같이 정리하였습니다.
1.
애플리케이션 단계(Application Stage) : 게임 또는 애플리케이션 로직이 처리되며, 사용자의 입력, 애니메이션, 물리 시뮬레이션 등이 이루어집니다.
2.
지오메트리 단계(Geometry Stage) : 3D 모델의 버텍스 데이터 처리, 모델 변환, 조명 계산 등이 수행됩니다.
3.
버텍스 쉐이딩 단계(Vertex Shading) : 각 버텍스에 대한 추가적인 처리가 수행되며, 3D 좌표를 2D 화면 좌표로 변환합니다.
4.
래스터화(Rasterization) : 3D 좌표계의 버텍스들을 2D 화면에 매핑하고, 픽셀로 변환하는 과정입니다.
5.
프래그먼트 쉐이딩 단계(Fragment Shading) : 각 픽셀(또는 프래그먼트)의 색상과 텍스처를 결정합니다.
1.
포스트 프로세싱 (Post-Processing) : 이미지에 다양한 시각적 효과를 적용합니다.

애플리케이션 단계(Application Stage)

주로 활용하는 프로세서 : CPU
애플리케이션 단계에서는 모든 로직이 실행됩니다.
키보드, 마우스 입력, 게임 로직(행동, 이벤트) 실행, 물리 시뮬레이션, 애니메이션 업데이트(상태, 위치 등)
모든 로직이 완료된 후에는 다음 그림을 그리는 단계로 이동합니다.
(위치, 스케일, 회전 등이 여기서 결정됩니다.)
최적화 방법 : 불필요한 연산 줄이기, 멀티스레딩 사용, 오브젝트 풀링 등

지오메트리 단계(Geometry Stage)

주로 활용하는 프로세서 : GPU
지오메트리 단계는 유니티 렌더링 파이프라인에서 3D 모델의 기하학적 데이터를 처리하는 단계입니다.
이 단계에서 수행되는 주요 작업은 다음과 같습니다.
1.
모델 변환 : 3D 모델의 각 버텍스(꼭짓점)를 로컬 좌표계에서 월드 좌표계로 변환합니다. 이는 오브젝트의 위치, 회전, 스케일을 고려한 변환이 포함됩니다.
아래의 버텍스 쉐이딩 단계는 현재 이 부분에서 진행됩니다. 즉, 지오메트리 단계의 일부입니다.
1.
LOD(Level Of Detail) 처리 : 거리에 따라 다른 디테일의 메시를 사용하여 성능을 최적화합니다. (정확하게는 이 부분은 애플리케이션 단계에서 이루어져 LOD처리된 버텍스를 표시합니다.)
2.
백페이스 컬링 : 카메라에서 보이지 않는 면(백페이스)을 제거함으로써 렌더링 성능을 향상시킵니다.
최적화 방법 : 메시 최적화, LOD 사용

버텍스 쉐이딩 단계(Vertex Shading)

주로 활용하는 프로세서 : GPU
버텍스 쉐이딩 단계는 GPU를 사용하여 각 버텍스(꼭짓점)에 대한 처리가 이루어집니다.
버텍스 쉐이딩 단계의 주요 작업은 다음과 같습니다.
1.
버텍스 위치의 최종 결정 : 버텍스 쉐이더는 각 버텍스의 위치를 3D 월드 좌표계에서 2D 화면 좌표계로 변환합니다.
2.
뷰 변환 : 카메라의 시점을 기준으로 씬을 재조정하는 과정입니다.
a.
뷰 변환은 카메라를 움직이지 않고 씬을 카메라의 위치와 회전 값에 맞게 재조정합니다. 이것은 수학적으로, 카메라의 정보를 기반으로 재조정하는 것이 더 편리하기 때문입니다.
여기서 볼 수 있듯이, 각 카메라는 모든 씬의 오브젝트를 조정하는 과정을 거칩니다. 즉, 카메라가 하나 더 추가되면, 그 카메라가 비추어야 하는 모든 오브젝트(레이어 설정)에 대한 재조정 과정이 필요하게 됩니다.
3.
클리핑 : 화면에 보이지 않는 부분을 잘라내어 처리해야 할 데이터를 줄입니다.
a.
뷰 변환과 프로젝션 변환 사이에 클리핑을 넣은 것은 그 과정이 뷰 변환과 프로젝션 변환 사이에서 처리되기 때문입니다.
4.
프로젝션 변환 : 3D 씬을 2D 화면에 맞게 투영하는 과정입니다. 이는 원근감(perspective)이나 직교(orthographic) 투영을 통해 이루어집니다.
5.
조명 및 기타 효과 계산 : 버텍스에 대한 조명 계산(예: 광원에서의 거리와 각도에 따른 조명 효과)이 이 단계에서 수행될 수 있습니다. 또한, 버텍스 색상, 텍스처 좌표 등 기타 시각적 효과에 대한 데이터도 계산됩니다.
6.
퍼 버텍스 데이터 전달 : 계산된 버텍스 데이터는 후속 단계인 프래그먼트 쉐이딩 단계로 전달됩니다. 이 데이터에는 버텍스의 최종 위치, 노멀 벡터, 텍스처 좌표, 색상 등이 포함될 수 있습니다.
최적화 방법 : 간소화된 쉐이더 사용, 버텍스 수 최소화

래스터화(Rasterization)

주로 활용하는 프로세서 : GPU
위에서 진행한, 2D 화면상에 투영된 3D 모델의 버텍스를 2D 이미지로 변환하는 매우 중요한 과정입니다.
이 부분은 개인적으로 점잇기 책과 똑같다고 생각합니다.
버텍스(점)을 이어 선을 만든 곳에 그 부분을 색칠하는 것이 바로 래스터화입니다.
이 단계는 주로 GPU에서 수행되며, 다음과 같은 주요 작업들을 포함합니다.
1.
2D 화면상에 투영된 3D 모델의 버텍스를 2D 픽셀로 변 환 : 레스터화 과정에서는 버텍스 쉐이딩 단계에서 계산된 버텍스의 2D 화면 좌표를 사용하여, 각 버텍스를 구성하는 선분이나 면을 화면의 픽셀로 변환합니다. 이 과정에서 3D 모델의 각 면이 화면상의 픽셀로 어떻게 매핑될지 결정됩니다.
(이 부분이 래스터화의 주요 단계입니다.)
2.
픽셀 채우기(Filling Pixels) : 변환된 버텍스들을 기반으로, 각 픽셀의 위치가 결정됩니다. 이때, 선분이나 삼각형 등의 기하학적 형태를 구성하는 내부 픽셀들이 채워집니다.
3.
깊이 테스트(Depth Testing) : 레스터화 단계에서는 깊이 버퍼(또는 Z-버퍼)를 사용하여 픽셀의 깊이 값을 계산합니다. 이를 통해 어떤 픽셀이 다른 픽셀에 의해 가려지는지 결정되며, 결과적으로 화면에 보이는 부분과 보이지 않는 부분이 구분됩니다.
4.
다른 테스트 수행 : 스텐실 테스트, 알파 테스트와 같은 다양한 테스트를 수행하여 특정 픽셀의 렌더링 여부를 결정할 수 있습니다.
세부적으로 설명하자면, 2D 픽셀로 변환하는 과정이 있습니다. 하지만 아래의 내용보다 위의 래스터화 과정이 더 중요하다고 생각합니다.
1.
삼각형 설정(Triangle Setup) : 렌더링할 각 삼각형의 버텍스 정보를 활용하여 삼각형의 위치, 크기, 방향을 결정합니다. 이 과정에서 삼각형이 화면에 어떻게 투영될지 계산합니다.
2.
에지 워킹(Edge Walking) : 삼각형의 에지를 따라 이동하면서, 삼각형 내부에 포함되는 픽셀을 결정합니다. 이 단계는 삼각형을 구성하는 픽셀의 경계를 식별하는 데 사용됩니다.
3.
스캔라인 변환(Scanline Conversion): 에지 워킹을 통해 결정된 경계 내부의 각 스캔라인(수평 라인)을 따라 이동하며, 삼각형에 속하는 픽셀을 식별합니다. 이 과정에서 각 픽셀에 대한 색상, 광도, 텍스처 좌표 등의 추가 데이터를 계산할 수 있습니다.
최적화 방법: 픽셀 오버드로우 최소화

프래그먼트 쉐이딩 단계(Fragment Shading)

주로 활용하는 프로세서 : GPU
이 단계에서는 화면에 표시될 각 픽셀(또는 프래그먼트)의 최종 색상과 텍스처를 결정합니다.
이 단계의 주요 작업은 다음과 같습니다.
1.
텍스처 매핑 : 프래그먼트 쉐이더는 3D 모델에 텍스처를 매핑하여 표면에 디테일을 추가합니다. 이 과정은 텍스처 좌표와 텍스처 이미지를 사용하여 각 픽셀에 적절한 텍스처 색상을 적용하는 것을 포함합니다.
2.
조명 효과 계산 : 버텍스 쉐이딩 단계에서 계산된 조명 정보(예: 노멀 벡터, 빛의 강도)를 기반으로 실제 픽셀의 조명 효과를 계산합니다. 이는 Phong 쉐이딩 같은 기법을 사용하여 더 정교한 조명 효과를 생성하는 데 사용될 수 있습니다.
3.
색상 및 기타 시각적 효과 처리 : 프래그먼트 쉐이더는 픽셀의 최종 색상을 결정하며, 이 과정에서 색상 보간, 그림자 효과, 반사, 광택 등의 추가적인 시각적 효과가 적용될 수 있습니다.
4.
안티앨리어싱 처리 : 픽셀 간 경계에서 발생하는 계단 현상을 줄이기 위해 안티앨리어싱 처리가 이루어질 수 있습니다.
일반적으로 프래그먼트 쉐이딩 단계는 위와 같이 작성되지만, TA분의 HLSL 작성 방식에 따라 다르게 동작할 수 있습니다. EX) 조명 효과에 따라서 텍스쳐를 다르게 적용할 수 도 있습니다.
최적화 방법 : 텍스처 및 쉐이더 최적화

포스트 프로세싱 (Post-Processing)

주로 활용하는 프로세서 : GPU
렌더링 파이프라인의 마지막 단계 중 하나로, 이미 랜더링된 이미지에 추가적인 시각적 효과를 적용하는 과정입니다.
이 단계는 게임이나 애플리케이션의 시각적 품질을 크게 향상시킬 수 있으며, 다음과 같은 주요 작업을 포함합니다.
1.
색상 보정(Color Grading) : 이미지의 색상 밸런스를 조정하여, 특정 분위기나 스타일을 만들어냅니다. 예를 들어, 더 따뜻한 색조 또는 차가운 색조를 부여할 수 있습니다.
2.
블룸(Bloom) : 밝은 영역에서 빛이 주변으로 퍼지는 효과를 만듭니다. 이는 빛나는 물체나 광원이 실제처럼 보이게 하는 데 도움이 됩니다.
3.
안티앨리어싱(Anti-Aliasing) : 이미지의 계단 현상을 줄여 더 부드러운 경계선을 만듭니다. MSAA(Multi-Sample Anti-Aliasing) 같은 기법이 여기에 사용될 수 있습니다.
4.
심도 흐림(Depth of Field) : 특정 거리에 있는 객체를 포커스하고 나머지는 흐리게 처리하여, 카메라 렌즈와 유사한 효과를 생성합니다.
5.
모션 블러(Motion Blur) : 빠르게 움직이는 객체나 카메라 움직임에 따른 블러 효과를 추가하여, 움직임의 느낌을 강조합니다.
6.
HDR(High Dynamic Range) 톤 매핑 : 높은 동적 범위의 이미지를 화면에서 표시 가능한 범위로 조정합니다. 이는 이미지의 명암을 보다 자연스럽게 표현하는 데 도움이 됩니다.
7.
바이네트(Vignette) : 이미지의 가장자리를 어둡게 처리하여 중앙에 초점을 맞춥니다.
8.
그림자 및 하이라이트 처리: 이미지의 그림자와 하이라이트 부분을 별도로 조절하여 대비를 강조하거나 세부 정보를 더 잘 드러내게 합니다.
최적화 방법: 필요한 효과만 사용, 효과의 품질 조절