PBRやHDRは当たり前、モバイルの限界を攻めるレンダリングパイプラインの実装

20.9K Views

October 26, 22

スライド概要

スマートフォンでOpenGL ES2.0が使用できるようになってから13年が経ち、処理速度は飛躍的に向上しました。
その間、PCやコンソールではPBRやHDRで作成されるのは当たり前になり、多数の光源や高度なグローバルイルミネーションを用いてハイレベルなグラフィックスを実現しています。
本講演では、モバイルデバイスにおいてもこれらの技術を導入することで、高度なグラフィックス表現が可能なことを示します。
このレンダリングパイプラインで背景制作に取り組んだ内容に関してはナイトセッション「PBRやHDRは当たり前、高品質なモバイルゲームの背景に関する取り組みをご紹介」をご覧ください。

こんな人におすすめ:
・モバイルデバイスでも高度なグラフィックスのゲームを作成したい方
・アーティストにPBRがやりたい、HDRPのような機能をモバイルでも使いたいとリクエストされている方

受講者が得られる知見:
・モバイルデバイスでもPC、コンソールに匹敵する高度なグラフィックス表現ができること
・URPのカスタムによってパイプラインを柔軟に変更できること

出演:
荒木 和也 (株式会社コロプラ)

--
初出: SYNC 2022 #UnitySYNC
https://events.unity3d.jp/sync/

profile-image

リアルタイム3Dコンテンツを制作・運用するための世界的にリードするプラットフォームである「Unity」の日本国内における販売、サポート、コミュニティ活動、研究開発、教育支援を行っています。ゲーム開発者からアーティスト、建築家、自動車デザイナー、映画製作者など、さまざまなクリエイターがUnityを使い想像力を発揮しています。

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

関連スライド

各ページのテキスト
1.

PBRやHDRは当たり前 モバイルの限界を攻める レンダリングパイプラインの 実装 2022

2.

現在のモバイルデバイスの状況 現在のモバイルデバイスの状況

3.

現在のモバイルデバイスの状況 現在のモバイルデバイスの状況 • 毎年10%〜30%の性能が上がっている • デバイスによってはベンチマークスコアが4年前と比べCPUが2倍、GPUに至っては4倍近く上がっているものも • 市場には幅広い機種が存在している • 様々な性能のデバイスで動作するように設計しなければならない

4.

現在のモバイルデバイスの状況 現在のモバイルデバイスの状況 • パフォーマンスが向上してきておりPBRをベースとしたレンダリングを問題なく行える • またリッチなポストエフェクトも使用できる • Deferred Renderingをする際にパフォーマンスを向上させる機能がモバイルGPUには搭載されている • UnityではRender Passという名前で呼ばれている • この機能を活用することで高速なGlobal Illuminationを実現したりReflection Probeの制限を緩和することができる

5.

デモ デモ

6.

デモ

7.

デモ 多光源 • Deferred Renderingを使用 • Render Passを使用した最適化により モバイルデバイスでも多くの光源が扱えるように

8.

デモ スポットライトの シャドウ • デバイスの性能向上と最適化によりディレクショナ ルのシャドウマップだけではなくスポットライトで もシャドウマップを使用した影が利用可能に

9.

デモ Global Illumination • 軽量でメモリ消費量がとても少ない • Render Passを使用した最適化で描画負荷も低い • ベイクが早く、直ぐに結果を確認できる

10.

デモ 使用した技術一覧 • Physical-Based Rendering • Deferred Rendering • Decal • 物理的な単位でのライトの強さの指定(LuxやLumenなど) • Auto Exposure • ProbeベースのGlobal Illumination • Per-PixelのReflection Probe • Screen Space Reflection • Screen Space Ambient Occlusion • 他にも色々

11.

デモ 使用した技術一覧 • Physical-Based Rendering • Deferred Rendering • Decal • 物理的な単位でのライトの強さの指定(LuxやLumenなど) • Auto Exposure • ProbeベースのGlobal Illumination • Per-PixelのReflection Probe • Screen Space Reflection • Screen Space Ambient Occlusion • 他にも色々

12.

Render Pass Render Pass

13.

Render Pass Tile Based Rendering • タイルメモリ内に画面の一部をレンダリングし、それらをつなぎ合わせて最終結果とする メインメモリ メインメモリ タイルメモリ メインメモリ

14.

Render Pass Render Pass • タイルメモリ内で処理を完結させることでMRT使用時にメモリバスやメモリ使用量を気にしなくてよい機能 • 制限としては描画されようとしているピクセルと同一座標のピクセルのみ読み取りが可能

15.

Render Pass Render Passを使用しない場合 タイルメモリ メインメモリ

16.

Render Pass Render Passを使用する場合 タイルメモリ メインメモリ

17.

レンダリングパイプライン レンダリングパイプライン

18.

レンダリングパイプライン レンダリングパイプライン(ハイエンド向け) Main Light Shadow GBuffer Transparent SSAO Additional Lights Shadow SSR Exposure Global Illumination Post Effect Reflection Lighting

19.

レンダリングパイプライン レンダリングパイプライン(ローエンド向け) Main Light Shadow Additional Lights Shadow GBuffer Transparent Global Illumination Exposure Post Effect Reflection Lighting

20.

HDRをフル活用するための機能 HDRをフル活用するための機能

21.

HDRをフル活用するための機能 Auto Exposure Auto Exposure無し Auto Exposure有り

22.

HDRをフル活用するための機能 物理ライトユニット • • • • LuxやLumenなど物理的な値でライトの強さを設定 現実のライトを参考にできる 互換性のために以前の強さはUnitlessとして残す Inspectorでライトの強さを変更した際にUnitlessに変 換するのでランタイムでの負荷は0

23.

Per-Pixel Reflection Probe Per-Pixel Reflection Probe

24.

Per-Pixel Reflection Probe Per-Pixel Reflection Probe URPデフォルト Per-Pixel Reflection Probe

25.

Per-Pixel Reflection Probe Per-Pixel Reflection Probe URPデフォルト Per-Pixel Reflection Probe

26.

Per-Pixel Reflection Probe Reflection Probeのレンダリング Stencil Volumeを描画 反射内容とWeightを描画

27.

Per-Pixel Reflection Probe Reflection Probeのレンダリングと合成 すべてのRPの描画 SkyboxのRPと合成 レンダリング結果

28.

Per-Pixel Reflection Probe Reflection Probeのレンダリングと合成 すべてのRPの描画 SkyboxのRPと合成 タイルメモリで完結 メインメモリには書き出さない レンダリング結果

29.
[beta]
Per-Pixel Reflection Probe

Weightを利用したSkyboxとの合成
half4 reflections = SAMPLE_TEXTURE2D_X_LOD(MERGE_NAME(_, GBUFFER_REFLECTIONS), my_point_clamp_sampler, screen_uv, 0);
half totalWeight = reflections.a;
if (totalWeight < 1.0)
{
// グローバルな反射を追加
half3 reflectVector = reflect(-inputData.viewDirectionWS, inputData.normalWS);
half NoV = saturate(dot(inputData.normalWS, inputData.viewDirectionWS));
half fresnelTerm = Pow4(1.0 - NoV);
BRDFData brdfData = BRDFDataFromGbuffer(gbuffer0, gbuffer1, gbuffer2);
half weightProbe = 1.0 - totalWeight;
half mip = PerceptualRoughnessToMipmapLevel(brdfData.perceptualRoughness);
half4 encodedIrradiance = half4(SAMPLE_TEXTURECUBE_LOD(_GlossyEnvironmentCubeMap,
sampler_GlossyEnvironmentCubeMap, reflectVector, mip));
half3 irradiance = weightProbe * DecodeHDREnvironment(encodedIrradiance, _GlossyEnvironmentCubeMap_HDR);
reflections.rgb += irradiance * EnvironmentBRDFSpecular(brdfData, fresnelTerm);
}
else
{
reflections.rgb /= totalWeight;
}

30.

Global Illumination Global Illumination

31.

Global Illumination Global Illumination Global Illumination無し Global Illumination有り

32.

Global Illumination Global Illumination Global Illumination無し Global Illumination有り

33.

Global Illumination URPで使用できるGlobal Illumination Lightmap • 静的なオブジェクトのみ • ベイクにとても時間がかかる • アセットの容量、メモリ使用量が多い Enlighten Realtime GI • 静的なオブジェクトのみ • ベイクにとても時間がかかる • Lightmapと違い、ライトの変更はすぐに反映される • メモリ使用量が多い Light Probe • 静的/動的両方に対応 • 上記2つの結果から計算される • 4つのProbeを補完した内容が渡されるため大きなオブジェクトだと問題がある

34.

Global Illumination GIシステムを作ることに

35.

Global Illumination GIシステムの要件 • メモリ使用量が少ない • ベイクが高速 • 仕組みが分かり易い • 明るさや範囲をコントロールしやすい

36.

Global Illumination 新しいGI • • • • Probeを配置していくだけ 明るさをProbe毎にコントロール可能 Render Passを利用していて高速 Enlighten Realtime GIでベイクに数時間掛かっていた シーンを数分でベイクが可能 • プレビュー機能を備えていて選択中のProbeを 一瞬でベイク可能

37.

Global Illumination Probeの生成 • Probeを配置する • 配置された周囲の環境をキャプチャする • キャプチャした内容から2次のSpherical harmonics(SH2)を計算する キャプチャ SH2

38.

Global Illumination SH2の注意点 • 強い光があると反対側に暗い面が出来てしまう • フィルタリングを行うことで解決 • HDRPの”AmbientProbeConvolution.compute”にフィルタリング込みのSH2生成用のコードがある フィルタリング無し フィルタリングあり

39.

Global Illumination Probeのレンダリング Stencil Volumeを描画 SH2とWeightを描画

40.

Global Illumination Probeのレンダリング SkyboxのSH2と合成 レンダリング結果

41.

Global Illumination モバイルの限界を 攻める

42.

Thank you 2022