はじめに
今回はこちらを見ていきます
2 レンダリング
理念と概念
- レンダリング品質、機能とパフォーマンスは当初から重要課題
- 最高のパフォーマンスで最高のビジュアルを求めていく
UE1
- 1997~
- 色付きライトをブレンドする最初のエンジン
- ダイナミックと静的なランプがありブレンド可能
- その他存在していたもの
- ボリュメトリックライティング
- レンズフレア、完全な鏡
- プロシージャルテクスチャエフェクト
- 20年前でこの内容はすごい。との事
- 数年後、HDテクスチャ 詳細のテクスチャで1Kから2Kの解像度がサポートされる
UE2
- 2002~
- Directx7 をサポート
- メッシュサポート
- テレイン(地形)、大規模の屋外環境、車両が導入される
- Foliageやパーティクルが導入
- 最初のマテリアルが使えるようになる
- ライティングはモデルの頂点ライティングベース
- UE4の原型がこのときすでにできていた
UE3
UE4
- どのようなスタイルでもエンジンで実行できるように取り組んでいる
- ハイエンドでリアリスティックなレンダリングに取り組んできた
- Gears of war のような
- フォートナイト
- ハイエンドでリアリスティックなレンダリングに取り組んできた
- 1人でも300人以上の大規模プロジェクトでも機能する必要があった
- 使用者に関わらず最高のパフォーマンスで機能する必要があった
- Sky Atmosphereが最近追加されたが、これもモバイルで動作する必要がある
- UE4の利用は他の業界へも広がっている為、更に高いビジュアルの忠実性も要求されている
- アーキテクチャの改善を継続して行っている
- 更に安定性、柔軟性が上がっており、パイプラインも強化されている
フォワードレンダリングと遅延レンダリング
スケッチ
- スキマティックで確認する内容の簡易版
- 左上からレンダリングプロセスが始まる
スキマティック
- 全体図
- 全ては網羅していないが強力でよし使用されるもの
Frame 0 CPU
レンダリングの前処理
Frame 0は、物理、アニメーション、オブジェクトの位置に関係する部分
最初に何がどこでレンダリングされるかを決定するフェーズ
- レンダリングやオクルージョン可視性などの処理に入る前にCPUはレンダリングに関係しないものすべてを計算している
- 図 は上から実行し下に下っていく
- 1段目 CPU
- 2段目 ドロースレッドで基本的に可視性に関わる部分
- 3段目 GPUが処理を引き継ぐ
- 0フレームCPU → 1フレーム Visibility → 2フレーム
Frame 1 CPU Visiblility
ワールドに配置されているもののうち何が実際に見えているのかを計算するフェーズ
- 最初の図の2段目の処理
- 5ステップからなる。実際は4段階。図の一番上は全体を意味する
- 一番下から開始する
- 下から可能な限り計算を行い上の方では、まだ計算されていない残りの部分を計算する
- 上に行くほど重い処理の為、なるべく下のみで完結させ上に仕事を残さないような仕組み
- 一番下: 距離 カリング (デフォルトで有効ではない)
- すべてのメッシュにはどの距離では描画してほしい(要望)を設定できる
- それ以上に離れると消える
- すべてのメッシュ個別に設定するのが面倒なので、カリングボリュームで範囲指定できる
- すべてのメッシュにはどの距離では描画してほしい(要望)を設定できる
- 次: 視錐台 カリング
- 次: 事前計算された可視性
- 必ずしも使用されない。デフォルトで有効ではない
- モバイルデバイスやコンソールで使用すると効果的
- ローエンド、つまりパフォーマンスよりもメモリが重視される場合
- こちらから見ることができる。残念ながらActionRPGにはなかった模様
- 事前計算されたビジビリティ ボリューム (Precomputed Visibility Volume) | Unreal Engine Documentation
- 3D内に配置された様々なサイズのBOXがあり、それぞれのBOXはそのBOX内で見えるものを記憶している
- カメラがセル(BOX)に入ると、セルを確認して可視なもののリストを取得。可視な物があるセルは見ることができる
- これはオクルージョンプロセスの一部
- 次: 可視性カリング
- これはリアルタイム処理。デフォルトで有効
- 殆どの場合実行される
- 非常に負荷が高いため、前の3ステップで極力これを行わなくて良いものを除外している
- デフォルトではハードウェアオクルージョン
- すべてのメッシュが他のすべてのものに対するオクルーダとして機能する
- 確認方法: あるメッシュが画面いっぱいになるくらい近づいた状態で
freezerendering
コマンドを実行 - 離れるとほとんどのものがレンダリングされていないのがわかる。
- 解除するには再度同じコマンドを行う
- モバイルデバイスではハードウェアオクルージョンが行えるかどうかは定かではない
- 多くの場合ソフトウェアオクルージョンが使用できる
- こちらはハードウェアオクルージョンと違い多くの場合で利用可能
- ハードウェアオクルージョンと同じことを行うが、メッシュLODをオクルーダとして使う
- こちらはハードウェアオクルージョンと違い多くの場合で利用可能
Frame 2 GPU
レンダリングフェーズ
早期Zパス
- 存在を知っていれば十分。通常これに対し何かを行うということはない
- ここではシーン深度を計算する
- シーン深度 = Z
- 設定の変更も可能。存在だけ認識していてくださいとのこと
Basepass でレンダリング
いろいろな方式でレンダリングしGBufferに格納する
- レンダリングの最も重要なステップの一つ
- Draw Callがありすべてのメッシュが関係する
- 動的インスタンス化があり
- ベースパスマテリアルがある
- ライトマスもある
- ドローコールは柱→椅子→デスク…などのようにレンダリングを順番に行っていく。パスを通っているみたいなのでベースパスと言われる
- GPU Visualizer (ctrl + shift + ,) からはBasspassのレンダリングの内容が確認できる
- この画面だと3つのドローコールがある
- ライトマスの解説もあるが、別のチュートリアルを行ったのとレンダリング時の処理ではないという認識のためスキップ
- まず3Dで、レンダリングが必要なすべてのものを選択
- すべてはドローコールになる
- RenderDocというプロファイルツールを使えば確認は可能
- DrawCall
- メッシュ上にあるマテリアルでもパスを実行する(Basspass Materials)
- 動的インスタンス(Dynamic Instancing)
GBuffer
GBufferは5つのイメージに過ぎない。このイメージをもとに残りのディファーどレンダリングを実行する
- Basepassの結果がGBufferに書き込まれる
- 5つのバッファから構成される
- ここではダイナミックライトとダイナミックシャドウについての解説
- 確認方法
Dyn Lighting/Shadows 動的ライティングと動的影
- 多様な機能が組み合わさったもの
- 近頃のリアルタイムレンダラの場合と同様に、この時点で多くの機能がある
- 非常に専門化している
- 影をレンダリングするだけではない
- 影のソリューションは多くの機能から成っている
- 例えば屋内の影と屋外の影は全く異なる処理を行っている
- つまり個別の事にはそれぞれ様々なソリューションがある
- 大きく直接と間接で分かれ、それぞれ光と影で分かれ計4つのグループがある
Dynamic Light
- IES テクスチャ
- IESはテクスチャの一種だが、特殊なテクスチャのため開いても確認できない
- IESは業界標準フォーマットでゲーム業界以外でも使用されている
- Light Function
- ライトにブレンドされるマテリアルを選択可能
- 壁に反射する水面の光
- ライトにブレンドされるマテリアルを選択可能
Dynamic Shadow
- シャドウは遥かに複雑
- 一般的にレンダリングは重くなる
- 標準のダイナミックシャドウがある
- 一般的にダイナミックシャドウはキャッシュされる
- キャッシュする理由
- 多数のポイントライトがあったり他の種類のライトがあると床に明確なシャドウが現れる。
- キャッシュがないとパフォーマンスが落ちる。とのこと
- 多数のポイントライトがあったり他の種類のライトがあると床に明確なシャドウが現れる。
- キャッシュする理由
Cascaded shadow maps
- 屋外環境で重要
- シャドウのレンダリングは重いためランドスケープ全体で行うものではない
- 一定の距離で消すことが必要となってくるが、ただ消すと美しくない
- 可能な限りパフォーマンスを維持しながら徐々に消す。この目的に使われるのがカスケードシャドウマップ
- 距離の設定場所
- 0は無効
- 低品質、中品質、高品質がある
- Distance = 0のときはグレーアウト。数値は 0 ~ 4。高いほど高品質
- デメリット
- 計算が重い
- 消え方が美しくない
Distance Field Shadows
- Cascaded shadow mapsを改善するために生まれた
- 本当の課題はシャドウマップに対しジオメトリを考慮する必要がある
- しかしジオメトリを考慮すると重くなる
- ジオメトリを考慮せず2ポイント間の距離が導出できないか?
- → 事前計算された情報があれば。例えばテクスチャを見るだけで実行できれば高速になる
- モデルの形状をテクスチャに入れることができれば高速になる。
- それが距離フィールド
- 距離フィールドは基本的にホログラムのようなもの
- この関数は常に面(surface)からの距離を返す
- こちらから可視化する事ができる
- 配置されたメッシュに近づけばあまり制度が高くないことがわかる。
- 離れた距離にあるものに対して作用させるもの
- コストは低くなるが品質も落ちる
- メモリのコストは掛かる。距離フィールドを保存する必要があるため
- 有効であればマテリアルエフェクトなどにも使用可能
- マテリアルが地面に近づいているかこのデータを参照し、近づいているならマテリアルに効果を加えるなど。
- デメリット
- スケルタルメッシュでは機能しない
- メリット
- アンビエントオクルージョンのコストが下がる
Raytraced Shadows
- 2019/3頃レイトレーシングの最初の公式バージョンが追加された
- スケーリングしたりすることが可能
- 有効無効が切り替えられる
Inset shadows
- より高いクオリティのシャドウ
Contact shadows
- 2つのオブジェクトが接近しているときに機能するシャドウ
- 講師の方は使わないとのこと
- また事後処理のセクションで使われるものとの事
- スクリーンスペースエフェクトでシャーフェスに小さいコンタクトシャドウを作成しようとする
Indirect Lighting/Shadows 間接ライティングと間接シャドウ
Light
Light Propagation
- 古いリアルタイムのグローバルイルミネーションシステム
- 時代遅れなもの
- 自由に試せるが、プロダクションでは使用をおすすめしません。とのこと
Raytraced GI
- エンジンで実行するには複雑なもの
- Light Propagationとこれは一般にゲームでは使用されていない
Shadow
- 間接ライトとは違いよく使用される
- Capsule shadowとDFAOは殆どの屋外環境でほぼいつも使用される
Capsule shadows
- 非常に簡素化されたシャドウ
- どのスケルタルメッシュでも機能する
- 影が簡素化されている
- 強い光がないところでは非常に有用
DFAO (Distance field AO)
- 可動スカイライト、固定スカイライトが必要
- 大きなAOに使用され細かいものには使用されない
- スカイライトに関係するもの
- ワールドの距離フィールドメッシュをつかてAOができる
- 屋外環境向けで屋内ではあまり意味がない
- 例えば洞窟がある場合、シャドウのレンダリングを行っていなくても内部は暗くなる
- 非常に素晴らしい機能
- これを使用する場合は、アクタのスケールを大きく変更するべきではない
Raytraced AO
- レイトレースされるAO
- 非常に高速にレンダリングされ素晴らしく見える
Refrection 反射処理
- 3種類の機能 + レイトレースされたもので計4の機能がある
- 反射は階層構造のセットアップ。
- Reflection Captureから始める
Reflection Captures
- 最も簡単なため最初に処理を行う
- プローブごとに反射をローカルに保存。静的で高速、基礎を提供します。
- この球内にあるピクセルは、この点でキャプチャされたキューブマップでブレンドされる
- これは単に静的で単一のキューブマップキャプチャ
- メモリやディスクに格納されピクセルがブレンドされる
- レンダリングは早いが正確ではない
- このシーンでは大きな球リフレクションと小さな球リフレクションが配置されているよう
- 大きな球の役割(中心に1個)
- 汎用のフォールバックとして機能。最小限のものをキャプチャする
- 小さな球の役割(色んな所に散りばめられている)
Planar Reflections
- 平面や反射性が高い面に有用
- 必要なピクセルの実行を試す
- 床は平面反射を使用している
- 床には機能するが、壁には機能しない
Screen Space Reflection
- 品質の調整を行う
- ここにくるまでに処理が必要なピクセル数の最小化を試みる
Additional 追加処理
- フォグ
- 透過処理
- ゲームエンジンのリアルタイム処理の課題
Atmospherics 大気関連
- 指数関数的高さフォグは遠くなり高くなるとフェードアウトする
- 大気フォグは単色ではなく少し複雑なフォグをレンダリングしようとする
Volumetric Fog
- 指数関数的高さフォグで実行できる
- フォグ密度を0.2と非常に高くしてテストしてみる
- ボリュメトリックライトマップを使用している
- 自身をそれと同じ色にする
- 静的ライティングに大きく依存している
- なくても動作はするが角の影など詳細が一部失われる
Volumetric Materials
- マテリアルシステムですべて実行される
Distance Fog
- 指数関数的高さフォグの一部として存在
Physically Based Sky Atomosphere
- ワールドビルディングで解説済みなのでスキップとのこと
Translucency 透過処理
- 現時点ではリアルタイム処理での実行が難しい
- 課題が多くあり、UE4でも多くのソリューションがある。先に進むためにそれらの理解が必要
Refraction
透過処理での屈折を扱う
– Pixel Normal Offset
– 水面のようなフラットなもの
– Index Of Refraction
- ここを通った光がどう屈折するかという設定ということですね。
Lightning Mode
- マテリアルクラス
- ブレンドモードとシェーディングモデルが設定可能
- ブレンドモードとシェーディングモデルが設定可能
- シェーディングでUnlit(非ライティング) にすると最も高速にレンダリングできる
- Default Litで透過処理が可能
- ScreenSpaceReflectionは正確で素晴らしいが重くなる
- Lighting Modeの設定もできる
- パフォーマンスと品質に影響
- Volumetric Nondirectional(ボリュメトリック非平行光源)が最も軽い
- Volumetric PerVertex は上記と同じくらい
- Surface ForwardShadow は最も高価で最もきれい
Post Processing 後処理
- UE3のときにはすでに存在していた
- デフォルトでは殆どが有効になっている
- Post ProcessingはPost Processing Volumeにある
- またはプロジェクト設定からも使用可能
- ボリューム内だけではなく世界全体に影響を及ぼすオプションが有る
- Infinite Extent にチェックを入れるとレベル全体になる
- 設定は詳細パネルにあり、ほとんどが有効になっている
- Infinite Extent にチェックを入れるとレベル全体になる
Tonemapper
- 色修正
- 色合いの修正
- コントラスト
Bloom
SSAO (Screen Space AO)
- 特に追加情報はなし
SSSSS (Screen Space Sub Surface Scattering)
- 特に追加情報はなし
- 講師の方が言いにくそうでほっこりする
Burley SSSSS (Screen Space Sub Surface Scattering)
- 特に追加情報はなし
- 講師の方が言いにくそうでほっこりする
SSGI (Screen Space Global Illumination)
- 最近追加されたもの
- SSを通じてグローバルイルミネーションの近似を試す
被写界深度DOF (Depth of field)
- 3つのタイプ:ガウス、ボケ、円形/シネマティックがある
- ボケが一番高価。一定の距離で取り除く。
- 円形/シネマティックで代用できるため
- 円形/シネマティック
- 見かけもよく、重くもない
- ガウスは最も軽い。一般的にゲームに使用する
Exposure (露出)
- デフォルトで有効
- 表示モードでの設定
- 詳細パネルから設定可能
ブレンド可能 Blendable
- マテリアルエディタを使用してポストプロセスを変更する
- 非常に協力で面白い部分
- 講師の方はいろいろなものにいつも使用するとのこと
- わかり易い例として水の中に入ったときに空間が歪んでいる様が紹介されていた
- 火や煙などに使える
- プレイヤー状態の変更にも使用できる
- 例えば攻撃を受けたときに赤のフラッシュを表示させるなど
カメラエフェクト Camera effects
- Blendableもカメラエフェクトの一種と言えるが、こちらはビルトインのもの
- 常にエンジンの一部
- 詳細からオンオフ切り替えができるが、それが意味するのはボリュームの上書きのオンオフであり、機能のオンオフではないとのこと
Performance
- 基本的にワールドビルディングで説明した内容と同じとの事。
- ワールドビルディングd絵解説しなかった CVars について解説をするとのこと
コンソール変数 CVars
- コンソールで入力できるすべてのもの
r.
と入力すると多くの候補が表示される。これらはコンソール変数r.rendering
はレンダリングに関連している変数- ここでデバイスごとに機能のオンオフが可能。とのこと
help
を実行するとヘルプページがブラウザで開かれる- コンソールで変更したものは保存されていないためエディタでレベルを開き直すとリセットされている。
- 上書きされる心配がないので色々と試すことが可能
- プレイ中であっても変更可能
Scalability Example
アドバイス
高パフォーマンスでシーンをレンダリングするためのヒントとコツを紹介
- 高度なヒントとトリック、そしてやるべきこととやってはいけないこと。
- すぐに明らかにはならないもの
- 開始時に教えてほしかったトピックなどを紹介
Managing tris and draw cells
Statistics Panel
- 統計情報パネルは本当に有用。
- 環境内にあるものの概要を教えてくれる
Merging Meshes
- アクタをリアルでマージする組み込みツールが有る
- 描画呼び出しなどの理由でモデルを組み合わせたい場合、その機能があるので可能
- アクタ右クリック→アクタをマージ
- マージするアクタに別々のマテリアルがある場合はプロキシが使える。内部的に
- 2つのマテリアルを組み合わせて新たなテクスチャを作成する
- メッシュが交差している場合は交差部分をカットし、ポリゴン数を減らす
- これは遠距離のジオメトリにより適している
- 遠いので詳細がいらないからということですね
- HLODメッシュがこれを使用している
Detail mode
- ワールドディテールが低に設定されていてメッシュまたはアクタが高に設定されていたらそのメッシュまたはアクタを削除する
- 削除可能な詳細なワールドセッティングを消したりする事が可能
Shadow Rendering
- CSM(カスケードシャドウマップ)/DF(ディスタンスフィールド)のバランスに気をつけること
- CSMは最初の予測よりもずっと近くで終わる(3000から4000ユニットくらいの話)
- その後は20000~30000くらいまでDFが引き受ける
- この数字には気をつけてください
遠方シャドウ(Far Shadow)
- おそらく誰も使っていないが面白い機能です。
- 指向性ライトの詳細にある
- 第2のCSMのセットを設定できる
- 特定のモデルと遠距離に対してのみ
- 言うなれば後方の遠距離のCSM
- 少し旧式の機能
- ディスたんとフィールドに今は置き換わっているが、良い機能とのこと
Toggling/Light Range
- ライトの範囲を設定できる
- 時々必要となる機能
- 任意のライトの最大描画距離の設定ができる
- BPからでも制御可能
- 2秒ごとにカメラとライトの距離を測ってONOFFするなど
マテリアルコスト Material Cost
ここにあるものはマテリアルのクラスでも取り扱っている。レンダリングにも関連するためここでも触れる。詳細はマテリアルクラスを参照くださいとのこと
- あるものは非常に高価。例えばノイズ
- クオリティスイッチはいずれ重要になる
透過処理 Translucency
- 可能であればライティングなしを使用してください
- 常にレンダリングを改善できる
- 透過処理サーフェスの命令数は重要です
- パフォーマンスにかなり大きな影響を与えます
- もしライトニングありなら ボリュームモードと CVars を使ってください
- 可能なら Volumetric Non Directional を使ってください
- シャドウがぼやけます
- 最も負荷が低いです
- 可能なら Volumetric Non Directional を使ってください
- 前進 + 反射は非常に高価
- ディザリング透過処理
- エンジンに組み込まれている
Baking Light
- 多くの異なるレベルがある大きなワールドではライトのベイクが起こる場合すべて有効にする必要があります
- すべてのレベルを同時にロードする必要がある
- レベルごとにライトをベイクする事はできない
- つまり大きなワールドの場合はPCがそれをロードできるのか確認する必要がある
- ライトマスインポータンスボリューム
- ライトベイクするときは忘れないでください
- メトリックライトマップのヒントに従ってください
- ワールドプロパティのプロパティであるセルのサイズを設定できる
- 配置するボリュメトリックライトマップの数に関してセルのサイズを変更し、ボリュームを使用してこれを補助する
- 一般的にライトにかかるビルド時間は非常に早く、すべてに関連する
- それでも実際のコストはライトマップの解像度、ライトの数、メッシュの数、ソース半径、実際の半径の組み合わせで決まる
Reflections
- 球リフレクションキャプチャでベースレイヤーを作成する
- 次に詳細なリフレクションを作成する
- レベルごとの反射キャプチャの数の上限は 351や321などそのあたり
- 通常は50から100程度で、そこまで大量にはならない
最後に
全体像が少し見えてきた気がします。しかし何度も見直し整理しないとわかりませんね。
メモ
- 基本的に大規模での開発で使用する部分はスキップしています
- スケマティック
- 図式的な、概容を示すなどの意味
- カリング距離ボリュームの役割
- ボリューム内のメッシュにそのサイズに応じてカリング距離値を与える
- Kisnetとは?マチネとは?
- 変形をするとき、頂点シェーダーを利用する
- Build Geometry はBSPブラシ ジオメトリを再ビルドする
- performance の statツールは便利そう
- バッチ処理というのは行う処理が同様のものを集めて一気に処理する手法のよう
- 距離フィールドはスケールが1に近いものであれば正確
- スキマティック
- ひし形は処理
- 角丸四角は変数?
- Screen Spaceエフェクトは一般にスキンや葉などに使用する
- コンソールの開き方。通常は Escキーの下のチルダとの事。USキーボードの場合
- しかしチルダを押しても出てこず
- 検索し @に割り当てるなどの手法が紹介されていたがそのとおりに行っても出ず
- デフォルトでは「`」ということなのでやってみてもです
- という事で私はアウトプットログを開いてそちらから実行