3D 공간에 있는 오브젝트들이 화면에 표현되는 픽셀로 표시되기까지의 과정을 설명해보세요.
버텍스 페치(Vertex Fetch)
- GPU가 메모리에서 정점(Vertex) 데이터를 가져오는 과정
- 정점 배열 또는 버퍼(Buffer)의 형태로 저장
- 버텍스 쉐이더를 호출해 입력데이터(속성)를 자동적으로 제공하여 변환 및 조작 작업을 실행할 수 있게함
버텍스 쉐이더
- 버텍스 페치에서 가져온 정점 데이터를 처리, 속성을 계산해 출력
Primitive Assembly
- 정점들을 삼각형, 선, 점 등 기본형태로 조합
테셀레이션
- 더 작고 단순한 여러 개의 렌더링 가능한 Primitive로 분할하는 작업
- 복잡한 표면을 부드럽게 만들거나, 높은 해상도의 모델을 생성
- 테셀레이션 Control Shader가 호출되어 얼마나 많은 Sub-Primitive를 생성할지 결정
지오메트리 쉐이더
- 테셀레이션이 완료된 프리미티브당 한 번 수행
- 새로운 프리미티브를 생성하거나 수정하는 역할
- 단일 프리미티브를 입력 받아 새로운 프리미티브를 생성(보다 복잡한 형태를 구현)
- 복잡한 기하학적 변형을 GPU에서 수행해 CPU의 부담을 줄임
- 입체효과, LOD, 파티클 시스템에 사용
클리핑
- 삼각형이 화면의 경계와 교차하는지 확인하고 시야에서 벗어나는 부분을 제거
- 클립 공간에서의 좌표를 기준으로 함
- 동차좌표계로 표현(x, y, z, w); 이동연산을 행렬 곱으로 표현할 수 있어 계산이 단순해짐
- 이를 w 요소로 나누어 카테시안 좌표로 변환 가능(x/w, y/w, z/w, 1), 그리고 카테시안 좌표가 정규화된 디바이스 공간좌표
- 정규화된 공간 좌표를 그릴지 말지를 결정
컬링
- 삼각형이 렌더링할 방향을 향하고 있는지를 통해 그릴지 여부 판단
(정면-카메라를 향함/후면- 카메라를 등짐)
- 삼각형의 방향을 구하기 위해서는 두 변을 벡터로 생각하고 만들어지는 평면의 외적을 구하는 것
- 카메라에 보이지 않는 면을 제거해 작업량을 줄임
뷰포트 변환
- 실제 그릴 윈도우 좌표계는 픽셀을 단위로 해상도에 따라 결정
- 정규화된 디바이스 좌표(NDC)를 윈도우 좌표로 변환
- 최종적으로 화면에 보일 위치를 결정
래스터라이제이션
- 프리미티브를 픽셀로 변환해 화면의 어떤 픽셀을 채울지 결정
- 각 픽셀에 대해 프래그먼트 라는 데이터 생성; 픽셀의 색상, 깊이, 텍스처 좌표를 포함
프래그먼트 쉐이더
- 래스터라이제이션 과정에서 생성된 프래그먼트를 처리
- 조명 계산, 텍스처 맵핑, 색상 보정을 수행
- 삼각형 하나가 수많은 프래그먼트를 만들기 때문에 작업량이 증가
Output Merge
- 최종적으로 합성하여 깊이 테스트를 통해 어떤 프래그먼트가 표시될지 결정
- 블렌딩을 통해 색상 조합, 투명효과나 반투명 효과를 구현할 수 있음