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や機能を知り、
日々の開発や意思決定をスムーズにする。
本講演の目的
Quality Performance
Iteration
この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フローを
もう少し掘り下げる
(一階層だけ深く)
5(2)16:35
Base
Pass
Lighting
Post
Process
Base
Pass
Lighting
Post
Process
Base
Pass
Lighting
Post
Process
Transparency
Base
Pass
Lighting
Post
Process
TransparencyReflection
Base
Pass
Lighting
Post
Process
TransparencyReflection
Pre-
Lighting
Decal Ambient Occlusion
Base
Pass
Lighting
Post
Process
TransparencyReflection
Pre-
Lighting
Z
PrePass
Base
Pass
Lighting TransparencyZ
PrePass
Post
Process
Reflection
Pre-
Lighting
これらを大まかなブロックとして、
ブロック毎に掘り下げていきたいと思います。
Base Pass
一番重要かつ基本のパス
Base
Pass
Lighting TransparencyZ
PrePass
Post
Process
Reflection
Pre-
Lighting
7(15)16:37
Base Passで行われること
Opaque / Maskedマテリアルのオブジェクトを
レンダリングし、G-bufferを作成する。
G-Bufferとは
後のライティングやポストエフェクトで使われるための中間バッファ。
BasePassの描画順を視覚化
Base Pass の注意点
BasePassはジオメトリ投入のコストが直に反映される場所なので、
処理負荷になりやすい場所です。
少し時間をとって、BasePassの注意点を見ていきます。
Base Passで注意すべきこと
• 無駄な頂点を計算させない
• 無駄なピクセルを計算させない
• 無駄にシェーダを重たくしない
(こちらはマテリアル作成の問題で今回は触れない)
Base Passで注意すべきこと
• 無駄な頂点を計算させない
カメラに入らないオブジェクトをGPUに投入させない
• 無駄なピクセルを計算させない
• 無駄にシェーダを重たくしない
(こちらはマテリアル作成の問題で今回は触れない)
8(5)
例えば、こんなメッシュを頑張って作成してみたものの。。
このキャラクタ一体しか見えないシーンなのに、
処理負荷がめちゃくちゃ高い!!
処理負荷の原因は、画面に見えないはずの大量のロブさん
(CPU) Frustum Culling
Object
Object
見えない!
見える
オブジェクトのバウンスを調べ、
画面外のオブジェクトをGPUに計算させない機能
Object
見える??
不必要におおきなバウンスはGPUの負荷につながります
良いバウンス 悪いバウンス
友情出演
無駄な頂点を計算させない
カメラに入らないオブジェクトをGPUに投入させない。
コックピットならば、前後左右を一体で作ると、
全く見えない後ろのポリゴンもマイフレームGPUが計算してしまう。
Kentuckyguard http://free-photos.gatag.net/2014/06/06/160000.html
Stat InitViews コマンドで、
どれだけ事前にオブジェクトをカリングしたかわかる。
FreezeRendering コマンドで、
その時点でのカメラのカリング結果を見ることができる。
無駄な頂点を計算させない
カメラに入らないオブジェクトをGPUに投入させない。
Init Views や FreezeRendering で、
画面に映らないオブジェクトがGPUに投入されていないか確認してみましょう。
また、各プラットフォームのGPU解析ツールで、
GPUから見たプロファイルもできます。
(こちらは、エンジニアにお願いしましょう!)
Base Passで注意すべきこと
• 無駄な頂点を計算させない
カメラに入らないオブジェクトをGPUに投入させない
• 無駄なピクセルを計算させない
• 無駄にシェーダを重たくしない
(こちらはマテリアル作成の問題で今回は触れない)
Base Passで注意すべきこと
• 無駄な頂点を計算させない
カメラに入らないオブジェクトをGPUに投入させない
• 無駄なピクセルを計算させない
• 無駄にシェーダを重たくしない
(こちらはマテリアル作成の問題で今回は触れない)
13(+7)16:43
Depth Test のGPU内部の動作
Depth Test
0. 何もないシーンに。。。
Color Buffer Depth Buffer
Depth Test
1. 赤いポリゴンが描画されて。。。
Color Buffer Depth Buffer①
Depth Test
2. 青いポリゴンが描画されて。。。深度比較されて遠くのオブジェクトは消える。
Color Buffer Depth Buffer① ②
Depth Test
Q. この赤の裏に隠れた青のピクセル達は、計算されるんでしょうか???
Color Buffer Depth Buffer① ②
描画の流れをGPU的に追っていきます。
Color Buffer Depth Buffer
Pixel Shader
Rasterizer
Vertex Shader
描画の流れをGPU的に追っていきます。
Color Buffer Depth Buffer
Pixel Shader
Rasterizer
Vertex Shader
頂点シェーダで、画面のどこにポリゴンがあるかを計算します。
描画の流れをGPU的に追っていきます。
Color Buffer Depth Buffer
Pixel Shader
Rasterizer
Vertex Shader
ラスタライザでそのポリゴンがどのピクセルを埋めるかを判断します。
描画の流れをGPU的に追っていきます。
Color Buffer Depth Buffer
Pixel Shader
Vertex Shader
そしてPixel Shaderでピクセルの色を計算する
Rasterizer
描画の流れをGPU的に追っていきます。
Color Buffer Depth Buffer
Pixel Shader
Rasterizer
Vertex Shader
Pixel Shaderの前に、各ピクセルに描画されるデプスは決まってすよね?
?
描画の流れをGPU的に追っていきます。
Color Buffer Depth Buffer
Pixel Shader
Vertex Shader
PreZ: Pixel Shaderの前でDepth Test及びDepth Writeを行う
Pre Z
Rasterizer
描画の流れをGPU的に追っていきます。
Color Buffer Depth Buffer
Pixel Shader
Vertex Shader
そしてPixel Shaderでピクセルの色を計算する
Pre Z
Rasterizer
描画の流れをGPU的に追っていきます。
Color Buffer Depth Buffer
Pixel Shader
Vertex Shader
次に青いポリゴンが奥に投入されても。。。。
Pre Z
Rasterizer
描画の流れをGPU的に追っていきます。
Color Buffer Depth Buffer
Pixel Shader
Vertex Shader
PreZで先にDepth計算と比較をするので。。。
Pre Z
Rasterizer
描画の流れをGPU的に追っていきます。
Pixel Shaderでこの重なった部分のピクセルは計算されません。
めでたしめでたし。。。
Color Buffer Depth Buffer
Pre Z
Pixel Shader
Rasterizer
Vertex Shader
Color Buffer Depth Buffer
Pixel Shader
Rasterizer
Vertex Shader
Pixel Shaderの前に、各ピクセルに描画されるデプスは決まってすよね?
?
本当か?
Color Buffer Depth Buffer
Pixel Shader
Vertex Shader
Pixel Shaderを走らせないと最終的なDepthがわからない例: 1
アルファテスト
Pre Z
Rasterizer
アルファテストを行うMaskedマテリアル
Color Buffer Depth Buffer
Pixel Shader
Vertex Shader
Pixel Shaderを走らせないと最終的なDepthがわからない例: 2
Pixel Shader内部で無理やりDepthを書き換える
Pre Z
Rasterizer
PixelのDepthを変更するPixel Depth Offset
この様なシェーダに出くわすと、GPUは自動的に、
シェーダを計算してからDepth処理を行う、Post Zというものに切り替えます。
Color Buffer Depth Buffer
Pre Z
Post Z
Pixel Shader
Rasterizer
Vertex Shader
これらを意識していないと、
PreZがOffになり、
不要なPixel Shaderが走る可能性があります。
駄目な例: 不透明だけどとりあえずMaskedにパラメータ入れておく
Pre Z
Post Z
Pixel Shader
Rasterizer
Vertex Shader
駄目な例: 使わないけど、Pixel Depth Offsetをパラメータ化
Pre Z
Post Z
Pixel Shader
Rasterizer
Vertex Shader
マスターマテリアルに汎用性を持たせるために、
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の精度を変更できます。
映像系など高精細な絵作りが必要な場合、精度を上げてください。
Base Pass
一番重要かつ基本のパス
Base
Pass
Lighting TransparencyZ
PrePass
Post
Process
Reflection
Pre-
Lighting
Z prepass
Base
Pass
Lighting TransparencyZ
PrePass
Post
Process
Reflection
Pre-
Lighting
22(3)16:52
Z Prepassとは?
Base
Pass
全オブジェクトを
毎回G-bufferに書き出して。。。
とやるのは処理負荷が高い。。
Z Prepassとは?
Base
Pass
Z
PrePass
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
Lighting TransparencyZ
PrePass
Post
Process
Reflection
Pre-
Lighting
Custom Depth/Stencil
ちょっと脱線。。
Base
Pass
Lighting TransparencyZ
PrePass
Post
Process
Reflection
Pre-
Lighting
Custom
Depth / Stencil
25 (3)16:55
Custom Depth/ Stencil
特定のメッシュのDepthだけを別バッファに書き出す機能とそのバッファ名
本来のDepthBuffer もう一つ別のDepthBuffer
Custom Depth/ Stencil
Project SettingのRendering項目にある、
“Custom Depth-Stencil Pass”をONにしてください。
Custom Depth/ Stencil
各メッシュのRender CustomDepth Passにチェックをいれる
Custom Depth/ Stencil
試しにキャラクター全部のカスタムDepthをONにしてみる。
Alweiさん(@aizen76) の上記のブログでも
Toon ShadingのマスキングのためにCustom Depthを使用
http://unrealengine.hatenablog.com/entry/2016/05/30/220000
Custom Depthなし Custom DepthありCustom Depth
らりほまさん(@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
処理負荷比較
Custom Depthもほぼ同等の負荷がかかります
BasePassのキャラクターレンダリング負荷
Custom Depth/ Stencil
Custom Depth / Stencilにチェックを入れたオブジェクトは、
もう一度オブジェクトがGPUに投入されて計算されます。
その分GPUコストにつながるので、
ちゃんとプロファイリングして使ってください
Custom Depth/Stencil
ちょっと脱線。。
Base
Pass
Lighting TransparencyZ
PrePass
Post
Process
Reflection
Pre-
Lighting
Custom
Depth / Stencil
Pre-Lighting
Decal & AO
Base
Pass
Lighting TransparencyZ
PrePass
Post
Process
Reflection
Pre-
Lighting
28(5)16:58
Decal Ambient Occlusion
テクスチャをプロジェクションする。
弾痕や血しぶきとか。。
疑似的なライティング遮蔽情報
物体の接地感やディティールの増幅に
Base
Pass
Lighting TransparencyZ
PrePass
Post
Process
Reflection
Pre-
Lighting
後のLighting等で使われるので、
前もって処理しておく必要がある
Decal
をUE4コミュニティの方達の資料を用いて紹介したいと思います。
http://konabe.blog.jp/archives/33883823.html
栗坂こなべさん(@kurisaka_konabe)の記事を参照させて頂きます。
インクが付くようなエフェクト、
右の図の様にプレーンを置くとなると、ぎりぎり面の上に置かなければいけないし、
壁際のコーナーなどでは不具合が生じる
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
Pre-Lighting
Decal & AO
Base
Pass
Lighting TransparencyZ
PrePass
Post
Process
Reflection
Pre-
Lighting
Lighting
Base
Pass
Lighting TransparencyZ
PrePass
Post
Process
Reflection
Pre-
Lighting
33(7)17:03
LightのMobilityのおさらい
事前計算なし
ライト
全てRuntimeで計算
LightMap生成用
ライト
全て事前計算
ShadowMap
事前計算ライト
Runtime:
Lighting
事前計算:
静的オブジェクト
のShadow Map
LightのMobilityのおさらい
事前計算なし
ライト
全てRuntimeで計算
LightMap生成用
ライト
全て事前計算
ShadowMap
事前計算ライト
Runtime:
Lighting
事前計算:
静的オブジェクト
のShadow Map
ライティング事前計算機能: Lightmass
ライティング事前計算機能: Lightmass
たった数時間で。
ライティング事前計算機能: Lightmass
この計算をエディタの裏でしているのがLightmassです
ライティング事前計算機能: Lightmass
先月に、Lightmass専門の勉強会を行いました。
資料や情報がForumにあがっていますので、参考にしてください
建築ビジュアリゼーションの真茅健一さんが、
ルイスバラガン邸をUE4で再現し、
その制作フローを講演してくれています
@torashami
LightのMobilityのおさらい
事前計算なし
ライト
全てRuntimeで計算
LightMap生成用
ライト
全て事前計算
ShadowMap
事前計算ライト
Runtime:
Lighting
事前計算:
静的オブジェクト
のShadow Map
LightのMobilityのおさらい
事前計算なし
ライト
全てRuntimeで計算
LightMap生成用
ライト
全て事前計算
ShadowMap
事前計算ライト
Runtime:
Lighting
事前計算:
静的オブジェクト
の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のおさらい
事前計算なし
ライト
全てRuntimeで計算
LightMap生成用
ライト
全て事前計算
ShadowMap
事前計算ライト
Runtime:
Lighting
事前計算:
静的オブジェクト
のShadow Map
Deferred Lightingは
影がなければ動的ライト沢山おいても軽い?
範囲の小さい
Movable Lightを100個
範囲の大きい
Movable Lightを8個VS
Light Complexity
Lightingの負荷を大まかに見積もる機能
範囲の小さい
Movable Lightを100個
範囲の大きい
Movable Lightを8個VS
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 」はご法度
Lighting
Base
Pass
Lighting TransparencyZ
PrePass
Post
Process
Reflection
Pre-
Lighting
Reflection
Base
Pass
Lighting TransparencyZ
PrePass
Post
Process
Reflection
Pre-
Lighting
40(3)17:10
Reflection Probe
事前計算で静的シーンの
ReflectionMapを作成
Screen Space Reflection
動的に反射を作成、
画面に見えない反射は
表現できない
Planar Reflection
平面限定だが、完璧に
動的に反射を表現
重たいので映像向け
ドキュメントと、専用のサンプルまでと非常に充実している
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で詳細が沢山記載されているので、
そちらも併せて参考にしてください。
Reflection
Base
Pass
Lighting TransparencyZ
PrePass
Post
Process
Reflection
Pre-
Lighting
半透明
Base
Pass
Lighting TransparencyZ
PrePass
Post
Process
Reflection
Pre-
Lighting
43(9)17:13
半透明は
UE4に限らず
現代のリアルタイムレンダリングの最大の課題の一つ
半透明の問題とUE4上の対策
1. Depth描画をしない
2. 描画負荷
Eeffectをシーンに置いてみる
Depthは何も書かれていない
半透明の問題とUE4上の対策
Depthを描画しないため Depthを用いるエフェクトで問題が起こる
Depth Of Fieldをかけてみる
この不一致を解決するために
Separate Translucency
という機能をUE4は用意しています。
Lighting
Post Processそれまでの
パス
半透明描画
パス Depth Of Field
Lighting
Post Processそれまでの
パス Depth Of Field
Separate Translucency Pass
半透明描画
パス
Separate Translucency = ON
Separate Translucency
ONOFF
Project 単位でSeparate Translucencyの設定
Project Settings / Rendering内
マテリアル単位で、
どちらのパスで描画
できるかも設定可能
(マテリアルの
Translucencyタブ内)
Separate Translucency = ON
本来、遠くの煙にはボケてほしい。
Lighting
Post Processそれまでの
パス
半透明描画
パス 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
Lighting
Post Processそれまでの
パス
半透明描画
パス Depth Of Field
Separate Translucency Pass
このバッファの解像度を減らすことで描画ピクセルを減らす
r.SeparateTranslucencyScreenPercentage コマンド
Resolution = 100% : 0.44ms
Resolution = 50% : 0.32ms
Resolution = 10% : 0.2ms
Separate Translucencyをお使いの場合
r.SeparateTranslucencyScreenPercentage コマンドで、
クオリティと処理負荷を比較してみてください
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. 描画負荷
半透明
Base
Pass
Lighting TransparencyZ
PrePass
Post
Process
Reflection
Pre-
Lighting
Post Process
Base
Pass
Lighting TransparencyZ
PrePass
Post
Process
Reflection
Pre-
Lighting
52(5)17:22
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
マテリアルエディターなどで自由にパスを入れ替えることはできません。
その中で、各エフェクトに関してパラメータを設定できます
ProfileGPUPost Process 設定
不一致
ProfileGPUは、具体的な実装に近い要素を記述しています。
どこがどこまでかわからない場合は、エンジニアに相談してください。
さらに詳細に調整したい場合、、
エディタに出ていないコマンドで様々な設定ができます。
Bloomの設定、沢山パラメータがあるが、
コンソールコマンドでも設定できる項目がある。
r.BloomQuality 5r.BloomQuality 0 r.BloomQuality 1
r.BloomQualityコマンドでBloomの広がりが変更され。。。
r.BloomQuality 5r.BloomQuality 0 r.BloomQuality 1
さらに ProfileGPUで見える処理のフローも変わる。
コマンドの意味は、
いままではソースコードのコメントを読むしかなかったが。。
4.13からConsole Variablesのヘルプをローカルに保存する機能が。
英語のみだが、各コマンドの意味を検索できるようになっている
Post Processing まとめ
UE4のPost Processingのパスは固定です。
Profileの”Post Process”項目は、
Post Process Volumeの項目と違います。
しかも、設定によって処理の中身や負荷ががらりと変わることもあります。
ポストプロセスボリュームの設定項目だけじゃなく、
r.XXXXXというコマンドで様々な設定ができます。
処理見積もりがしやすい場所でもあります。
エンジニアと相談しつつ、早めに計測しましょう。
Post Process
Base
Pass
Lighting TransparencyZ
PrePass
Post
Process
Reflection
Pre-
Lighting
おわりに
Base
Pass
Lighting TransparencyZ
PrePass
Post
Process
Reflection
Pre-
Lighting
57(3)17:27
かけ足でしたが、UE4のレンダリングフローを見ながら、
要所でのTipsを説明していきました。
Base
Pass
Lighting TransparencyZ
PrePass
Post
Process
Reflection
Pre-
Lighting
まとめ
レンダリングの中身をしることで、
クオリティとパフォーマンスを両立することができます
そのために、UE4は様々なツールを用意しています。
エンジニアと協力しつつ、色々な検証をしてみてください。
UE4はソースコードを公開しています。
(最近はバグトラッカーまで公開されました!)
そしてありがたい事に、UE4コミュニティには沢山の優秀な人々がいます。
多くの方がオープンに情報を公開し、議論して頂き、
素晴らしい情報が日々蓄積されています。
今日、ご紹介できなかった方々や、
自分も把握し切れてない多くの方々に日々支えられております。
本当に感謝しております。
ありがとうございます。
ご清聴ありがとうございました
Special Thanks!!
ロブさんも、
アセット貸してくれてありがとうございます。
アンケートにご協力ください!
また、今日出せてない情報が沢山ありますので、
それらは、UE4 Forumで是非ポストモーテムできればと思います。

CEDEC2016: Unreal Engine 4 のレンダリングフロー総おさらい