TECHARTNOMAD | TECHARTFLOWIO.COM

TECH.ART.FLOW.IO

[주석번역] Seamless Rendering on Mobile: The Magic of Adaptive LOD Pipeline | 시그라프 2

jplee 2024. 8. 19. 21:36

역자의 말 : " 중국 텐센트의 2024년 2분기 게임 매출액은 485억 위안(약 9조 2,373억 원)으로 전년 동기 대비 9% 증가했다. " 라는 공식 기사를 확인 했습니다. 분기 매출이 10조원에 달하는군요. 저 매출에서 약 15% ~ 20% 는 한국산 게임으로 알고 있습니다. 공격적으로 해외 스튜디오 오픈은 물론 해외 고수준의 엔지니어 영입은 물론 자체 알엔디 시스템을 견고하게 구축하고 영위 해 나가고 있는 텐센트의 모습은 제가 중국에 있을 때 2015년 부터 2018년 까지의 그들의 모습에 비해 엄청나게 바뀌었습니다.
큰 비용으로 꾸준하게 연구개발에 투자하고 있는 텐센트 게임즈의 렌더링 쪽은 향후 2년 후에는 한국은 따라갈 수 없는 수준이 될 것이고 라이트스피드 LA 등에 합류해서 기술개발 하고 있는 고다드 같은 세계적인 테크애니메이터 그리고 너티독에서 시니어 렌더링 프로그래머로 라스트오브어스 프렌차이즈 부터 언차티드 프렌차이즈의 렌더링 시스템 개발 경험을 갖고 있는 왕선생 등도 역시 지금은 텐센트 소속이 되었고... 한국보다 5년 정도 빠르게 GPU- DRIVEN 으로 진입 한 텐센트 게임즈와 넷이즈 게임즈의 연구 투자를 보고 있자면 약간은 씁쓸한 기분이 오늘 들게 되었네요. 아무튼.. 뭐 슌 차오 선생의 돋보이는 아이디어를 한번 들어보시죠.  사족으로 신입에게 "5년 후까지 중국어 학원을 꾸준히 다니고 포트폴리오를 잘 구축 해서 텐센트에서 렌더링 분야 테크아트 엔지니어 취업을 목표로 해 보는 것이 좋을꺼야." 라고 저는 자주 말 하기도 합니다. 아마도 이런 저의 이야기가 머리에 들어 오지도 않겠지만 말이죠. 좀 씁슬하기도 하고 안쓰럽기도 하고... 암튼 씁쓸하지만.... 오늘도 지하철 다섯 정거장용 토픽을 올려 봤습니다.


Shun Cao 는 텐센트 게임즈 R&D 센터의 전문 엔지니어이자 기술 리더입니다. 그는 글로벌 일루미네이션과 애니메이션 시뮬레이션 시스템에 특히 중점을 두고 폭넓은 연구를 진행하고 있습니다.
지난 몇 년 동안 그는 분산형 오프라인 라이트 베이킹 툴인
Dawn과 텐센트 게임즈의 상용 프로젝트에서 널리 사용되고 있는 실시간 모바일 GI 솔루션SmartGI 등 다양한 GI 솔루션 개발을 주도해 왔습니다.
 
개요이 강연에서는 나나이트부터 다른 알고리즘에 이르는 이전 접근 방식을 기반으로 모바일에서 GPU 기반 렌더링을 위한 원활하고 적응적인 렌더링 솔루션을 공유합니다. 이 방법은 모바일 플랫폼에서 낮은 I/O 오버헤드와 고성능 렌더링으로 통합된 경량 LOD 생성을 제공합니다. 발표자의 접근 방식은 성능과 품질의 모든 측면에서 세밀하게 제어할 수 있습니다. 이 시스템의 일부로 제공되는 LOD 기술은 수동 LOD 설정의 필요성을 제거하여 게임 파이프라인의 LOD 관리 복잡성을 줄여줍니다.
자 그럼 발표를 시작합니다.

안녕하세요, 저는 텐센트 게임즈의 Shun입니다. 제 주제는 모바일에서의 심리스 렌더링입니다.
 

저희는 이 렌더링 파이프라인을 통해 개발자가 다양한 플랫폼, 특히 모바일에 맞게 메시 리소스를 커스터마이징하고 조정하는 작업을 간소화하고 수동 작업으로 인한 오류를 줄일 수 있기를 바랍니다. 물론 우리는 게임 그래픽 품질과 인터랙티브한 경험을 보장하는 것도 목표로 삼고 있습니다. 즉, 플레이어의 주의를 끄는 영역의 렌더링을 개선하고 게임플레이 중 동적 리소스 로딩으로 인한 시각적 점프나 지연이 발생하지 않도록 합니다.
 

말로만 설명하는 것은 추상적일 수 있으므로 테스트 시나리오를 통해 설명해 보겠습니다.
모바일에서 구현 가능한 8천만 개의 트라이앵글이 있는 렌더링 장면입니다. 프로덕션에서는 고정밀 에셋만 사용했지만 렌더링 중에는 클러스터 수준에서 투사 영역과 카메라로부터의 거리에 따라 클러스터의 세분성을 제어하여 적절한 효과를 위한 최적의 GPU 리소스를 확보했습니다.
 

그러나 데스크톱 및 콘솔에 비해 모바일 메인스트림 디바이스는 렌더링 파이프라인 제한, 메시 셰이더 지원, 바인드리스 기능 등 원활한 렌더링에 필요한 하드웨어 및 소프트웨어 기능이 많이 부족합니다. 또한 모바일 플랫폼에는 자체 타일 기반 GPU 아키텍처가 있어 성능에 미치는 대역폭 및 IO 영향도 우려됩니다.
 

그렇다면 이러한 제약 조건에서 원활한 클러스터 렌더링을 달성하려면 어떻게 해야 할까요? 저희는 단순성과 효율성을 목표로 하드웨어와 대역폭에 크게 의존하는 부분을 최대한 간소화 했습니다.
 
 

기술적인 세부 사항을 살펴보기 전에 배경 지식을 간단히 살펴보겠습니다.
첫째, 클러스터 기반 렌더링: 오클루전 컬링은 게임에서 직접 오브젝트 오클루전으로 인한 오버드로 문제를 해결하는 데 흔히 사용됩니다. 하지만 큰 오브젝트는 일부만 보이더라도 완전히 렌더링되는 경우가 많습니다.
원본 메시를 작은 클러스터로 나누고 클러스터 수준에서 컬링하면 GPU는 유효하지 않은 많은 트라이앵글을 건너뛸 수 있습니다. 클러스터당 트라이앵글 수를 줄이면 8비트를 사용하는 것처럼 버텍스 인덱스 정밀도를 줄일 수 있습니다. 또한 바운딩 박스를 기반으로 필요에 따라 클러스터를 로드하여 GPU 메모리 사용률을 개선할 수 있습니다.
 

두 번째 기술은 Visbuffer입니다.
미세한 트라이앵글을 렌더링할 때 Visbuffer는 32비트의 추가 오버헤드만으로 포워드 및 디퍼드 파이프라인보다 높은 쿼드 활용도를 제공합니다. 이번 2024 업데이트에서 John Hable은 이 Visbuffer 에 대해 자세히 설명할 예정입니다.
 

Drobot의 어드밴스드 발표와 Brian Karis의 강연, Wolf.gang EngelVisbuffer 오리지널 , 세바스찬의 시그라프 2015 강연 덕분에 이러한 기술에 대해 더 자세히 알아볼 수 있었습니다. 그리고 존 헤이블은 이번 2024 어드밴스드에서 Visbuffer 에 대해 더 자세히 이야기할 예정입니다.
 
 

배경 기술을 소개한 후 렌더링 파이프라인 아키텍처로 넘어가 보겠습니다. 파이프라인은 오프라인과 런타임의 두 부분으로 구성됩니다. 오프라인 단계에서는 사용자 지정 클러스터 데이터를 가져와 생성하고, 런타임 단계에서는 스트리밍, 컬링, 래스터화 및 셰이딩을 수행합니다.
 

오프라인 부분에서는 무엇보다 먼저 메시 스토리지 구조를 재설계합니다. 기존의 멀티 레벨 LOD나 단순한 클러스터 대신 메시를 여러 클러스터로 분할하고 이를 계속해서 더 거친 레벨의 새로운 클러스터로 재결합하는 방식으로 반복합니다.
UE5의 나나이트와 비슷하지만, 에셋과 수동으로 생성된 메시 LOD의 제어 가능성을 보장하기 위해 병합 계수 함수를 추가했습니다.
이를 통해 멀티 레벨 클러스터 데이터를 더 작게 만들어 컬링과 스트리밍을 위한 데이터 구조를 지원합니다.
각 클러스터에는 효율적인 오클루전 및 백페이스 컬링을 위해 바운딩 박스와 노멀 콘이 저장됩니다.
각 클러스터에는 최대 128개의 트라이앵글이 있으므로 8비트로만 인덱스를 저장할 수 있어 공간을 절약할 수 있습니다.
리프 노드가 아닌 노드의 경우 병합으로 인한 오류를 기록합니다.
 
 

다음은 스트리밍 및 컬링 단계입니다. 스트리밍은 각 인스턴스에서 가장 거친 클러스터로 시작한 다음 컬링 패스 출력에 따라 온디맨드 방식으로 로드합니다.
 
 

컬링에서는 GPU가 클러스터 제어 및 선택을 처리하도록 합니다.
오브젝트는 인스턴스 버퍼에, 클러스터는 클러스터 버퍼에, 성공적으로 컬링된 클러스터의 ID는 보이는 클러스터 버퍼에 저장됩니다.
클러스터 버퍼는 GPU 선택에 따라 동적으로 로드됩니다.
컬링은 HZB를 사용한 빠른 인스턴스 수준 컬링으로 시작한 다음 프러스텀 컬링, 오클루전 컬링, 노멀 콘 기반 백페이스 컬링과 같은 다양한 기법을 적용합니다. 클러스터 LOD 컬링에는 UE5의 나나이트와 유사한 LOD 오차를 사용하지만, 로드팩터 선택을 위한 거리 커브를 설계하여 가까운 곳은 충분히 렌더링 정밀도를 확보하고 먼 곳은 더 거친 트라이앵글을 만들어 수동 메시 LOD 팩터 제어를 모방합니다.
 

래스터화 과정에서 전력 소비와 GPU 사용량을 줄이기 위해 중간 렌더링 결과를 32비트 비스버퍼에 저장합니다.
모든 트라이앵글이 클러스터에 있으므로 한 번의 그리기 호출로 모든 트라이앵글이 비스버퍼에 렌더링되는 것이 이상적입니다.
GPU 병렬화를 위해 오브젝트를 분류합니다.
유형 1은 버텍스 셰이더의 비스버퍼에 클러스터와 트라이앵글 ID를 기록하여 픽셀 셰이더 계산을 생략합니다.
유형 2는 스킨드 메시와 마찬가지로 버텍스 셰이더에서 본 정보를 사용하여 버텍스 위치를 다시 계산합니다.
유형 3은 마스크된 식생과 마찬가지로 픽셀 셰이더의 마스크된 텍스처를 기반으로 비스버퍼 생성을 필터링합니다.
추가 씬 뎁스 패스, 원자64 지원 부족, 64비트 비스버퍼의 높은 대역폭으로 인해 소프트 래스터화를 피할 수 있습니다.
인스턴스가 아닌 클러스터 단위로 렌더링하므로 트라이앵글 인덱스에 7비트로 충분하므로 클러스터를 위한 공간이 남습니다.
 
 

모바일 디바이스에서는 아직 바인드리스가 지원되지 않으므로 머티리얼 셰이딩을 구현하려면 드로콜을 사용하여 각 머티리얼을 개별적으로 렌더링해야 합니다.
하나의 머티리얼이 화면 전체를 덮는 경우는 드물기 때문에 화면을 여러 개의 작은 타일로 나누고 각 머티리얼에는 자체 타일 목록이 있습니다.
이렇게 하면 렌더링 중에 각 머티리얼을 전체 화면에 렌더링할 필요가 없습니다. 각 타일의 렌더링에 대해 비스버퍼의 클러스터 정보에서 머티리얼ID를 추출하여 현재 셰이딩 머티리얼ID와 비교합니다.
둘이 같을 때만 머티리얼 셰이딩이 진행됩니다.
 

게임에서 변형 가능한 메시를 렌더링하는 것은 불가피한 일입니다.
스키닝된 메시를 예로 들어보겠습니다.
애니메이션이 진행되는 동안 각 클러스터의 바운드가 계속 변경되어 미리 계산된 LOD 및 컬링의 바운드가 부정확 해집니다.
실시간 버텍스 기반 바운드 계산은 시간이 너무 많이 걸립니다.
따라서 스킨된 메시를 위한 특별한 처리가 필요합니다.
접근 방식은 동적 바운드 박스 계산과 메인 본 공간의 클러스터를 기반으로 한 컬링입니다.
 
 

오프라인에서는 각 클러스터의 메인 본, 노멀 원뿔, 메인 본 공간에서 보수적인 바운딩 박스를 계산합니다.
메인 뼈는 클러스터에서 버텍스 가중치가 가장 높은 뼈입니다. 노멀 원뿔은 모든 클러스터 삼각형의 평균 노멀이며, 원뿔 각도가 모든 삼각형을 덮습니다. 바운드 박스는 모든 애니메이션에 걸쳐 메인 본 공간에서 클러스터의 최대 범위를 포함합니다.
런타임에 CPU는 본 트랜스폼 데이터를 GPU로 전송합니다.
클러스터 컬링 중에 본 트랜스폼을 읽고 보수적인 바운드 박스를 메시 공간으로 변환한 다음 일반 클러스터 컬링을 진행합니다.
스키닝 래스터화는 일반적인 스켈레탈 애니메이션 계산을 따릅니다.
 

심리스 렌더링은 그 고유한 특성으로 인해 조명 계산에 특별한 구현 방법과 최적화 기법을 사용합니다.
예를 들어 전역 조명을 계산할 때는 라이트맵을 활용할 수 있는지 여부와 그 정밀도가 픽셀 수준의 트라이앵글을 커버할 수 있는지 여부를 고려합니다. 이러한 요소는 메모리와 스토리지에 큰 영향을 미칩니다.
따라서 저희는 완전히 동적인 GI 알고리즘을 구현했습니다.
 

GI 알고리즘은 계층적 복셀 기반 접근 방식을 활용합니다.
씬을 블록으로 나누고, 각 블록을 복셀화하며, 이러한 블록과 정제된 복셀을 활용하여 빠른 레이마칭을 수행하는 방식으로 작동합니다.
브릭텍스처는 브릭데이터 오프셋을 브릭맵핑아틀라스에 저장하고, 브릭맵핑아틀라스는 복셀 오프셋을 비스페이스아틀라스에 저장합니다.
 

기본 설정 변수는 다음과 같습니다.
 

다음은 브릭 및 비스페이스 조명 아틀라스에서 조명 데이터를 가져오는 의사 코드입니다.
레이 트레이싱을 수행할 때 첫 번째 단계는 그룹 내에서 유효한 브릭을 식별하기 위해 brickgroupbitmask를 빠르게 쿼리하는 것입니다.
여기에는 단일 uint64 샘플링 작업이 포함됩니다. 마스크가 0이 아닌 경우 현재 브릭 그룹에 유효한 브릭이 포함되어 있음을 나타내며, 마스크의 어떤 비트가 설정되어 있는지 확인하여 어떤 특정 브릭이 유효한지 확인할 수 있습니다.
비트마스크와 샘플포지션의 조합을 통해 브릭인덱스를 찾은 후에는 이 인덱스를 브릭텍스코드로 변환하여 브릭텍스처에 저장된 브릭의 실제 바이어스를 쿼리할 수 있습니다.
이후 브릭비트마스크와 샘플포지션을 모두 활용하여 빠른 레이 마칭 과정을 계속 진행하여 브릭 내에서 유효한 복셀코드를 식별할 수 있습니다.
그런 다음 브릭맵핑 아틀라스에서 비스페이스 아틀라스 내에서 복셀의 오프셋을 찾아 관련 조명 데이터를 읽습니다.
 

다음은 브릭마스크에서 유효한 브릭을 얻는 방법의 의사 코드입니다.
 
 

모바일 디바이스에서 브릭기와 라이트맵의 성능을 비교해 보겠습니다.
이 테스트에서는 512x512미터의 씬 영역에 각각 1024x1024의 라이트맵 해상도를 가진 100개 이상의 오브젝트를 추가했습니다.
테스트 결과, 라이트맵은 최소 160MB의 메모리 오버헤드가 필요한 반면, 브릭기 30MB만 필요합니다.
또한 브릭기의 GPU 시간은 라이트맵보다 약간 높지만, 대부분의 모바일 게임에서 3ms는 여전히 허용 가능한 지연 시간으로 간주됩니다.
 

이 표는 512미터 이내의 영역을 커버하기 위해 할당된 30MB 메모리의 세부 정보를 보여줍니다. 또한 복셀화 계산에 고정밀 클러스터가 필요하지 않으므로 전체 복셀화 비용이 낮게 유지됩니다.
 

또한 복셀화 계산에 고정밀 클러스터가 필요하지 않으므로 전체 복셀화 비용이 낮게 유지됩니다.
복셀화는 본질적으로 정밀도가 제한적이며, 정밀도가 낮은 클러스터는 래스터화를 통해 더 쉽게 복셀화할 수 있습니다.
 

직접 조명 계산과 관련하여 테스트 결과 그림자 깊이 생성을 위한 고정밀 클러스터는 필수적이지 않은 것으로 나타났습니다.
더 거친 근사치를 사용하면 시각적 품질에 미치는 영향은 미미하지만 성능이 크게 향상됩니다.
예를 들어 위쪽 이미지는 200개 이상의 드로콜이 필요한 보다 상세한 렌더링을 사용하는 반면, 아래쪽 이미지는 약 100개의 드로콜로 비슷한 결과를 얻을 수 있습니다.
 
 

위쪽 이미지는 200개의 드로콜을 사용한 효과를, 아래쪽 이미지는 100개의 드로콜을 사용한 섀도맵을 표시합니다.
그 차이는 거의 눈에 띄지 않습니다. 또한 가장 효과적인 방법 중 하나는 섀도 캐싱입니다.
 
 

효과, 프레임 속도, 전력 소비, 패키지 크기 및 제작 효율성을 비교하여 심리스 렌더링의 성능을 살펴보겠습니다.
 

품질 측면에서는 모바일, 특히 리테일 디바이스에서는 상상할 수 없는 8천만 개의 트라이앵글을 동시에 렌더링할 수 있습니다.
이렇게 많은 트라이앵글을 사용하여 안정적인 프레임 속도와 허용 가능한 전력 소비를 유지합니다.
또한 패키지 크기도 줄일 수 있습니다.
또한 LOD를 수동으로 생성할 필요 없이 LOD0 에셋만으로 충분합니다.
 

다음은 모바일 기기에서의 프레임 속도입니다.
파란색과 녹색 선은 심리스 모바일 렌더링을 사용한 후의 렌더링 효과를 보여줍니다.
파란색 곡선이 최소한의 변동으로 약 60fps를 유지하는 것을 확인할 수 있습니다.
 
 

다양한 수준의 모바일 장치에서 자세한 성능 데이터를 살펴보십시오. 하이엔드 디바이스에서는 약 3ms의 GPU 시간만 소요되는 반면, 5년 전의 저사양 모바일 디바이스에서는 약 20ms가 소요됩니다.
 

하이엔드 모바일 디바이스에서의 자세한 성능 데이터도 살펴볼 수 있습니다.
위 표에서는 각 렌더링 단계를 세분화하여 GPU 시간 소비의 변화를 단계별로 모니터링했습니다.
인스턴스 컬링을 활성화하면 0.11ms, 클러스터 컬링을 켜면 0.07ms, 비닝 패스를 켜면 0.2ms, 래스터화 패스는 0.72ms, 머티리얼 분류 패스는 0.92ms, 마지막 패스는 머티리얼 셰이딩으로 0.87ms가 소요됩니다.
컬링에 소요되는 시간은 크지 않으며, 이 시나리오에서는 래스터화 및 머티리얼 셰이딩에 더 많은 시간이 소요되는 것을 알 수 있습니다.
아래 표는 IO 스트리밍의 시간 소비를 보여 주며, GPU의 IO 성능도 수용 가능한 수준임을 알 수 있습니다.
 
 

또한 5년 전의 저사양 모바일 디바이스에서의 자세한 성능 데이터를 살펴볼 수 있습니다. 컬링에 소요되는 시간이 크지 않으며, 이 시나리오에서는 머티리얼 셰이딩이 가장 많은 시간을 소비하는 부분임을 알 수 있습니다.
 

모바일 기기에서 10분 동안의 전력 소비량입니다.
모바일에서 심리스 렌더링(파란색)의 성능이 우수합니다.
이 기능을 활성화하면 기존 메시 렌더링 모드보다 전력 소비가 현저히 줄어드는 것을 확인할 수 있습니다.
 
 

이는 저희의 연구 및 검증 결과이지만 개선의 여지가 많습니다. 이것은 시작에 불과합니다.
 
 

메모리 사용량, 버퍼를 사용한 소프트웨어 vsr, io 최적화, 1.5ms는 여전히 약간 무겁지만 렌더링 기술 및 하드웨어 기능의 발전을 기반으로 성능을 최적화하고 기능을 반복할 것입니다.
기능의 경우 현재 레이트레이싱은 지원하지 않으며, 모바일 하드웨어 기능 개발과 함께 메시 셰이더 및 바인드리스 머티리얼 셰이딩 지원을 추가할 예정입니다.
 

시간 내주셔서 감사합니다. 추가 질문이 있으시면 언제든지 저에게 연락해 주세요.