195.6K Views
August 25, 16
スライド概要
2016年8月25日にパシフィコ横浜にて開催されたCEDEC2016の講演資料です。UE4のレンダリングフローの概要を説明しています。(Epic Games Japan 篠山範明)
http://cedec.cesa.or.jp/2016/session/VA/12631.html
Unreal Engineを開発・提供しているエピック ゲームズ ジャパンによる公式アカウントです。 勉強会や配信などで行った講演資料を公開しています。 公式サイトはこちら https://www.unrealengine.com/ja/
Unreal Engine 4 の レンダリングフロー総おさらい Epic Games Japan Senior Support Engineer 篠山 範明 16:30 5
はじめに
本日の内容 UE4のRenderingのフローを俯瞰で見て、 各要所のTipsを見ていきます。
Renderingの調整は 日々クオリティとパフォーマンスとの戦い。 Quality Performance Iteration
Renderingの調整は 日々クオリティとパフォーマンスとの戦い。 Quality Performance Iteration 誰の仕事?
UE4は、アーティストでもPerformance解析をできるような 様々なツールを用意しています。
ツールの存在は知られているが、 あまり使われていないのはなんでだ?
UE4のレンダリングの知識を ある程度把握しないと使いにくいのではないか?
例えば、こんなシーン
UE4のDeferred Renderingの一般的なイメージ Base Pass Lighting Post Process
完成
“ProfileGPU” コマンドor “Ctrl + Shift + ,”で Renderingの処理の流れが見えます。
何をやっているのがよくわからない処理も あるのではないでしょうか? ?
Base Pass Lighting Post Process このイメージだけでは足りないのでは?
本講演の目標 Renderingの流れと、中で何が行われているかを理解する。 その際に開発で重要となるTipsや機能を知り、 日々の開発や意思決定をスムーズにする。
本講演の目的 このIterationをアーティストが自身で回すためのとっかかりに。 Quality Performance Iteration
本日の対象者 UE4を用いて日々開発を行っている アーティスト、 テクニカルアーティスト (エンジニア)
本日話さない事 • Render Thread からRHI Threadへのコマンドの積み方 • RHI ThreadからGPUコマンド発行プロセス • 俺俺G-buffer拡張方法 • .usfのコンパイルプロセス • DX12が(以下略)
本日の非対象者 UE4の内部Renderingフローと 日々格闘しているエンジニアの方 (特に、FDeferredShadingRender::Render()以下の流れを熟読しているかた。)
本日のアジェンダ • Renderingフローをもう少し掘り下げる • 各項目毎に掘り下げる • Z-Prepass • BasePass • (Custom-Depth/Stencil) • Lighting • Transparency • Reflection • Fog • まとめ(振り返り)
備考 • 本資料はすぐにアップされます。 説明で出てくるコマンドを逐一メモする必要はありません • エディターは英語版で説明を行います。 • UE4.13を想定しています。 • 質疑応答は予定しておりません。
本日のアジェンダ • Renderingフローをもう少し掘り下げる • 各項目毎に掘り下げる • Z-Prepass • BasePass • (Custom-Depth/Stencil) • Lighting • Transparency • Reflection • Fog • まとめ(振り返り)
Renderingフローを もう少し掘り下げる (一階層だけ深く) 16:35 5(2)
Base Pass Lighting Post Process
Base Pass Lighting Post Process
Base Pass Lighting Transparency Post Process
Base Pass Lighting Reflection Transparency Post Process
Base Pass PreLighting Decal Lighting Reflection Transparency Post Process Ambient Occlusion
Z PrePass Base Pass PreLighting Lighting Reflection Transparency Post Process
これらを大まかなブロックとして、 ブロック毎に掘り下げていきたいと思います。 Z PrePass Base Pass PreLighting Lighting Reflection Transparency Post Process
Z PrePass Base Pass PreLighting Lighting Reflection Transparency Post Process Base Pass 一番重要かつ基本のパス 16:37 7(15)
Base Passで行われること Opaque / Maskedマテリアルのオブジェクトを レンダリングし、G-bufferを作成する。
G-Bufferとは 後のライティングやポストエフェクトで使われるための中間バッファ。
BasePassの描画順を視覚化
Base Pass の注意点 BasePassはジオメトリ投入のコストが直に反映される場所なので、 処理負荷になりやすい場所です。 少し時間をとって、BasePassの注意点を見ていきます。
Vertex Shader Rasterizer Pixel Shader そのために、一般的なGPUレンダリングのおさらいを先にします。 アセットやアクタを置く人のための、非常に非常に非常に簡略化したものです。
Vertex Shader 1. SkeltalMeshなどのアニメーションを頂点に反映 VertexBufferが計算すること
Vertex Shader 1. SkeltalMeshなどのアニメーションを頂点に反映 2. カメラから見て、そのポリゴンをがどこにあるかの計算 Vertex Shader が計算すること
Rasterizer Rastarizerがすること 2. ポリゴンから 描画ピクセルを決定 (計算はしない)
そのポリゴンを 破棄 カメラの外にあったら。。 1. フラスタムカリングなどの カリング処理 Rasterizer Rastarizerがすること 2. ポリゴンから 描画ピクセルを決定 (計算はしない)
ラスタライザが出力した、各ピクセルの色を決める計算をする (BasePassでは、G-bufferに様々な要素を格納するだけ) Pixel Shader が計算すること Pixel Shader
破棄 Vertex Shader Rasterizer 簡単なレンダリングフロー。 Pixel Shader
Base Passで注意すべきこと • 無駄な頂点を計算させない • 無駄なピクセルを計算させない • 無駄にシェーダを重たくしない (こちらはマテリアル作成の問題で今回は触れない)
Base Passで注意すべきこと • 無駄な頂点を計算させない カメラに入らないオブジェクトをGPUに投入させない • 無駄なピクセルを計算させない • 無駄にシェーダを重たくしない (こちらはマテリアル作成の問題で今回は触れない) 8(5)
例えば、こんなメッシュを頑張って作成してみたものの。。
このキャラクタ一体しか見えないシーンなのに、 処理負荷がめちゃくちゃ高い!!
処理負荷の原因は、画面に見えないはずの大量のロブさん
(CPU) Frustum Culling 見えない! Object 見える Object Object 見える?? オブジェクトのバウンスを調べ、 画面外のオブジェクトをGPUに計算させない機能
良いバウンス 悪いバウンス 不必要におおきなバウンスはGPUの負荷につながります 友情出演
無駄な頂点を計算させない カメラに入らないオブジェクトをGPUに投入させない。 コックピットならば、前後左右を一体で作ると、 全く見えない後ろのポリゴンもマイフレームGPUが計算してしまう。 Kentuckyguard http://free-photos.gatag.net/2014/06/06/160000.html
Stat InitViews コマンドで、 どれだけ事前にオブジェクトをカリングしたかわかる。
FreezeRendering コマンドで、 その時点でのカメラのカリング結果を見ることができる。
無駄な頂点を計算させない カメラに入らないオブジェクトをGPUに投入させない。 破棄 では、どれだけがGPU内で不用意に頂点計算されているか? (フラスタムカリングさているか?)
無駄な頂点を計算させない カメラに入らないオブジェクトをGPUに投入させない。 Init Views や FreezeRendering で、 画面に映らないオブジェクトがGPUに投入されていないか確認してみましょう。 また、各プラットフォームのGPU解析ツールで、 GPUから見たプロファイルもできます。 (こちらは、エンジニアにお願いしましょう!)
Base Passで注意すべきこと • 無駄な頂点を計算させない カメラに入らないオブジェクトをGPUに投入させない • 無駄なピクセルを計算させない • 無駄にシェーダを重たくしない (こちらはマテリアル作成の問題で今回は触れない)
Base Passで注意すべきこと • 無駄な頂点を計算させない カメラに入らないオブジェクトをGPUに投入させない • 無駄なピクセルを計算させない • 無駄にシェーダを重たくしない (こちらはマテリアル作成の問題で今回は触れない) 16:43 13(+7)
Depth Test のGPU内部の動作
Depth Test Color Buffer 0. 何もないシーンに。。。 Depth Buffer
Depth Test ① Color Buffer 1. 赤いポリゴンが描画されて。。。 Depth Buffer
Depth Test ① ② Color Buffer Depth Buffer 2. 青いポリゴンが描画されて。。。深度比較されて遠くのオブジェクトは消える。
Depth Test ① ② Color Buffer Depth Buffer Q. この赤の裏に隠れた青のピクセル達は、計算されるんでしょうか???
描画の流れをGPU的に追っていきます。 Vertex Shader Rasterizer Pixel Shader Color Buffer Depth Buffer
描画の流れをGPU的に追っていきます。 Vertex Shader Rasterizer Pixel Shader Color Buffer Depth Buffer 頂点シェーダで、画面のどこにポリゴンがあるかを計算します。
描画の流れをGPU的に追っていきます。 Vertex Shader Rasterizer Pixel Shader Color Buffer Depth Buffer ラスタライザでそのポリゴンがどのピクセルを埋めるかを判断します。
描画の流れをGPU的に追っていきます。 Vertex Shader Rasterizer Pixel Shader Color Buffer そしてPixel Shaderでピクセルの色を計算する Depth Buffer
描画の流れをGPU的に追っていきます。 Vertex Shader ? Rasterizer Pixel Shader Color Buffer Depth Buffer Pixel Shaderの前に、各ピクセルに描画されるデプスは決まってすよね?
描画の流れをGPU的に追っていきます。 Vertex Shader Rasterizer Pre Z Pixel Shader Color Buffer Depth Buffer PreZ: Pixel Shaderの前でDepth Test及びDepth Writeを行う
描画の流れをGPU的に追っていきます。 Vertex Shader Rasterizer Pre Z Pixel Shader Color Buffer そしてPixel Shaderでピクセルの色を計算する Depth Buffer
描画の流れをGPU的に追っていきます。 Vertex Shader Rasterizer Pre Z Pixel Shader Color Buffer 次に青いポリゴンが奥に投入されても。。。。 Depth Buffer
描画の流れをGPU的に追っていきます。 Vertex Shader Rasterizer Pre Z Pixel Shader Color Buffer PreZで先にDepth計算と比較をするので。。。 Depth Buffer
描画の流れをGPU的に追っていきます。 Vertex Shader Rasterizer Pre Z Pixel Shader Color Buffer Depth Buffer Pixel Shaderでこの重なった部分のピクセルは計算されません。 めでたしめでたし。。。
Vertex Shader ? Rasterizer Pixel Shader Color Buffer Depth Buffer Pixel Shaderの前に、各ピクセルに描画されるデプスは決まってすよね? 本当か?
Vertex Shader Rasterizer Pre Z Pixel Shader Color Buffer Depth Buffer Pixel Shaderを走らせないと最終的なDepthがわからない例: 1 アルファテスト
アルファテストを行うMaskedマテリアル
Vertex Shader Rasterizer Pre Z Pixel Shader Color Buffer Depth Buffer Pixel Shaderを走らせないと最終的なDepthがわからない例: 2 Pixel Shader内部で無理やりDepthを書き換える
PixelのDepthを変更するPixel Depth Offset
Vertex Shader Rasterizer Pre Z Pixel Shader Post Z Color Buffer Depth Buffer この様なシェーダに出くわすと、GPUは自動的に、 シェーダを計算してからDepth処理を行う、Post Zというものに切り替えます。
これらを意識していないと、 PreZがOffになり、 不要なPixel Shaderが走る可能性があります。
Vertex Shader Rasterizer Pre Z Pixel Shader Post Z 駄目な例: 不透明だけどとりあえずMaskedにパラメータ入れておく
Vertex Shader Rasterizer Pre Z Pixel Shader Post Z 駄目な例: 使わないけど、Pixel Depth Offsetをパラメータ化
マスターマテリアルに汎用性を持たせるために、 MaskedやPixel Depth Offsetをパラメータ化している場合、 PreZが走っているかのチェックが必要です。
PreZ / PostZどちらが走るかは、 GPU内部の処理のため、UE4では観測できません。 エンジニアにお願いして、 各プラットフォームのGPUプロファイラを使ってください。
Base Passで注意すべきこと • 無駄な頂点を計算させない カメラに入らないオブジェクトをGPUに投入させない • 無駄なピクセルを計算させない PreZの効果を不必要に消させない • 無駄にシェーダを重たくしない (こちらはマテリアル作成の問題で今回は触れない)
BasePass まとめ Base PassはG-bufferを作成するフェイズです。 OpaqueとMaskedマテリアルが投入されます。 オブジェクトの投入が直に響く箇所です。 バウンスの設定を確認し、無駄な頂点計算をさせないように。 マテリアルを確認し、無駄なピクセル計算をさせないように。
Advanced: G-Bufferの拡張 20(2)
G-Bufferの拡張(エンジン拡張) もんしょさん(@monsho1977)の上記の記事では、 実際にソースコードを改変して、G-Bufferを拡張する方法を説明しています。 http://monsho.blog63.fc2.com/blog-entry-191.html
おぎまふさん(@ogimafu) はG-Bufferを拡張し、 独自のToon Shadingを実装 http://www.slideshare.net/TomohiroOgiwara/ue4meetup-63696087?ref=http://ogimafu.blogspot.jp/2016/07/3ue4meetup.html
ノンフォト描画については、G-Bufferを拡張しないで表現する方法などを、 弊社下田が中心にUE4 Forumで議論しております。 https://forums.unrealengine.com/showthread.php?88581%E3%82%A2%E3%83%B3%E3%83%AA%E3%82%A2%E3%83%AB%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%B34%E3%81%A7%E3%83%8E%E3%83%B3%E3%83%95%E3%82%A9%E3%83%88%E3%83%AA%E3%82%A2%E3% 83%AB%E6%8F%8F%E7%94%BB%E3%81%97%E3%82%88%E3%81%86%EF%BC%81
G-Bufferの精度の制御 Project Settings の Rendering内で、G-bufferの精度を変更できます。 映像系など高精細な絵作りが必要な場合、精度を上げてください。
Z PrePass Base Pass PreLighting Base Pass 一番重要かつ基本のパス Lighting Reflection Transparency Post Process
Z PrePass Base Pass PreLighting Lighting Reflection Transparency Post Process Z prepass 16:52 22(3)
Z Prepassとは? Base Pass 全オブジェクトを 毎回G-bufferに書き出して。。。 とやるのは処理負荷が高い。。
Z Prepassとは? Z PrePass Base Pass Depth-Bufferのみを作成するパスを BasePassの前(pre)に仕込んでおく。 BasePassで実際にG-Bufferに書き出す のは前もって用意したデプスに勝つピ クセルのみとなり、処理負荷が減る “可能性”がある。
Z Prepass Off ver. のBasePass描画
GOAL
Z Prepass ON ver. の BasePass描画
Z prepassで背景のデプスバッファを作成
Z Prepassの設定場所(Project Settings) Project Settings / Rendering内の Early Z-passというタブでおこなえる。 また、下のMovables in early Z-passでMovableメッシュもこのEarly-Zに参加させるか指定可能
Decide Automaticallyの挙動 Defaultのこの設定ですが、十中八九Opaque Meshes Onlyになると考えてOKです。
Z Prepassの各オブジェクトの設定場所 (Use as Occluder) 各オブジェクトのRenderingタブ内に、 “Use as Occluder”という項目がある。 この設定がDefaultでONだが、これをOff にすることで、Early-Zへの参加の有無を オブジェクト単位で調整できる。
Z prepassの効き目と注意点 Z prepassは、 BasePassのピクセル処理負荷を下げる代わりに。。。 Z prepassでもジオメトリを投入します。 ポリゴン数が多いシーンでは、 逆にZ Prepassが処理負荷につながるケースもあります、 こちらをOn/Offしてみて、 採用の判断をしていただければと思います。
Z PrePass Base Pass PreLighting Z prepass Lighting Reflection Transparency Post Process
Custom Depth / Stencil Z PrePass Base Pass PreLighting Lighting Reflection Transparency Post Process Custom Depth/Stencil ちょっと脱線。。 16:55 25 (3)
Custom Depth/ Stencil 本来のDepthBuffer もう一つ別のDepthBuffer 特定のメッシュのDepthだけを別バッファに書き出す機能とそのバッファ名
Custom Depth/ Stencil Project SettingのRendering項目にある、 “Custom Depth-Stencil Pass”をONにしてください。
Custom Depth/ Stencil 各メッシュのRender CustomDepth Passにチェックをいれる
Custom Depth/ Stencil 試しにキャラクター全部のカスタムDepthをONにしてみる。
Custom Depthなし Custom Depth Custom Depthあり Alweiさん(@aizen76) の上記のブログでも Toon ShadingのマスキングのためにCustom Depthを使用 http://unrealengine.hatenablog.com/entry/2016/05/30/220000
らりほまさん(@rarihoma) の上記のブログでは D言語君のマスクとしてCustom Depthを使用 http://rarihoma.xvs.jp/2015/02/22/1/#customdepth-
Custom Depth/ Stencil Q. Custom Depth を作成するのは重たいでしょうか?
Custom Depth/ Stencil A. Custom Depth を描くオブジェクトが増えれば増えるほど、重たくなります。
Custom Depth/ Stencil 先ほどのシーンでプロファイルしてみます。
Custom Depth/ Stencil 処理負荷比較 BasePassのキャラクターレンダリング負荷 Custom Depthもほぼ同等の負荷がかかります
Custom Depth/ Stencil Custom Depth / Stencilにチェックを入れたオブジェクトは、 もう一度オブジェクトがGPUに投入されて計算されます。 その分GPUコストにつながるので、 ちゃんとプロファイリングして使ってください
Custom Depth / Stencil Z PrePass Base Pass PreLighting Lighting Reflection Transparency Custom Depth/Stencil ちょっと脱線。。 Post Process
Z PrePass Base Pass PreLighting Lighting Reflection Transparency Post Process Pre-Lighting Decal & AO 16:58 28(5)
Decal Ambient Occlusion テクスチャをプロジェクションする。 弾痕や血しぶきとか。。 疑似的なライティング遮蔽情報 物体の接地感やディティールの増幅に
Z PrePass Base Pass PreLighting Lighting Reflection 後のLighting等で使われるので、 前もって処理しておく必要がある Transparency Post Process
Ambient Occlusion
AO • Ambient Occlusionとは?
Decal
Decal をUE4コミュニティの方達の資料を用いて紹介したいと思います。
栗坂こなべさん(@kurisaka_konabe)の記事を参照させて頂きます。 http://konabe.blog.jp/archives/33883823.html
インクが付くようなエフェクト、 右の図の様にプレーンを置くとなると、ぎりぎり面の上に置かなければいけないし、 壁際のコーナーなどでは不具合が生じる
Decalはボックス形状で、プロジェクションするので、 複雑なオブジェクトにも対応しています。
Decalは便利なのですが。。。 事前に焼き付けたライティングの干渉など、 ライティングの問題が多いです。
ずしさん(@shiba_zushi)の ツイートを参考させて頂きます。
https://twitter.com/shiba_zushi/status/736443001820454912
https://twitter.com/shiba_zushi/status/736443290791202816
https://twitter.com/shiba_zushi/status/736443563806838785
アンコウさん (@dgtanaka) もこの問題について取り組んでいます 「スカイライトを配置するとデカールが透ける問題調査」 https://trello.com/c/fkJo51iu/12--
UE4もくもく会 = (ソースコードリーディング会) にて資料を公開してくれています https://trello.com/c/fkJo51iu/12--
このライティングの不具合を解消するために D-Buffer という解決策をUE4は提供しています。
Project Settings / Rendering内にある D-Buffer DecalsをONにすることにより、この問題を解決できます。
https://twitter.com/shiba_zushi/status/736446424028569602
D-Bufferデカールの具体的な仕組みや負荷など、 詳細に記述してくれています。 https://twitter.com/shiba_zushi/status/736443563806838785
Z PrePass Base Pass PreLighting Lighting Pre-Lighting Decal & AO Reflection Transparency Post Process
Z PrePass Base Pass PreLighting Lighting Reflection Transparency Post Process Lighting 17:03 33(7)
LightのMobilityのおさらい LightMap生成用 ライト ShadowMap 事前計算ライト 事前計算なし ライト 全て事前計算 Runtime: Lighting 全てRuntimeで計算 事前計算: 静的オブジェクト のShadow Map
LightのMobilityのおさらい LightMap生成用 ライト ShadowMap 事前計算ライト 事前計算なし ライト 全て事前計算 Runtime: Lighting 全てRuntimeで計算 事前計算: 静的オブジェクト のShadow Map
ライティング事前計算機能: Lightmass
ライティング事前計算機能: Lightmass たった数時間で。
ライティング事前計算機能: Lightmass この計算をエディタの裏でしているのがLightmassです
ライティング事前計算機能: Lightmass 先月に、Lightmass専門の勉強会を行いました。 資料や情報がForumにあがっていますので、参考にしてください
@torashami 建築ビジュアリゼーションの真茅健一さんが、 ルイスバラガン邸をUE4で再現し、 その制作フローを講演してくれています
LightのMobilityのおさらい LightMap生成用 ライト ShadowMap 事前計算ライト 事前計算なし ライト 全て事前計算 Runtime: Lighting 全てRuntimeで計算 事前計算: 静的オブジェクト のShadow Map
LightのMobilityのおさらい LightMap生成用 ライト ShadowMap 事前計算ライト 事前計算なし ライト 全て事前計算 Runtime: Lighting 全てRuntimeで計算 事前計算: 静的オブジェクト のShadow Map
Stationary Lightのメインの制約
Stationary Lightのメインの制約 影付きStationary Lightを5つ以上重ねると、 5つ目以降のライトが”自動的に”MovableなLightになる。
Stationary Lightのメインの制約 “Stationary Light Overlap”で Stationary Lightの重なり具合を確認できます。 処理負荷が読めなくなるので、赤は基本的になしにしてください!
Stationary Lightの影については、 上記ブログが参考になります http://darakemonodarake.hatenablog.jp/entry/2015/12/16/UE4/Stationary
LightのMobilityのおさらい LightMap生成用 ライト ShadowMap 事前計算ライト 事前計算なし ライト 全て事前計算 Runtime: Lighting 全てRuntimeで計算 事前計算: 静的オブジェクト のShadow Map
Deferred Lightingは 影がなければ動的ライト沢山おいても軽い?
範囲の小さい Movable Lightを100個 VS 範囲の大きい Movable Lightを8個
Light Complexity Lightingの負荷を大まかに見積もる機能
範囲の小さい Movable Lightを100個 VS 範囲の大きい Movable Lightを8個 Light Complexityでの比較 (青->緑->赤と高負荷を示す)
Q: Deferred Lightingならライトを沢山おいていいのか? ライトを沢山を”置けます”が、 ライトが触れるピクセルが増えれば増えるほど処理負荷は増えます。 簡易的に、Light Complexityという機能があるので、 そちらで高負荷なライティングの場所を探りましょう。
発展編 Q. Static LightはRuntimeに影響受けないでしょうか?
発展編 Q. Static LightはRuntimeに影響受けないでしょうか? いいえ
発展編 Q. Static LightはRuntimeに影響受けないでしょうか? 試しにStatic Lightを3000個置いてみる。
発展編 Q. Static LightはRuntimeに影響受けないでしょうか? CPU プロファイラで見ると、 “Init Dynamic Setup”に処理負荷が。 UE4ではStatic Lightに何か変更があっ た際(Dirtyフラグが立った場合)、自動 で動的ライトに切り替える機能があり ます。 そのために、Static Lightのデータを、 ランタイム上でも一度チェックします
発展編 Q. Static LightはRuntimeに影響受けないでしょうか? いいえ CPU(Render Thread)の負荷になります
発展編 Q. Static LightはRuntimeに影響受けないでしょうか? UE- 31804で対応しています。
バグトラックが公開されました。
UE4のWebサイトから ISSUESを選択してください。
このバグはまだ公開されていなかったorz
LightのMobilityのおさらい 各種設定とその特徴を理解して、正しく使いましょう。 「とりあえずStationary 」はご法度
Z PrePass Base Pass PreLighting Lighting Lighting Reflection Transparency Post Process
Z PrePass Base Pass PreLighting Lighting Reflection Transparency Post Process Reflection 17:10 40(3)
Reflection Probe Screen Space Reflection Planar Reflection 事前計算で静的シーンの ReflectionMapを作成 動的に反射を作成、 画面に見えない反射は 表現できない 平面限定だが、完璧に 動的に反射を表現 重たいので映像向け
ドキュメントと、専用のサンプルまでと非常に充実している Reflection
Reflections Sample
静的なReflection エディタ内部で事前にキャプチャするか、 特定のCubeMapを指定できる。
静的なReflection Project SettingsでCaptureする CubeMapのサイズを変更できる。
静的なReflection 複数のReflection Probeの混ざり方
静的なReflection 複数のReflection Probeの混ざり方
Reflection Captureの数は 処理負荷につながる? 一個だけのReflectionCapture: 0.17ms 200個のReflectionCapture: 0.22ms
Reflection Captureの数は 処理負荷につながる? 200個のReflectionCapture: 0.48ms Radius = 200 200個のReflectionCapture: 2.01ms Radius = 1000
静的なReflection: 配置方法 Reflection Probeの処理負荷は “Reflection Environment Compute Shader XXXX”に出てきます Lightingパスのライトと同様、 Probeの数よりも、それらが寄与するピクセル数が多いほど処理負荷が高い。 よって、不用意に半径を大きくすべきではない。 (しかし、ライト程負荷が跳ね上がることはないので、 そこまでここがボトルネックになることはなさそう。。。)
静的なReflection: 配置方法 UE4 documentationに記載されている 配置方法。 全体を覆う赤: Reflectionがシーン全体で なくならないようにする 部屋単位で覆う青: メイン。大まかな整合性はここで定義 オブジェクトのディティールとしての緑: Reflectionが映える特殊なオブジェクト にのみ配置
動的なReflection Screen Space Reflection 長所 • 完全に動的にReflectionを生成 事前計算なし 短所 • 画面範囲外の反射は取得できない • ノイズが多い • 半透明の映り込みが正しくない
Planar Reflection 4.12から生まれた機能、平面のみ可能、 非常に高負荷で、シーンを二回レンダリングしているようなもの
Planar Reflection vs Screen Space Reflection SSRはあくまで画像範囲内の疑似的なReflection
Reflection Reflectionには静的なものと動的なものを組み合わせて実現します。 静的なものは配置方法を、 動的なものはクオリティと処理負荷を、 それぞれ意識して使用してください。 ReflectionはUE4 Docで詳細が沢山記載されているので、 そちらも併せて参考にしてください。
Z PrePass Base Pass PreLighting Reflection Lighting Reflection Transparency Post Process
Z PrePass Base Pass PreLighting Lighting Reflection Transparency Post Process 半透明 17:13 43(9)
半透明は UE4に限らず 現代のリアルタイムレンダリングの最大の課題の一つ
半透明の問題とUE4上の対策 1. Depth描画をしない 2. 描画負荷
Eeffectをシーンに置いてみる
Depthは何も書かれていない
半透明の問題とUE4上の対策 Depthを描画しないため Depthを用いるエフェクトで問題が起こる
Depth Of Fieldをかけてみる
この不一致を解決するために Separate Translucency という機能をUE4は用意しています。
それまでの パス Post Process 半透明描画 Lighting Depth Of Field パス
それまでの パス Post Process 半透明描画 Lighting Depth Of Field パス Separate Translucency Pass
Separate Translucency = ON
Separate Translucency OFF ON
Project 単位でSeparate Translucencyの設定 Project Settings / Rendering内
マテリアル単位で、 どちらのパスで描画 できるかも設定可能 (マテリアルの Translucencyタブ内)
Separate Translucency = ON 本来、遠くの煙にはボケてほしい。
それまでの パス Post Process 半透明描画 Lighting Depth Of Field パス Separate Translucency Pass Separate Translucency のパスは Depth Of Fieldがかからない
UE4 フォーラムでスレッドがあります。 「半透明描画とDOFを両立させる方法について」 より良いアイディアがあれば、是非議論していければと思います。
マテリアル単位で、Depth Of Fieldのパラメータを取得できる “Depth Of Field Function”ノード
DOF Functionなし DOF Functionあり
半透明の問題とUE4上の対策 1. Depth描画をしない 2. 描画負荷
画面全体の色を変えるPostEffect 煙のエフェクト一個 どちらが重たいでしょう??
ピクセル描画の主な負荷 = 各ピクセル描画の重たさ * ピクセル数
ワイヤーフレーム表示 煙のエフェクト一個 半透明描画では、 透明でも沢山のピクセルを描画している可能性がある
画面全体の色を変えるPostEffect 煙のエフェクト一個 たった一個のエフェクトでも、描画するピクセル数が増えれば、 PostEffect以上の負荷に簡単に跳ね上がる。
重なり具合を確認できる Debug View Shader Complexity
ピクセル描画の主な負荷 = 各ピクセル描画の重たさ * ピクセル数 どのように処理ピクセルを減らすか?
UE4でのピクセル描画負荷対策 1: Separate Translucencyの解像度削減 2: Particle Cut Out
それまでの パス Post Process 半透明描画 Lighting Depth Of Field パス Separate Translucency Pass このバッファの解像度を減らすことで描画ピクセルを減らす r.SeparateTranslucencyScreenPerenctage コマンド
Resolution = 100% : 0.44ms
Resolution = 50% : 0.32ms
Resolution = 10% : 0.2ms
Separate Translucencyをお使いの場合 r.SeparateTranslucencyScreenPerenctage コマンドで、 クオリティと処理負荷を比較してみてください
UE4でのピクセル描画負荷対策 1: Separate Translucencyの解像度削減 2: Particle Cut Out
UV-Animationによるスプライト表示では、 透明部分が不要に出てきてしまう場合が多い
”Particle CutOut” Particleの透明部分を、自動でポリゴン分割してくれる機能
ポリゴン数は少し増えるが、大幅なピクセル描画負荷を削減 Paragonではこれでエフェクトの描画負荷が3分の1に。
mokoさんの上記ブログで、詳細な設定方法を説明して頂いております http://effect.hatenablog.com/entry/2016/07/04/015542
半透明の問題とUE4上の対策 1. Depth描画をしない 2. 描画負荷
Z PrePass Base Pass 半透明 PreLighting Lighting Reflection Transparency Post Process
Z PrePass Base Pass PreLighting Lighting Reflection Transparency Post Process Post Process 17:22 52(5)
Post Process なし
Post Process あり
Post Process なし Post Process あり
Post Process なし Post Process あり
Post Processの設定は位置(Volume内)、カメラ、 それぞれに設定可能
どちらも Post Process Volume内で 自身のポストエフェクトの設定 を調整可能。
各々のPriorityとBlend Weightでそれぞれの設定を シームレスに変更することができる。
様々なポストプロセスがあり、 個別の効果はUE4 Docを参照してください
UE4のPost Processingは順序が定まっています。 Depth Of Field Motion Blur Bloom Tone Mapping マテリアルエディターなどで自由にパスを入れ替えることはできません。 その中で、各エフェクトに関してパラメータを設定できます
不一致 Post Process 設定 ProfileGPU
ProfileGPUは、具体的な実装に近い要素を記述しています。 どこがどこまでかわからない場合は、エンジニアに相談してください。
さらに詳細に調整したい場合、、 エディタに出ていないコマンドで様々な設定ができます。
Bloomの設定、沢山パラメータがあるが、 コンソールコマンドでも設定できる項目がある。
r.BloomQuality 0 r.BloomQuality 1 r.BloomQuality 5 r.BloomQualityコマンドでBloomの広がりが変更され。。。
r.BloomQuality 0 r.BloomQuality 1 r.BloomQuality 5 さらに ProfileGPUで見える処理のフローも変わる。
コマンドの意味は、 いままではソースコードのコメントを読むしかなかったが。。
4.13からConsole Variablesのヘルプをローカルに保存する機能が。
英語のみだが、各コマンドの意味を検索できるようになっている
Post Processing まとめ UE4のPost Processingのパスは固定です。 Profileの”Post Process”項目は、 Post Process Volumeの項目と違います。 しかも、設定によって処理の中身や負荷ががらりと変わることもあります。 ポストプロセスボリュームの設定項目だけじゃなく、 r.XXXXXというコマンドで様々な設定ができます。 処理見積もりがしやすい場所でもあります。 エンジニアと相談しつつ、早めに計測しましょう。
Z PrePass Base Pass PreLighting Lighting Post Process Reflection Transparency Post Process
Z PrePass Base Pass PreLighting Lighting Reflection Transparency Post Process おわりに 17:27 57(3)
かけ足でしたが、UE4のレンダリングフローを見ながら、 要所でのTipsを説明していきました。 Z PrePass Base Pass PreLighting Lighting Reflection Transparency Post Process
まとめ レンダリングの中身をしることで、 クオリティとパフォーマンスを両立することができます そのために、UE4は様々なツールを用意しています。 エンジニアと協力しつつ、色々な検証をしてみてください。
UE4はソースコードを公開しています。 (最近はバグトラッカーまで公開されました!) そしてありがたい事に、UE4コミュニティには沢山の優秀な人々がいます。 多くの方がオープンに情報を公開し、議論して頂き、 素晴らしい情報が日々蓄積されています。 今日、ご紹介できなかった方々や、 自分も把握し切れてない多くの方々に日々支えられております。 本当に感謝しております。 ありがとうございます。
ご清聴ありがとうございました アンケートにご協力ください! また、今日出せてない情報が沢山ありますので、 それらは、UE4 Forumで是非ポストモーテムできればと思います。 Special Thanks!! ロブさんも、 アセット貸してくれてありがとうございます。