cedec2016: unreal engine 4 のレンダリングフロー総おさらい
TRANSCRIPT
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の一般的なイメージ
BasePass
Lighting PostProcess
完成
“ProfileGPU” コマンドor “Ctrl + Shift + ,”でRenderingの処理の流れが見えます。
何をやっているのがよくわからない処理もあるのではないでしょうか?
?
BasePass
Lighting PostProcess
このイメージだけでは足りないのではないか?
本講演の目標
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
BasePass
LightingPost
Process
BasePass
LightingPost
Process
BasePass
LightingPost
ProcessTransparency
BasePass
LightingPost
ProcessTransparencyReflection
BasePass
LightingPost
ProcessTransparencyReflection
Pre-Lighting
Decal Ambient Occlusion
BasePass
LightingPost
ProcessTransparencyReflection
Pre-Lighting
Z PrePass
BasePass
Lighting TransparencyZ PrePass
PostProcess
ReflectionPre-
Lighting
これらを大まかなブロックとして、ブロック毎に掘り下げていきたいと思います。
Base Pass一番重要かつ基本のパス
BasePass
Lighting TransparencyZ PrePass
PostProcess
ReflectionPre-
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一番重要かつ基本のパス
BasePass
Lighting TransparencyZ PrePass
PostProcess
ReflectionPre-
Lighting
Z prepass
BasePass
Lighting TransparencyZ PrePass
PostProcess
ReflectionPre-
Lighting
22(3)16:52
Z Prepassとは?
BasePass
全オブジェクトを毎回G-bufferに書き出して。。。
とやるのは処理負荷が高い。。
Z Prepassとは?
BasePass
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
BasePass
Lighting TransparencyZ PrePass
PostProcess
ReflectionPre-
Lighting
Custom Depth/Stencilちょっと脱線。。
BasePass
Lighting TransparencyZ PrePass
PostProcess
ReflectionPre-
Lighting
CustomDepth / 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ちょっと脱線。。
BasePass
Lighting TransparencyZ PrePass
PostProcess
ReflectionPre-
Lighting
CustomDepth / Stencil
Pre-LightingDecal & AO
BasePass
Lighting TransparencyZ PrePass
PostProcess
ReflectionPre-
Lighting
28(5)16:58
Decal Ambient Occlusion
テクスチャをプロジェクションする。弾痕や血しぶきとか。。
疑似的なライティング遮蔽情報物体の接地感やディティールの増幅に
BasePass
Lighting TransparencyZ PrePass
PostProcess
ReflectionPre-
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-LightingDecal & AO
BasePass
Lighting TransparencyZ PrePass
PostProcess
ReflectionPre-
Lighting
Lighting
BasePass
Lighting TransparencyZ PrePass
PostProcess
ReflectionPre-
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 ComplexityLightingの負荷を大まかに見積もる機能
範囲の小さい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
BasePass
Lighting TransparencyZ PrePass
PostProcess
ReflectionPre-
Lighting
Reflection
BasePass
Lighting TransparencyZ PrePass
PostProcess
ReflectionPre-
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が映える特殊なオブジェクトにのみ配置
動的なReflectionScreen Space Reflection
長所
• 完全に動的にReflectionを生成事前計算なし
短所
• 画面範囲外の反射は取得できない
• ノイズが多い
• 半透明の映り込みが正しくない
Planar Reflection
4.12から生まれた機能、平面のみ可能、非常に高負荷で、シーンを二回レンダリングしているようなもの
Planar Reflection vs Screen Space Reflection
SSRはあくまで画像範囲内の疑似的なReflection
Reflection
Reflectionには静的なものと動的なものを組み合わせて実現します。
静的なものは配置方法を、動的なものはクオリティと処理負荷を、それぞれ意識して使用してください。
ReflectionはUE4 Docで詳細が沢山記載されているので、そちらも併せて参考にしてください。
Reflection
BasePass
Lighting TransparencyZ PrePass
PostProcess
ReflectionPre-
Lighting
半透明
BasePass
Lighting TransparencyZ PrePass
PostProcess
ReflectionPre-
Lighting
43(9)17:13
半透明は
UE4に限らず
現代のリアルタイムレンダリングの最大の課題の一つ
半透明の問題とUE4上の対策
1. Depth描画をしない
2. 描画負荷
Eeffectをシーンに置いてみる
Depthは何も書かれていない
半透明の問題とUE4上の対策
Depthを描画しないため Depthを用いるエフェクトで問題が起こる
Depth Of Fieldをかけてみる
この不一致を解決するために
Separate Translucency
という機能をUE4は用意しています。
LightingPost Processそれまでの
パス半透明描画
パス Depth Of Field
LightingPost Processそれまでの
パス Depth Of Field
Separate Translucency Pass
半透明描画パス
Separate Translucency = ON
Separate Translucency
ONOFF
Project 単位でSeparate Translucencyの設定Project Settings / Rendering内
マテリアル単位で、どちらのパスで描画できるかも設定可能
(マテリアルのTranslucencyタブ内)
Separate Translucency = ON
本来、遠くの煙にはボケてほしい。
LightingPost 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
LightingPost 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. 描画負荷
半透明
BasePass
Lighting TransparencyZ PrePass
PostProcess
ReflectionPre-
Lighting
Post Process
BasePass
Lighting TransparencyZ PrePass
PostProcess
ReflectionPre-
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
BlurBloom
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
BasePass
Lighting TransparencyZ PrePass
PostProcess
ReflectionPre-
Lighting
おわりに
BasePass
Lighting TransparencyZ PrePass
PostProcess
ReflectionPre-
Lighting
57(3)17:27
かけ足でしたが、UE4のレンダリングフローを見ながら、要所でのTipsを説明していきました。
BasePass
Lighting TransparencyZ PrePass
PostProcess
ReflectionPre-
Lighting
まとめ
レンダリングの中身をしることで、クオリティとパフォーマンスを両立することができます
そのために、UE4は様々なツールを用意しています。エンジニアと協力しつつ、色々な検証をしてみてください。
UE4はソースコードを公開しています。(最近はバグトラッカーまで公開されました!)
そしてありがたい事に、UE4コミュニティには沢山の優秀な人々がいます。
多くの方がオープンに情報を公開し、議論して頂き、素晴らしい情報が日々蓄積されています。
今日、ご紹介できなかった方々や、自分も把握し切れてない多くの方々に日々支えられております。
本当に感謝しております。ありがとうございます。
ご清聴ありがとうございました
Special Thanks!!
ロブさんも、アセット貸してくれてありがとうございます。
アンケートにご協力ください!また、今日出せてない情報が沢山ありますので、それらは、UE4 Forumで是非ポストモーテムできればと思います。