파이프 라인이란?
- 여러 복잡한 그래픽 처리 과정이 한 사이클로 돌아가는 구조
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 작성
##########################
'C++ > 유니티 엔진 모작(일시중지)' 카테고리의 다른 글
[유니티 엔진 제작] 키 입력을 통한 도형 움직임 (0) | 2025.02.06 |
---|---|
[유니티 엔진 제작] 도형 이동 및 코드 수정 (0) | 2025.02.06 |
[유니티 엔진 제작] 정적라이브러리 프레임워크 구성 (0) | 2025.02.05 |
[유니티 엔진 제작] DC (0) | 2025.02.04 |
[유니티 엔진 제작] 헤더와 main (0) | 2025.02.03 |