Unity/Shader

렌더링 파이프라인 정리

ljw4104 2021. 10. 5. 16:52

Rendering Pipeline

1. 정의 : Object를 화면에 표현하기 위한 작업들
2. 순서 :
그래픽스 API 초기화 → DrawCall 생성
→ 정점 조립→Vertex Shader→래스터라이저→Fragment Shader
→ 최종화면

3. 그래픽스 API 초기화
 1. GPU 디바이스 생성 ( 현재 기기의 GPU를 표현하는 오브젝트, 한번만 생성 하나만 존재)
 2. 커맨드 큐 생성 ( GPU에게 전달할 명령을 쌓아두는 곳, CPU와 GPU가 연결되어있지 않기 때문)
 3. 렌더링 파이프라인 상태 생성 (Rendering Pipeline의 상태를 표현, 여러개 생성 가능)
   1. Rendering Pipeline 서술자 : 어떻게 동작할지 묘사
   2. 정점 서술자(Vertex Descriptor): 정점의 구성을 묘사, 정점을 조립할 때 사용
   3. Vertex Shader, Fragment Shader 포함
   4. 블렌딩 설정, 기본 설정 등...

4. 사용할 데이터 로드
: RAM에서 VRAM으로 전송될 데이터

5. 드로우 콜
: 커맨드 버퍼에 GPU에 전달할 명령을 추가
: 오브젝트를 한 번 그리는데 필요한 명령의 모음

6. 정점 조립
: 정점 버퍼의 요소들을 정점 구조체로 조립
(stream 형태의 데이터를 정점 구조체로 변환)
정점 조립과정은 유니티에서 알아서 처리됨, 사용할 정점의 구성을 구조체로 선언하는 건 우리가 해야됨.
-> 데이터들이 정점 구조체로 정리됨

7. 버텍스 셰이더
: 정점을 입력받아 다른 형태의 정점으로 변환
: 3D 공간 상의 정점의 위치를 클립 공간으로 옮기는 것 = 투영 (카메라가 보이는 곳으로 투영)
-> 스크린으로 옮겨졌을 때의 위치로 옮기는 과정
변환 행렬을 사용 ( 투영행렬 <- 뷰 행렬 <- 모델 행렬 ), 이 전에 오브젝트 공간에 존재함
  오브젝트 공간 : 스스로가 세상의 중심, 3D 모델의 피벗이 원점, 모든 정점의 위치는 피벗에서 얼마나 떨어져있냐로 결정
모델 행렬 : 오브젝트의 정점들을 월드 상의 위치로 옮김
뷰 행렬 : 월드 상의 정점들을 카메라에 상대적인 위치로 옮김 (카메라의 위치와 방향이 세상의 중심)
투영 행렬 : 카메라의 위치를 기준으로 된 정점을 화면 기준의 정점으로 바꿈. 카메라 좌표계의 정점을 클립 공간으로 옮김
(카메라 공간: 시야와 원근감이 없음, 클립 공간: 시야와 원근감이 존재, 카메라가 보는 영역을 직육면체로 압축한 공간)