개발자 면접 질문 정리 - 그래픽스
- ⭐ Development/Coding Interview
- 2021. 9. 12.
렌더링 파이프라인 (Rendering Pipeline)
파이프라인의 모든 단계는 Direct3D API를 사용하여 구성할 수 있으며, HLSL 언어를 사용하여 프로그래밍 가능하다. 일반적으로 VS(Vertex Shader)단계와 PS(Pixel Shader)단계에서 사용된다.
1. 입력 어셈블러 (Input Assembler)
메모리에 사용자가 채워놓은 기본데이터(삼각형, 선, 점)를 다른 파이프라인 단계에서 사용하기 위한 기본 형식으로 조립하는 단계
2. 꼭지점 셰이더 (Vertex Shader)
변환(Transformation), 스키닝(Skinning), 조명(Vertex Lighting) 등의 작업을 수행한다. 이중 변환 작업 과정에 대해 좀더 설명하자면,
[오브젝트 공간] -> 월드 변환 -> [월드 공간] -> 뷰 변환 -> [카메라 공간] -> 투영 변환 -> [클립 공간] 순으로 최종적인 정점을 생성한다.
2.1 오브젝트 공간 (Object Space)
오브젝트 공간은 아직 변환이 되지 않은 폴리곤 메쉬들이 존재하는 공간을 말한다. 오브젝트 공간은 로컬 공간(Local space)이라고도 한다.
2.2 월드 변환 (World Transform)
월드 변환은 확대축소(scaling), 회전(rotation), 이동(translation)을 이용하여 정점을 변환한다. 행렬을 통해 계산되어 최종적으로 월드 공간의 정보로 변환하게 된다.
2.3 월드 공간 (World Space)
오브젝트 공간에서 월드 변환을 통해 월드 공간으로 변환된다. 월드 공간은 여러 메쉬들이 하나의 공간, 즉 하나의 좌표계에 모이는 곳이다.
2.4 뷰 변환 (View Transform)
월드 공간으로 변환된 정점들을 특정 시점에서 보기 위해 뷰 변환을 통해서 카메라 공간으로 이동시켜야 한다. 뷰 변환은 카메라 변환이라고도 한다. 카메라 공간은 EYE(카메라 위치), UP(카메라의 위 방향), AT(카메라가 바라보는 방향) 정보를 토대로 카메라 공간으로 변환 한다.
2.5 카메라 공간 (Camera Space)
카메라 공간은 뷰 공간(View Space)라고도 한다. 카메라 공간은 카메라가 보는 시점에서의 상대적인 좌표들이다.
2.6 투영 변환 (Projection Transform)
최종적으로 화면에 보여야 할 물체들만 존재하는 클립 공간으로 변환하는 작업이다. 카메라가 볼수 있는 시야(가시 영역)를 뷰 볼륨(View Volume)이라고 한다. 뷰 볼륨은 fovy(시야각)과 aspect(종횡비)에 의해 결정되고, n(근평면), f(원평면)에 의해 절단되어 절두체(View Frustum)의 영역으로 다시 정의된다.
절두체 영역 밖에 그릴 필요가 없는 물체를 제거하게 되고, 이를 컬링(culling)이라 한다. 다음으로 절두체 영역에 의해 메쉬가 잘리는 경우가 있는데 이를 클리핑(clipping)이라 한다.
2.7 클립 공간 (Clip Space)
카메라 공간에서 시야를 정하고 보이지 않는 메쉬들을 잘라내어 최종적으로 카메라 시야에 보이는 메쉬들만 위치한 공간을 클립 공간 이라고 한다.
3. 덮개 셰이더 (Hull Shader)
이 다음 단계인 테셀레이션(Tessellation) 단계를 위한 준비 단계이다. 모델의 단일 표면을 여러개의 삼각형으로 분할 하고, 각 입력 패치에 해당하는 도형 패치를 생성하고 계산한다.
4. 테셀레이터 (Tessellator)
주어진 메쉬의 삼각형들을 더 잘게 쪼개서 새로운 삼각형을 만드는 과정이다. 카메라에 가까운 삼각형들은 테셀레이션을 적용하여 세부도를 높이고 먼 삼각형들에게는 테셀레이션을 적용하지 않는 방식으로 구현 할 수 있다.(Level-Of-Detail, LOD) 이는 메모리를 절약할 수 있고, 계산량을 줄일 수 있다.
5. 도메인 셰이더 (Domain Shader)
테셀레이션의 세번째 단계로 출력 패치에서 세분화된 꼭지점위치를 계산한다.
6. 기하 셰이더 (Geometry Shader)
입력받은 정점 데이터에 정보를 추가하거나 삭제하여 입력받은 기본 도형을 다른 도형들로 확장하거나 출력하지 않도록 버릴 수 도 있다.
가장 흔한 용도는 하나의 점이나 선분을 하나의 사각형으로 확장하는 것이다.
7. 래스터 라이저 (Rasterize)
투영된 3차원의 삼각형으로 부터 픽셀의 색상들을 계산한다.
- 클리핑 (Clipping)
- 원근 나누기 (Perspective Division)
- 뒷면 제거 (Back-face Culling)
- 뷰포트 변환 (View-port Transform)
- 스캔 변환 (Scan Transform)
7.1 클리핑 (Clipping)
클리핑은 투영변환 이후에 클립 공간 볼륨 바깥에 놓인 폴리곤들을 잘라내는 작업이다.
7.2 원근 나누기 (Perspective Division)
투영 변환을 통해 원근법이 적용된 3차원의 물체들을 2차원 공간으로 변환 시키는 작업. z좌표로 모든 성분을 나누어 버린다. 이 좌표 공간을 NDC(Normalized Device Coordinates) 공간이라 부른다.
7.3 뒷면 제거 (Back-face Culling)
카메라에 등을 돌리고 있어 보이지 않는 폴리곤을 제거하는 작업 폴리곤의 법선 벡터와 시선 벡터를 통해 이 두개의 벡터가 예각인지 둔각인지에 따라 뒷면을 판별
7.4 뷰표트 변환 (View-port Transform)
NDC 공간의 물체들을 스크린 공간으로 이전시키는 변환
7.5 스캔 변환 (Scan Transform)
삼각형 하나가 내부에 차지하는 프래그먼트를 생성하는 과정.
8. 픽셀 셰이더 (Pixel Shader)
각 픽셀의 데이터를 생성하는 단계. 조명을 계산하거나 텍스쳐를 입혀서 프래그먼트를 색칠하는 단계
9. 출력 병합 (Output Merge)
픽셀 셰이더가 생성한 데이터들을 입력받아 최종적으로 픽셀의 색상을 생성하여 렌더 타겟으로 출력하는 단계. 후면 버퍼에 기록