들어가기
컴퓨터 그래픽스를 공부하면서 Blender와 같은 간단한 렌더러를 우선 만들어 보는 것을 목표로 하였습니다.
OpenGL, DirectX 사용해 보면서 처음 GPU를 활용한 렌더링을 해보았는데 이때 중요한 개념인 그래픽 파이프라인에 대해 정리해 보려고 합니다.
[틀린 부분이 있다면 댓글로 알려주시면 감사하겠습니다!]
파이프라인이란?
먼저 파이프라인이란 간단하게 데이터 처리 단계를 말합니다. 따라서 그래픽 파이프 라인이란 화면에 어떤 물체를 그리기 위해 행해지는 일련의 데이터 처리 단계입니다.
데이터 처리는 어디서 이루어 질까? [CPU VS GPU]
물체를 화면에 그리기위해서 처리 되어야 하는 데이터의 종류는 다양합니다.
데이터의 종류에 따라 CPU 혹은 GPU에서 처리됩니다.
CPU에서 처리되는 데이터
- obj 파일
- 오브젝트를 그리기 위한 메시 정보 및 추가 정보들이 저장되어 있는 파일
- vertex 정보[position, color, normal, uv 등등] 및 index 정보
- 이미지 파일
- 텍스쳐링을 위해 불러와야 되는 각종 이미지 파일들
- 변환 행렬
- 보통 물체의 변환 정보를 행렬로 만들어서 저장
- 쉐이더 프로그램 파일
- 쉐이더 코드로 미리 작성된 코드를 컴파일하는 과정이 필요함
- 컴파일된 코드는 GPU memory로 전송됨
GPU에서 처리 되는 데이터
- vertexBuffer, IndexBuffer, constantBuffer
- 물체의 vertex및 index 정보, 변환 행렬과 같은 사전에 cpu에서 계산된 정보를 memory에서 GPU memory로 복사하여 사용함
- gpu에서는 해당 데이터를 일련의 과정에
- 쉐이더 프로그램
- 사전에 컴파일된 쉐이더 프로그램은 gpu에서 데이터를 처리하는데 사용
보통 그래픽스 파이프라인이라고 하면 GPU에서 일어나는 데이터 처리 단계를 의미 합니다.
그래픽스 파이프라인의 단계들
Input assembler
- vertexBuffer와 indexBuffer를 사용하여 GPU가 이해할 수 있는 형식의 데이터로 변환함
- 보통 삼각형 단위로 정보를 모아서(기하 프리미티브 생성) 이후 단계들에서 사용함
Vertex Shader
- 모든 정점에 대해서 변환(이동, 회전, 스케일등)을 수행하는 프로그램
- 변환을 통해 모델 공간에서 스크린 공간으로 전환시킴
Tessellation Shader
- 특정 규칙에 따라서 기하 프리미티브를 세분화하여 메시 품질을 높임
- 사용예시
- 바다와 같은 표면에서 파도와 같은 세부 사항을 나타냄
- 로프, 체인, 머리카락과 같은 유연한 물체의 시뮬레이션
- 뷰어의 거리에 따른 세부 수준 조
Geometry shader
- 기존의 기하 프리미티브로 부터 새로운 기하 프리미티브를 생성, 변환, 삭제 함으로서 새로운 효과를 줄 수 있게 함
- 사용 예시
- 풀 렌더링
- 하나의 정점을 입력받아 여러 정점을 생성하여 풀과 같은 자연환경 표현
- 빛 발산
- 물체 주위에 광택 효과를 위해 추가적인 정점을 생성
- 풀 렌더링
Rasterization
- 보간을 사용하여 정점 사이의 값들을 픽셀 요소로 변환
- 삼각형 내부를 채우는 과정으로 쉽게 이해
Fragment Shader [Pixel Shader]
- 모든 fragment[pixel]에 대해 적용되어 어떤 색상과 깊이 값을 가질지 결정
- 각정점이 가지고 있는 데이터를 보간하여 값을 결정