😊

UE5レンダリングの紹介:Nanite編

2022/12/19に公開約2,300字

原文:https://blog.jp.uwa4d.com/2021/11/05/ue5レンダリングの紹介:nanite編/

一、前書き

今年の初めにUE5はEpicによって公開されてから、注目を集めて話題になりつつあります。技術の面は、主に「大域照明技術」Lumenと「高精度モデルの詳細技術」Nanite2つの新機能をめぐって議論してきました。Naniteに関しては、詳しく紹介する記事がすでに[^1][^2]に揃えました。本記事は、UE5のRenderDoc分析とソースコードから、いくつかの既存の技術資料を参考した上に、Naniteの直感的で概要的な理解を提供することが望ましいです。それに、ソースコードレベルの実装の詳細にあまり関与しなく、アルゴリズムの原理と設計のアイデアを明確にすることを目的としています。


二、次世代モデルのレンダリングには、何が必要か?

Naniteの技術上のポイントを分析するには、まず技術的要件という観点から分析する必要があります。この数十年、AAAタイトルは「インタラクティブな映画的なナラティヴ」と「オープンビッグワールド」に向かっています。迫真の映画のようなcutsceneを追求するため、細かいところまではっきり見えるようにキャラクターモデルを作らなければなりません。柔軟性に富んで豊富な世界を築くために、地図のサイズとオブジェクトの数量は指数的に増長させなければならなりません。この二点は、シーンの精度や複雑さへの要求を大幅に向上させました:シーンにおけるオブジェクトは多いだけでなく、かなり精細にもしなければなりません。

複雑なシーン作成のボトルネックは常に二つあります:

1.Draw CallによるCPU側の検証およびCPU-GPU間の通信コスト;
2.精度が足りないカリングによるOverdrawおよびそれによるCPU側のアセット計算の無駄

レンダリング技術の最適化も、近年ではこの2つの課題を中心に進められる傾向にあり、業界の技術的なコンセンサスも得られています。
CPU側の検証や状態の切替によるコストに対し、新しい世代のグラフィックAPI(Vulkan、DX12とMetal)があり、これはドライブのCPU側での検証作業の軽減に役に立ちます;違ったタスクを異なるQueueを通してGPU(Compute/Graphics/DMA Queue)に分配します;マルチコアCPUの優勢を利用して、GPUにコマンドを出します。これらの最適化に恵まれ、新世代のグラフィックAPIのDraw Call数量は前世代のグラフィックAPI(DX11、OpenGL)と比べて桁違いに増加しています[3]。

もう一つの最適化方向はCPUとGPU間のデータ通信を減少し、最終画面に寄与しない三角形をより正確にカリングします。この発想に基づき、GPU Driven Pipelineが誕生しました。GPU Driven Pipelineおよびカリングの内容について、[4]の記事を参考していただきたいと思います。

GPU Driven Pipelineはゲームで広く応用されて、モデルの頂点データをより細かい粒度のCluster(またはMeshlet)に分割し、毎Clusterの粒度をVertex Processing段階のCacheのサイズに適応し、Clusterを単位にして各種類のカリング(Frustum Culling、Occulsion CullingとBackface Culling)を行います。それは複雑的なシーンを最適化する最高の実践になって、この新しい頂点処理のプロセスはGPUメーカーにも認められます。

しかし、従来のGPU Driven PipelineはCompute Shaderを頼ってかリングします。かリング後のデータはGPU Bufferに格納して、Execute Indirect類のAPIを経て、かリングした後のVertex/Index BufferをGPUのGraphics Pipelineに再び置いていきます。知らず知らずのうちに読み取り書き込みのコストが加わりました。また、頂点のデータは重複的に読み取られます(Compute Shaderはかリング前に読み取ります。さらにGraphics Pipelineは作成中にVertex Attribute Fetchを通して読み取ります)。

以上の原因で、さらに頂点処理の柔軟性を向上させるために、NVidiaは最初にMesh Shader[5]という概念を導入しました。これは、従来の頂点処理の段階で固定されたユニット(VAF、PDタイプのハードウェアユニット)の一部を徐々に取り除き、さらにこのようなことを開発者に委ねて、プログラム可能なパイプライン(Task Shader/Mesh Shader)を通じて処理できることを望みます。


Clusterの見取図

Discussion

ログインするとコメントできます