[Unity] 그래픽-1. RP
Render Pipeline
개요
- 3D오브젝트를 2D화면에 렌더링하는 파이프라인
- 예시: 다렉X, OpenGL, Metal(IOS) 등
파이프라인 각 단계의 일반적 구분
- 입력 조립
- CPU: 각 정점 데이터 모으고 GPU로 던짐 + 3D 데이터의 포맷도 같이 던짐
- 정점 셰이더(버텍스 셰이더)
- GPU가 그걸 받아서 그려줌
- 래스터라이저
- 래스터라이징함
- 픽셀셰이더
- 색칠함. 아마 빛이라던가 그림자라던가 그런거 행렬 씌워서 나온 값인 듯.
- 출력 병합
- 픽셀 셰이더 합치는 거 같은데
GPU가 이 파이프라인을 독립적으로 빠르게 처리해준다고.
즉, 개별 단계가 추상메소드로 정의되고, 이를 구현하는 각 구체 메소드가 독립적으로 연결된 구조.
근데 그 구체 메소드를 ShaderGraph 등으로 재정의할 수 있다는 느낌인 듯하다.
Input Assembler - 입력 조립
CPU가 작업을 GPU에 Enqueue한다. elem은 드로우콜, queue를 커맨드 큐라고 함.
- GPU가 사전작업하는 동안 CPU가 enqueue 하면 GPU가 뒤늦게 작업시작. CPU가 GPU보다 빨라서 발생하는 병목을 이렇게 해결한다고.
- 메시 정보는 내부적으로 직렬화된 배열(정점 버퍼)로 전달됨.
- 이후 정점은 삼각형 등의 도형(Primitive)으로 조립됨.
Vertex Shader
- 3D상 정점을 클립 공간으로 옮기는 단계
- 공간 변환은 아래 세 가지 변환 행렬 연산 사용. 다 알려진 행렬이 있음.
- Model - model to world
- Translate, Rotate, Scale 변환. 다 행렬 4x4 씀. 이유가 있긴함.
- View - world to cam
- Projection - cam to 2D clip
- Model - model to world
Rasterizer
- 정점의 fragment 구성, 화면에 출력할 픽셀을 구성하는 단계
- 그래픽 하드웨어의 자체 알고리즘으로 동작하므로 이 부분은 코딩 못함. 고정 파이프라인 단계
- 이 과정에서 도형이 픽셀로 변환됨. 각 정점을 기준으로 보간됨.
Clipping
- 절두체 영역에 없는 도형을 처리. 잘라냄. 시야밖에 있는거임.
후면 컬링(Back-face culling)
- 렌더링이 되지 않은 도형의 후면을 제거. View와 도형의 Normal 간 내적(90도)을 계산하여 후면 확인.
뷰포트 변환
스캔 변환
- fragment를 채우는 픽셀을 찾는 단계. 픽셀마다 정점 데이터(위치, 색, 법선, UV)들을 보간하여 할당.
Fragment Shader
- 래스터라이저 단계에서 구한 픽셀에 rpga 적용 - 투명도, 조명, 그림자, 텍스쳐 색상
- 도형이 텍스쳐에 매핑된 정보를 기반으로 텍스쳐 적용.
- 베이스 맵, diffuse: UV맵 씌울 기본 텍스쳐
- 노멀 맵: 기울이기 등 노멀 벡터에 대한 추가 조치가 저장된 텍스쳐.
- 기울이기 적용시 노멀 벡터를 정확히 90도로 하지 않고 기울임.
- 빛의 반사를 해당 노멀 벡터에 대해 구현
- 노멀 벡터를 R, G, B의 (0..1, 0..1, 0..1)로 그린 것이 Normal Map.
- 위 벡터는 (X, Y, Z)를 따르는데 기본적으로 Normal은 (0, 0, 1) 이므로 푸른 색을 띄게 됨.
- 사실 노멀 벡터는 면이 아닌 정점에 있음. 인접한 면의 노멀 벡터의 평균이 보통임.
- 그래픽 디자이너가 정점 노멀 벡터 구하는 방법을 바꾸는 경우도 있긴 함.
- 메탈 맵, specular: 광택(밝기 amp) 적용에 대한 텍스쳐
- Occlusion 맵: 마스킹 처리. 흑
백(01) 기준으로다가 픽셀에 마스킹 처리한듯.
- 조명 및 그림자
- 도형이 텍스쳐에 매핑된 정보를 기반으로 텍스쳐 적용.
- 기본도형의 각 픽셀 마다 픽셀 셰이더 한번 호출
- 픽셀데이터를 계산하여 다음 단계로 전달
- 맵 지정의 여부는 Variant 로 처리됨.
- 베이스 맵만 있는거, 베이스 + 노멀 + 메탈 있는거 등 Variant임.
Output Merger
- 합침.
SRP / URP / HDRP / Built-in RP
- SRP - Scriptable
- 셰이더 그래프, 코딩으로 다르게 쓸 수 있는 RP
- URP - Univarsal
- SRP 지원. 가벼움
- HDRP - High def
- SRP 지원. 무거움. AAA게임 등에 사용
- Built-in
- RP 수정 못함. 안 씀.

![[Unity] 제네릭과 가변성(variance)](https://data.develog.develrocket.com/upload/develog/gmumdev/1791297148427-udtfz5/_____.png)