728x90
반응형
1. 입력 조립(Input Aseembly)
- 렌더링 파이프 라인의 첫 단계
- 정점 데이터를 CPU에서 GPU로 운반하기 위한 자료 구조 = 정점 버퍼
- 정점 버퍼는 위치,노말,색상,UV의 데이터를 직렬화된 형태(배열)로 담고 있음
- GPU에서는 정점 버퍼를 버텍스 명세를 통해 정점 데이터(구조체)로 조립
- 정점들을 모아 삼각형과 같은 기본 도형으로 조립함
- 조립된 기본 도형이 정점 쉐이더에 입력
2. 정점 쉐이더
- 정점 데이터를 입력받아 공간 변환을 수행
- 공간 변환은 행렬 연산을 통해 이루어짐
- Model 변환
- Object, Loacl 좌표계라고도 불림
- 각 오브젝트마다 자신의 피벗 위치를 원점(0,0,0)으로 좌표 공간을 가지고 있음
- 각 오브젝트 좌표 공간을 변환하여 하나의 월드 공간으로 통합하는 과정
- 이 과정에서 이동, 회전, 크기 변환이 이루어짐
- 행렬을 통해 수행, 하나로 만들면 TRS(Translate,Rotate,Scale)행렬
- TRS행렬은 S R T 순서지만
- 각 행렬을 따로 따로 곱하면 T R S순서임
- View 변환
- 월드 공간에서 카메라 공간으로 변환하는 과정
- 카메라의 위치가 원점이고 카메라가 바라보는 방향이 Z축인 공간
- 모든 오브젝트를 화면에 그려내기 쉽도록 카메라 기준으로 공간을 변환하는 과정
- Projection 변환
- 카메라 공간에서 클립 공간으로 변환하는 과정
- 카메라 기준의 정점 위치를 화면에 보이기 위한 정점 위치로 변환
- 화면에 렌데링될수 있는 영역을 나타내는 절두체 정의
- 절두체를 완전이 벗어나는 폴리곤 삭제, 경계에 걸쳐 있는 폴리곤 유지
- 원근감이 있는 직교 투영이나 원근감이 있는 원근 투영이 행해짐
- 4D 좌표계를 가진 동차 좌표계 사용
- X,Y좌표는 -1~1 범위, Z는 0~1 범위, W값은 카메라에서 멀어질수록 커짐
- 버텍스 쉐이더의 최종 출력은 클립 공간의 정점 데이터
3. 래스터라이저
- 클립 공간의 정점 데이터를 받아 프래그먼트 구성, 화면에 출력할 픽셀을 찾아냄
- 프래그먼트 - 픽셀 하나의 색상을 화면에 그려내기 위한 정보를 담고 있는 데이터
- 픽셀 색상 등의 데이터는 정점의 데이터를 기준으로 보간
- 프로그래밍 불가, 하드웨어 자체 알고리즘을 통해 동작
- 역할
- 클리핑
- 버텍스 쉐이더 마지막에 절두체 경계에 걸쳐 있는 폴리곤을 잘라내어 절두체 내부와 외부 영역을 분리, 외부 영역을 버림
- 원근 분할
- 클립 공간 동차 좌표의 모든 요소를 w로 나누어 모든 원근법 구현을 완료함
- 원근 분할이 끝난 좌표계를 NDC 좌표계라고함
- NDC 좌표계
- X,Y 범위 -1~1 ,Z 범위 0~1
- 후면 컬링
- View 벡터와 Normal 벡터의 관계를 통해 후면을 찾아내어 렌더링되지 않도록 후면을 제거
- 뷰포트 전환
- 3D NDC 공간상의 좌표를 2D 스크린 좌표로 변환
- -1~1이였던 X,Y 좌표를 화면 해상도 범위로 변환
- 2D공간으로 변환한다고 하지만 Z값을 깊이 값으로 사용하기 위해 유지
- 스캔 변환
- 기본 도형을 통해 프래그먼트 생성, 프래그먼트를 채우는 픽셀들을 찾아냄
- 픽셀마다 정점 데이터들을 보간하여 할당
4. 픽셀 쉐이더
- DirectX에서는 픽셀 쉐이더, OpenGL이나 유니티 엔진은 프래그먼트 쉐이더라고 부름
- 쉐이더를 통해 색상을 변화시키는 것은 모두 픽셀 쉐이더의 역할
- 투명도, 라이팅, 그림자, 텍스쳐 색상을 메시에 입히는 것
- 각 픽셀들의 색상과 깊이 값을 출력으로 전달
- Z-Buffer 깊이 값, Color Buffer 색상 값 -> 텍스쳐
- 이러한 버퍼를 통칭하여 스크린 버퍼라고 함
5. 출력 병합
- 렌더링 파이프라인의 마지막 단계
- 각 픽셀의 위차마다 여러 오브젝트의 픽셀이 겹쳐 있을 수 있는데
- 출력 병합 단계에서 겹치는 픽셀들을 연산 및 판단하여 픽셀의 최종적인 색상 결정
728x90
반응형