2025. 5. 2. 18:14ㆍSTUDY/그래픽스
해당 내용은 '유니티 그래픽스 최적화 스타트업'을 기반으로 작성하였습니다.
정의
렌더링 파이프라인(Rendering Pipeline)이란 쉽게 말해, 오브젝트(렌더링하고자 하는 모든것)을 2D 이미지상으로 그리는 과정을 렌더링 파이프라인이라고 한다. 한개의 오브젝트가 렌더링될 때는 일련의 과정을 거치면서 3D 데이터들이 2D 이미지로 구성되어 그려지는 것이다.
파이프라인은 크게 애플리케이션(Application), 지오메트리(Geometry), 래스터라이저(Rasterizer)로 나눌 수 있다. (물론 플랫폼마다 조금씩 다를 순 있다..)
파이프라인이라는 말에서 유추해볼 수 있듯, 애플리케이션 - 지오메트리 구간의 성능이 원할하더라도 지오메트리 - 래스터라이저 구간의 성능에 과부하가 생긴다면 렌더링 성능이 떨어지게 된다. 결국 파이프라인의 성능은 가장 느린 구간에 의해 좌우되므로, 렌더링을 최적화하려면 렌더링 파이프라인을 잘 이해하고 있어야 한다.
애플리케이션 스테이지(Application Stage)
애플리케이션 스테이지는 말 그대로 애플리케이션 상에서 처리되는 단계를 의미한다. 게임으로 예를 든다면, 게임의 렌더링 루프안에서 오브젝트가 렌더링되기 전에 업데이트 및 기타 데이터 처리들이 이루어져야한다. 가령 캐릭터가 이동할때 달리는 동작을 취하려면 매 프레임마다 애니메이션 정보와 뼈대들의 우치를 연산해주고 이를 메시의 버텍스에 반영해주어야 한다. 이러한 연산들은 정확한 렌더링을 위해 반드시 거쳐야하는 과정이고, 이 단계에서 수행되는 연산들은 최종적으로 그래픽스 렌더링 파이프라인의 성능에 영향을 주게 된다.
이 스테이지에서는 현재 프레임에서 렌더링 가능한 오브젝트들이 컬링 연산에 의해 선별된다. 또한 배칭 처리를 위한 연산도 GPU 파이프라인에 진입하기 전에 이루어진다.
지오메트리 스테이지(Gemetry Stage)
지오메트리 스테이지는 지오메트리 관련 정보, 즉 지오메트리를 구성하는 요소인 버텍스(vertex)와 폴리곤(polygon)의 처리를 담당한다.
버텍스 트랜스폼(Vertext Transform)
렌더링을 수행할때 GPU는 GPU 메모리로부터 버텍스 정보들을 가져오고, 이를 적절한 위치에 그려주기 위해 위치변혼 트랜스폼을 수행한다.
- 월드 트랜스폼(world transform)
저장되어 있는 버텍스 데이터는 특정 위치가 반영된 데이터가 아닌 그냥 메시 형태만 반영되어 있는 로컬 데이터다. 즉 3D 공간상의 특정 위치에 위치시켜 주기 위해서는 월드 좌표계로 변환 시켜주는 월드 트랜스폼(World transform) 을 진행해야한다.
- 뷰 트랜스폼(view transform)
월드 스페이스로 변환되었다면, 이를 카메라 스페이스로 한번더 변환해주어야한다. 카메라는 원점에만 있는 것이 아니고 고유의 위치와 방향을 가지고 있기 때문에 거기에 맞춰 변환해주는 뷰 트랜스폼(View transform)을 거치게 된다.
- 투영(projection)
이렇게 3차원 공간에 놓여있는 오브젝트는 최종적으로 렌더링되어 디스플레이 되는 공간은 2차원이다. 3D 공간을 2D 상의 위치로 매칭시켜주는 과정을 투영(projection) 이라고 한다.
유니티에서는 원근법을 적용한 원근 투영(perspective projection)과 원근법을 제거한 직영 투영(orthographic projection)이 존재한다.
버텍스 쉐이더(Vertext shader)
실제 트랜스폼 변환들은 이 버텍스 쉐이더에서 지루어진다. 위에 설명한 월드, 뷰, 프로젝션 트랜스폼을 합쳐 월드 - 뷰 - 프로젝션 트랜스폼(world - view - projection transform) 이라고 부른다. 이러한 트랜스폼은 버텍스 쉐이더에서 메시의 버텍스에 행렬을 곱해줍으로써 수행된다. 즉 버텍스 쉐이더에서는 메시의 버텍스들이 적절한 위치에 있도록 변혼하는 역할을 수행한다.
지오메트리 생성
버텍스 쉐이더가 도형의 점들을 처리하고 이러한 점들이 연결되어 도형의 형태가 되었다면 이러한 메시 도형의 형태를 지오메트리라고 부른다. 지오메트리 생성은 버텍스 쉐이더에서 버텍스의 트랜스폼들이 결정되고 나면 다음 단계에서 자동으로 이루어진다. 렌더링 파이프라인에 입력받은 버텍스들은 모두 지오메트리화된다. 만일 카메라 기준으로 화면밖에 렌더링 되지 않는 버텍스들이 존재한다고 해도 모두 버텍스 쉐이더를 거쳐서 지오메트리화된다. 그만큼 버텍스가 많으면 지오메트리 스테이지에서 병목이 발생할 확률이 높아지므로 컬링 기법도 매우 중요하다.
래스터라이저 스테이지(Rasterizer Stage)
래스터라이저 스테이지에서는 오브젝트를 그리는 픽셀들을 추리고 그 픽셀의 색을 결정한다. 메시의 폴리곤에 속한 영역을 픽셀로 매칭시키는 과정을 래스터라이제이션(Rasterization) 이라고 부른다.
뎁스 버퍼(Depth Buffer) 혹은 Z 버퍼(Z Buffer)
쉐이더에서 결정된 펙셀의 최종 색상 정보는 컬러버퍼에 저장하고 카메라로부터의 거리를 뜻하는 깊이값을 Z버퍼 혹은 뎁스 버퍼에 저장한다. 이를 이용해 픽셀이 렌더링 될때마다 깊이 판정을 수행하고 어떤 색상이 렌더링 되어야하는지 비교해야하는데 이를 Z 테스트 혹은 뎁스 테스트라고 한다.
만약 투명도를 가진 오브젝트라면 픽셀을 렌더링할때 알파 블렌딩고정을 거쳐 컬러버퍼의 기존값과 적절하게 혼합하여 최종 출력 색상을 결정한다.
원근 투영과 직영 투영, 컬링
https://h-mangoo.tistory.com/53