티스토리 뷰

https://interplayoflight.wordpress.com/2017/10/25/how-unreal-renders-a-frame/

 

How Unreal Renders a Frame

This is part 1 of the “How Unreal Renders a Frame” series, you can access part 2 and part 3 as well. I was looking around the Unreal source the other day and inspired by some excellent …

interplayoflight.wordpress.com

해당 게시물을 보고 공부한 내용입니다.


입자 시뮬레이션 Z-prepass (Prepass 렌더 패스) 폐색 테스트 Hi-Z 버퍼 생성 섀도우 맵 렌더링 라이트 그리드 생성 → Volumetric 안개 → G-프리패스 → 파티클 재검토 → 속도 (움직이는 물체) 렌더링 → AO → 조명 이미지 공간 조명 → 안개 및 대기 효과 → 투명도 렌더링 → 후처리

💡 1. 프레임은 ParticleSimulation 패스로 시작됩니다.

 

두 개의 렌더 대상 사용. 각 입자 이미터에 대한 입자 모셔&기타 속성을 2개의 렌더 타겟에 그린다.

  1. 위치에 대한 RGBA32_Float
  2. 속도에 대한 RGBA16_Float

두 개의 시간/수명 관련 데이터에 기록하는 방식.


 

💡 2. ParticleSimulation 패스 다음으로는 z-prepass인 PrePass 렌더 패스 가 이루어진다.

프리패스 랜더 패스는 모든 불투명 메시가 R24G8 깊이 버퍼로 렌더링 된다.

언리얼은 깊이 버퍼에 렌더링 할 때 역방향 Z를 사용한다. 가까운 평면은 1, 먼 평면은 0으로 매핑된다.

역방향 Z의 장점 : 깊이 범위에서 더 나은 정밀도가 가능. 또한 먼 메시에서 z-fighting이 줄어든다.

Z-프리패스를 활성화하려면 장면 깊이가 필요하다. z-버퍼는 다음에 보게 될 폐색 계산 및 화면 공간 반사와 같은 다른 상황에서 사용됩니다.

 

z-fighting 이란?
3D 그래픽스에서 Z-fighting은 카메라의 시점에서 두 개 이상의 폴리곤이 같은 위치에 있을 때 렌더링된 이미지에서 폴리곤이 겹쳐보이고 깜박거리는(flickering), 노이지한 래스터화(noisy rasterization)가 발생하는 현상

z-fighting


💡 3. 폐색 테스트

언리얼은 기본적으로 오클루전 테스트를 위해 하드웨어 오클루전 쿼리 사용한다.

오클루전 컬링이라는 용어는 객체가 다른 객체에 의해 숨겨진(즉, 가려진) 경우 렌더링 파이프라인에서 객체를 제거(즉, 컬링)하여 그래픽 시스템의 렌더링 부하를 줄이려는 방법을 나타낸다.

이는 3단계로 작동한다.

 

 

오클루전의 3단계 

  1. 우리는 차단기(예: 대형 솔리드 메쉬)로 간주되는 모든 것을 깊이 버퍼에 렌더링합니다.
  2. 우리는 폐색 쿼리를 생성하고 발행한 후 폐색을 결정하려는 소품을 렌더링합니다. 이는 z-테스트와 1단계에서 생성한 깊이 버퍼를 사용하여 수행됩니다. 쿼리는 z-테스트를 통과한 픽셀 수를 반환하므로 이 값이 0이면 소품이 솔리드 메시 뒤에 있다는 의미입니다. 폐색을 위해 전체 소품 메시를 렌더링하는 데 비용이 많이 들 수 있으므로 일반적으로 해당 소품의 경계 상자를 프록시로 사용합니다. 표시되지 않으면 소품이 확실히 표시되지 않습니다.
  3. 쿼리 결과를 CPU로 다시 읽고 렌더링된 픽셀 수에 따라 렌더링을 위해 소품을 제출할지 여부를 결정할 수 있습니다. (소수의 픽셀이 표시되더라도 소품을 렌더링할 가치가 없다고 결정할 수 있습니다.)

 

하드웨어 오클루전 쿼리에는 "드로콜" 세분성이 있다는 단점이 있다. 즉, 렌더러가 오클루전을 결정해야 하는 메시(또는 메시 배치)당 하나의 드로우콜을 제출해야 하며, 이로 인해 프레임당 드로우콜 수가 크게 늘어날 수 있고 CPU가 필요하다.

드로우콜 오버헤드 문제는 Unreal에서 쿼리를 그룹화 하여 이를 완화한다.

 

Unreal에서 쿼리를 그룹화하여 오버헤드 문제를 완화하는 과정

  1. 모든 불투명한 지오메트리를 Z버퍼 에 렌더링
  2. 폐색을 테스트하는 데 필요한 모든 소품에 대해 개별 쿼리를 실행
  3. 프레임이 끝나면 이전(또는 더 뒤의) 프레임에서 쿼리 데이터를 검색하고 소품 표시 여부를 결정
  4. 표시되면 다음 프레임에 대해 렌더링 가능한 것으로 표시
  5. 반면에 보이지 않는 경우 최대 8개 소품의 경계 상자를 일괄 처리하고 이를 사용하여 다음 프레임 동안 가시성을 결정하는 "그룹화된" 쿼리에 추가합니다. 그룹이 다음 프레임에(전체적으로) 표시되면 그룹을 분할하고 개별 쿼리를 다시 발행

💡 4. Hi-Z 버퍼 생성

다음으로, Unreal 은 16개의 부동 소수점 숫자(텍스처 형식 R16_Float)로 저장된 Hi-Z 버퍼( HZB SetupMipXX 통과)를 생성한다. 이는 Z-프리패스 중에 생성된 깊이 버퍼를 입력으로 사용하고 깊이의 밉 체인(즉, 연속적으로 다운샘플링)을 생성합니다. 또한 편의를 위해 첫 번째 밉을 2차원 거듭제곱으로 리샘플링하는 것 같다.


💡 5. 섀도우맵 렌더링

고정 조명의 경우 렌더러는 정적 소품에 대한 그림자를 굽고 동적 소품에 대해서만 그림자를 계산한다.

둘의 차이점은 아래와 같다.

이동식 조명은 매 프레임마다 모든 그림자 재계산 하게 됨.

정적 조명의 경우 조명+그림자를 라이트맵에 굽기 때문에 렌더링중에 절대 나타나지 않아야 한다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함