Slide 1

Slide 1 text

わかった気になれる UE5レンダリング swd

Slide 2

Slide 2 text

自己紹介 ● 名前 ○ swd (@s_w_d_) ● 所属 ○ Preferred Networks ○ 普段の仕事は全く描画関係なし ● OSS ○ Effekseer ■ EpicGamesからも支援

Slide 3

Slide 3 text

概要 ● Unreal Engine5 ○ ゲームエンジン ○ とてもレンダリングが綺麗 ○ CitySampleで話題 ● 話すこと ○ UE5の描画技術の概要の一部 ■ 甘口 ■ 非描画技術者向け ● 話さないこと ○ UE5の設定 ○ 詳細な技術の実装 City Sample

Slide 4

Slide 4 text

NaniteとLumen ● Lumen ○ リアルタイムGI ■ 直接光と間接光を リアルタイムに計算 ■ 発光等もリアルタイムに使用可能 ● Nanite ○ 大量のポリゴンを表示する技術 ■ 数千万ポリゴンの 3Dモデルを表示

Slide 5

Slide 5 text

Nanite ● 大量のポリゴンを表示する機能 ● 主に2つの要素で構成 ○ 強力なカリングとLoD ■ Mesh Cluster Rendering ● メッシュの一部のみを描画する機能 ○ 描画時のメモリの転送量の削減 ■ Visibility Buffer ● メモリ転送量を抑制する描画手法

Slide 6

Slide 6 text

カリング ● 従来の手法 ○ フラスタムカリング ■ カメラ外のオブジェクトを描画から除外 ■ 一部でも表示されている場合、全体が描画される ○ オクルージョンカリング ■ 壁等で隠れているオブジェクトを描画から除外 ■ 遮蔽の計算が難しい ■ 一部でも表示されている場合、全体が描画される

Slide 7

Slide 7 text

Mesh Cluster Rendering ● 1つのメッシュを複数に分割 ○ 分割した単位でカリング ○ 必要なメッシュのみを描画 ● 距離に応じてメッシュを変更 ○ ポリゴンのサイズが同じになるように調整 近 遠

Slide 8

Slide 8 text

AmplificationShader + MeshShader ● Amplification Shader ○ GPU側でメッシュを描画の可否を判断する機能 ● MeshShader ○ 高速でGPU上でメッシュを生成する機能 ○ 状況に応じて適切なメッシュを生成可能 ● UE5 ○ UE5は未サポートGPUのために ComputeShaderで代替の実装を行っている ○ 実質同様かつフォールバックの実装なので上記機能を説明

Slide 9

Slide 9 text

AmplificationShader, MeshShaderによるLoDカリング ● 処理 ○ GPU内で遮蔽を計算、隠れた部分を描画メッシュから除去 ○ カメラ内のメッシュのみ描画 ○ 距離に応じてメッシュ切り替え ● 結果 ○ GPU、CPUの転送量が減って高速化 ■ 描画する、しないの判断をCPUが行っていた ■ 今まではオクルージョンカリングは CPUで行う必要があった ○ ポリゴン数をより細かく調節できて高精度化、高速化

Slide 10

Slide 10 text

AmplificationShader, MeshShader ● AmplificationShader, MeshShaderはGPUの機能 ○ UE5特有の実装ではない ○ DirectX12 Ultimate, Vulkanの拡張等に存在 ○ 他ゲームエンジンでもいずれ採用されるかもしれない カリングされている DirectX12 サンプル

Slide 11

Slide 11 text

描画方法の変更 ● 従来の描画方法 ○ Forward Rendering ○ Deferred Rendering

Slide 12

Slide 12 text

Forward Rendering ● Forward Rendering ○ オブジェクトごとに直接色を描画 ○ メリット ■ 軽い ○ デメリット ■ 光源を増やせない

Slide 13

Slide 13 text

Deferred Rendering ● Deferred Rendering ○ メリット ■ 大量の光源を配置可能 ○ デメリット ■ メモリの転送量が多い 計算用の情報のバッファを描画 情報のバッファを元に色を描画 メモリの転送量が多い!

Slide 14

Slide 14 text

VisibilityBuffer Forward Rendering Deferred Rendering Visibility Buffer 複数光源 × 〇 〇 メモリ転送量 〇 × 〇 The Visibility Buffer: A Cache-Friendly Approach to Deferred Shading

Slide 15

Slide 15 text

VisibilityBuffer ● スクリーンにポリゴンのIDを書き込み ○ メッシュID ○ ポリゴンID ○ ポリゴン内位置 ○ 等 メッシュID ポリゴンID

Slide 16

Slide 16 text

VisibilityBuffer ● 書き込まれたポリゴンのID等から面を取得 ● 取得された面を描画 ● DeferredReneringよりメモリ転送量が少ない ○ IDなので軽い 画像から ポリゴンID等を取得 ポリゴンから 面の情報を取得

Slide 17

Slide 17 text

まとめ ● カリングとLoDの強化、描画方法の変更により高速化 ○ 計算量、メモリ転送量ともに減少 ● ただし特定オブジェクトのみ対応 ○ 例:半透明

Slide 18

Slide 18 text

Lumen ● リアルタイムGIレンダリング ○ 直接光+間接光のリアルタイム計算 直接光 間接光

Slide 19

Slide 19 text

直接光 ● 遮蔽物を考慮しつつ計算 ● 間接光として重くはない 直接光

Slide 20

Slide 20 text

間接光の計算 ● 複数回の反射の計算 ○ オブジェクトに衝突した光が反射され他に衝突 ○ 計算量が膨大

Slide 21

Slide 21 text

従来手法 ● 手順 ○ 間接光を事前に計算 ○ テクスチャに結果を焼きこみ ● 問題点 ○ 動的物体に対応できない ○ 環境の変化に対応できない リアルタイムに計算したい!

Slide 22

Slide 22 text

リアルタイムGIの実現 ● リアルタイムGI実現のために2種類のデータをリアルタイム生成 ○ ScreenProbe ■ スクリーン上の光源情報 ■ 不透明物体向け ○ GI Volume ■ 空間上の光源情報 ■ 半透明物体向け

Slide 23

Slide 23 text

ScreenProbe ● スクリーン上で一定間隔ごとに情報を記録 ○ 360度方向の入射光の方向と強さ ○ 視界に映るオブジェクトの部分ごとの間接光を計算しやすくなる

Slide 24

Slide 24 text

GIVolume ● 3D空間上に一定間隔ごとに情報を記録 ○ 360度方向の入射光の方向と強さ ○ ScreenProbeとの違いは密度と配置 ● 半透明物体向け

Slide 25

Slide 25 text

計算方法概要 ● オフライン ○ メッシュカード生成 ■ 計算高速化用データ ○ 他様々な高速化用データ生成 ■ 本講演では説明せず ● オンライン VoxelLighting 直接光 メッシュカード情報 VoxelLighting ScreenProbe GI Volume

Slide 26

Slide 26 text

メッシュカード ● 計算を軽量化するためのメッシュ ● オブジェクトを直方体で近似 ○ 入り組んでいる物体は苦手

Slide 27

Slide 27 text

メッシュカードへの情報計算1 ● カメラ近辺のメッシュカードを取得しテクスチャにUVを展開 ● 表面の材質の情報を計算 ● 材質のテクスチャ上に配置 ○ 次の計算に利用

Slide 28

Slide 28 text

メッシュカードへの情報計算2 ● 材質を元にメッシュカードへのライティングを計算 ● 直接光 ○ 遮蔽を考慮しつつ、光源からのライティングを計算 遮蔽物

Slide 29

Slide 29 text

メッシュカードへの情報計算2 ● 間接光 ○ VoxelLightingに対してレイトレーシング メッシュカード VoxelLighting レイトレーシング

Slide 30

Slide 30 text

VoxelLighting ● 光源の輝度+方向情報をボクセル上に記録したもの ● 高速化のために粗密のデータを生成

Slide 31

Slide 31 text

VoxelConeTracing ● VoxelConeTracingで輝度を計算 ○ 円錐の形状でボクセルの輝度を取得 ○ 遠距離ほど疎なデータを参照することで高速化

Slide 32

Slide 32 text

VoxelLightingの生成 ● メッシュカードの情報から生成 ● 近傍のメッシュカードを取得し計算

Slide 33

Slide 33 text

ScreenProbe ● 複数の情報から生成 ○ MeshCard ■ 近距離 ○ VoxelLighting ■ 中距離~ ○ SSGI ■ 全体 ■ スクリーン上の画像から簡易的な GIを行う ● 今回は説明なし

Slide 34

Slide 34 text

GI Volume ● LightingVoxelで全方向にVoxelConeTracingすることで作成

Slide 35

Slide 35 text

複数回反射 ● VoxelLightingが2つある ○ 前フレームのデータを移動させて使用 ○ 情報を積算してくことで間接光の複数回反射を実現 VoxelLighting 直接光 メッシュカード情報 VoxelLighting ScreenSpace Probe GI Volume

Slide 36

Slide 36 text

まとめ ● これらの処理によりリアルタイムGIを実現 ○ 高速な視点、オブジェクト移動には弱い

Slide 37

Slide 37 text

最後に ● これらは大まかな説明 ○ 詳細を気になる方は他の資料を見てください ● かなりUE5の実装は難解 ○ 間違ってたところがありましたら、教えてください ● 弊社の3DScanしたデータをUE5で表示してみました

Slide 38

Slide 38 text

ご清聴ありがとうございました Preferred Networksでも3D人材を募集しています