C++/유니티 엔진 모작(일시중지)

1-1강. 랜더링 파이프라인

나는야 개발자 2025. 1. 30. 20:52
반응형

파이프 라인이란?

- 여러 복잡한 그래픽 처리 과정이 한 사이클로 돌아가는 구조

 

3D 모델의 기본 구성

- 기본 단위는 점(vertex)

- 이 점들이 모여서 폴리곤 (정점의 집합체) 을 형성

- 게임에선 삼각형 형태의 3D폴리곤 정의

- 이 점들의 데이터는 Vertex buffer라는 구조로 관리

 

데이터의 이동 경로

- 하드 -> RAM -> GPU -> 최종 화면 출력

- GPU에서 Vertex buffer와 파이프라인 할당

 

Index buffer

- 정점 버퍼와 같이 등장하는 용어

- 정점들의 인덱스를 저장함

- 사각형을 예시로 사각형을 그릴땐 삼각형 기반으로 6개의 정점이 필요하지만, Index Buffer을 이용해 그리면 4로 가능함

단, 추가적인 인덱스 버퍼 사용으로 결국 메모리를 추가 할당하기 때문에 똑같다고 볼 순 있지만 정점 데이터엔 숫자뿐 아니라 위치, 색, 법선, UV, 애니메이션 등이 있기 때문에 정점 데이터를 추가하는 것 보단 효율적임

 

Primitve Toplgy

- Primitve Toplgy는 GPU에서 정점들을 이용하여 어떤 도형을 만들어야 하는지 정보가 필요한데 그 도형의 정보를 말함

 

파이프 라인 2가지 종류(간단하게 알아보기)

1. 레이트 레이싱 파이프라인 

(첨부사진1)

 

- 빛을 이용하기 때문에 연상량이 많고 게임에선 주로 사용하지 않음

 

2. 래스터라이제이션

(첨부사진2)

- 픽셀을 이용하여 그림

 

 

 

Rasteraization 파이프라인

(첨부사진3)

 

1. Input Assembler

- Input Assembler는 vertex buffer(정점데이터)와 index buffer에서 데이터를 가져와 primitive topology에 따라 기본 도형을 구성하는 단계

 

2. Vertex 쉐이더 과정

- Local Space -> World Space -> View Space -> Projection 변환 -> Clip Space

 

*Local Space

- Input Assembler의 정점 정보 -> 도형으로 출력할때 로컬 좌표계로 되어 있음

 

* World Space
- Local은 자기 중심이기 때문에 출력할때 화면 중심부로 전부 생성되기 때문에 World Space로 변환 해줘야함

- Local Space 오브젝트 공간을 3차원 세상에서 표현될 각각의 개인 공간 영역

 

*View Spcae

- 플레이어가 바라보는 카메라가 중심이 되는 공간

- 월드 변환 후 한공간(World Space)에 모아지면 원하는 시점에서 물체를 관찰할 수 있게 되고, 관찰자로서 카메라가 필요하게 되는데 이 카메라가 볼 수 있는 공간을 뷰 공간이라 함

- 성능의 한계로 시야 제한 존재

- FOV(시야각), ASPECT(종횡비)로 조절하며 이것을 가시영역인 뷰볼륨이라 함

- 생성된 뷰볼륨에 Near, Far 정보가 전달되어 절두체 영역을 재정의함

 

*Veiw Frustum(절두체 영역)

- 절두체 밖 잘리는 공간을 클리핑(Clipping)

- 클리핑은 카메라 변환에서 이뤄지지 않고, 클립공간 -> 레스터라이저때 수행

 

*Projection 변환(투영 변환)

- 3차원 데이터 -> 2차원 픽셀로 가공

- 3차원 -> 2차원 평면은 원근법을 이용해 3차원 클립공간으로 변환

- 단, 아직 2차원 데이터로 변환한 것이 아닌 3차원 물체로 변환한것임

 

3. Tesselation 단계 (선택적 사용)

- 3단계로 구성

- Hull Shader -> Tesselation -> DomainShader

- 실제 게임 제작 시 정점이 적은 로우 폴리곤, 정점이 많은 하이 폴리곤을 따로 지원

 

*Hull Shader

- Tessellation의 첫 작업
- 폴리곤의 분할 방식과 정도를 결정

 

*Tesselation

- 다각형을 더 작은 조각으로 분할하여 세밀한 표현 가능
- 실제 오브젝트에 가깝게 표현 가능

 

*Domain Shader

- 테셀레이터가 출력한 정점마다 함수 호출
- 공간변환(월드 -> 뷰 -> 투영) 수행

 

4. Geometry Shader (선택적 사용)

- 기존 폴리곤에서 정점 추가, 삭제 연산이 가능

- 정점 추가 가능 모델의 경우 정점 정보를 뺄 수 있어 메모리 용량을 적게 사용할 수 있고, 하드웨어 수준에서 정점 처리가 이루어져 효율적인 정점 생성이 가능함

 

5. Resterization 단계

- 정점 처리단계를 지난 다음 레스터라이저 단계를 진행

- 정점들은 삼각형으로 묶여 있는데 이 시점부터 하나의 독자적 도형처리가 됨

1. 삼각형이 포함된 픽셀마다 Pixel Shader(Fragment Shader)을 실행함

2. 삼각형의 세 정점에 할단된 여러 데이터(POS, UV, Normal, Color)가 보간되어 삼각형 내부에 픽셀 셰이더로 넘어옴

 

주요 처리 과정

1. 클리핑

- 클립 공간 볼륨 밖 폴리곤을 제거

 

2. 원긋 나눗셈(Perpective Division)

- 3차원 -> 2차원으로 변환
- 정점 데이터의 X,Y,Z,W 값에서 X,Y,Z를 각각 W로 나누어 원근감을 만듦 (즉, X/W, Y/W, Z/W 계산)
- NDC(Normal Device Coordinate)공간이라 부르며, X,Y 범위는 -1~1, Z범위는 0~1이라 정규화라 부름

 

3. 뒷면 제거(Backface Culling)

- 보이지 않는 면을 제거하여 최적화

 

4. 뷰포트 변환

- NDC 공간의 물체를 스크린 공간으로 변환

 

5. 스캔 변환(NDC Scan Transform)

- 랜더링 프로그램에서 직접적인 영향을 미쳐 중요함

- 삼각형 내부의 모든 픽셀 생성
- 정점 데이터는 보간되어 픽셀 셰이더로 전달

 

Pixel Shader

- 레스터화된 도형에 색상 적용
- 텍스처 매핑, 노말 매핑 등 처리
- 조명, 이미지 처리 담당
- 보간된 정점 데이터 사용

 

6. Output Merger

- 깊이/스텐실 테스트 수행
- 블렌딩 처리
- 최종 화면에 결과물 출력

 

*DirectX에서는 이러한 과정을 Resterization이라 부름

*고정 파이프 라인이며 변경이 불가능

 

##########################

업데이트 사항

- 1.28 : Input Assembler 작성

- 1.30 : Vertex Shader, Tesselation Shader, Geometry Shader 작성

- 1.31 : Resterization, Output Merger 작성

##########################

반응형