UE4 Ray Tracingによる
リアルタイムコンテンツ制作
Epic Games Japan / Technical Artist Developer Relations
小林 浩之
#UE4 | @UNREALENGINE
Ray Tracing in UE4.25
#UE4 | @UNREALENGINE
Ray Tracing in UE4.25
Production Ready !
#UE4 | @UNREALENGINE
ほんとに大丈夫・・・?
#UE4 | @UNREALENGINE
UE4のレイトレ各機能を使って
リアルタイムコンテンツを作ってみた
#UE4 | @UNREALENGINE
AO、GI、Sky Light、Soft Shadow、Reflection、Tranlucency全部乗せ!4k60fps!
#UE4 | @UNREALENGINE
無理でした
#UE4 | @UNREALENGINE
UE4のレイトレ各機能を(なるべく)使って
リアルタイムコンテンツを作ってみた
#UE4 | @UNREALENGINE
作例:列車
#UE4 | @UNREALENGINE
#UE4 | @UNREALENGINE
レイトレ検証
● Ambient Occlusion
● Global Illumination
● Sky Light
● Reflection
● Translucency
検証環境 RTX 2080ti Full HD
#UE4 | @UNREALENGINE
レイトレ検証
列車自体が動き続けるため、動的ライティングが重要
そもそも動かして大丈夫?
ノイズは増える?
#UE4 | @UNREALENGINE
Ambient
Occlusion
#UE4 | @UNREALENGINE
Ray Tracing Ambient Occlusion
Ray TracingSSAO
#UE4 | @UNREALENGINE
Ray Tracing Ambient Occlusion
品質が高く、パフォーマンスも良好
解像度にもよるがSSAOとの差は1~2ms程度
Ray TracingSSAO
#UE4 | @UNREALENGINE
列車を動かすとどうなる?
#UE4 | @UNREALENGINE
Ray Tracing Ambient Occlusion
走行時静止時
動くとどうなる?
若干ノイズが増えた
#UE4 | @UNREALENGINE
Ray Tracing Ambient Occlusion
AOのみLit
動くとどうなる?
Lit状態ならほとんど目立たないため問題なし
#UE4 | @UNREALENGINE
Global
Illumination
#UE4 | @UNREALENGINE
Ray Tracing Global Illumination
夏 冬
季節変化や時間変化にも対応可能!
#UE4 | @UNREALENGINE
しかし・・・
#UE4 | @UNREALENGINE
Ray Tracing Global Illumination
処理負荷内訳を見てみると・・・
#UE4 | @UNREALENGINE
Ray Tracing Global Illumination
Sky Light Global Illumination Reflection
処理負荷内訳を見てみると・・・
#UE4 | @UNREALENGINE
Ray Tracing Global Illumination
Sky Light Global Illumination Reflection
処理負荷内訳を見てみると・・・
#UE4 | @UNREALENGINE
Ray Tracing Global Illumination
Sky Light Global Illumination Reflection
約31ms!!
処理負荷内訳を見てみると・・・
#UE4 | @UNREALENGINE
重い・・・
#UE4 | @UNREALENGINE
Ray Tracing Global Illumination
Sky Light Global Illumination Reflection
Brute Force
Sample Per Pixel 4
#UE4 | @UNREALENGINE
Ray Tracing Global Illumination
RTGIのタイプ
● Brute Force
● Final Gather
Post Process Volumeから変更可能
#UE4 | @UNREALENGINE
Final Gatherならどうか?
#UE4 | @UNREALENGINE
Ray Tracing Global Illumination
Final Gather
Sample Per Pixel 4
#UE4 | @UNREALENGINE
Ray Tracing Global Illumination
Final Gather
Sample Per Pixel 4
約9ms!!
#UE4 | @UNREALENGINE
しかし・・・
#UE4 | @UNREALENGINE
Ray Tracing Global Illumination
Final GatherBrute Force
動くとどうなる?
#UE4 | @UNREALENGINE
Ray Tracing Global Illumination
Final GatherBrute Force
動くとどうなる?
Final Gatherは動きに弱かった・・・
#UE4 | @UNREALENGINE
Ray Tracing Global Illumination
動くとどうなる?
Sample Per Pixel 64Sample Per Pixel 4
サンプル数を上げてもあまりかわらず
#UE4 | @UNREALENGINE
Brute ForceのSample Per Pixelを下げてみる
#UE4 | @UNREALENGINE
Ray Tracing Global Illumination
Brute Force
Sample Per Pixel 1
約7ms!!
#UE4 | @UNREALENGINE
Ray Tracing Global Illumination
Brute Force
Sample Per Pixel 1Sample Per Pixel 4
サンプル数を上げた方がキレイではあるが、大差はない
#UE4 | @UNREALENGINE
Ray Tracing Global Illumination
Brute Force
走行時静止時
Final Gatherほどではないが、動くとノイズが目立つ
#UE4 | @UNREALENGINE
Ray Tracing Global Illumination
Final Gather
● 軽い
● 動きに弱い
ノイズが増え、ほぼまともには映らない
Brute Force
● 重い
Sample Per Pixel 1~2ならリアルタイムも可?
● 動きに対してはFinal Gatherよりマシ
でもやはりノイズは増えるし、目立ってしまう
#UE4 | @UNREALENGINE
Ray Tracing Global Illumination
結局どちらも動きには弱い!
Final Gather
● 軽い
● 動きに弱い
ノイズが増え、ほぼまともには映らない
Brute Force
● 重い
Sample Per Pixel 1~2ならリアルタイムも可?
● 動きに対してはFinal Gatherよりマシ
でもやはりノイズは増えるし、目立ってしまう
#UE4 | @UNREALENGINE
じゃあどうすれば・・・
#UE4 | @UNREALENGINE
デノイザを調整
#UE4 | @UNREALENGINE
Global Illumination Denoiser
デノイザ関連のコンソールコマンドも用意されてます
r.Raytracingじゃないので注意
GIとSky Lightのデノイザは共通
#UE4 | @UNREALENGINE
Global Illumination Denoiser
r.GlobalIllumination.Denoiser.PreConvolution=2
● 値を上げることでノイズをある程度抑えるが全体的にぼんやりした印象になる
● デフォルト1、増やすほど負荷が増える
r.GlobalIllumination.Denoiser.ReconstructionSamples=1
● 値を下げることでノイズのパカつきが抑えられる
● デフォルト16
#UE4 | @UNREALENGINE
Global Illumination Denoiser
r.GlobalIllumination.Denoiser.PreConvolution
値を上げるほどPreConvolutionのパスが増え、処理負荷も上がっていく
PreConvolution=4
PreConvolution=1
#UE4 | @UNREALENGINE
Global Illumination Denoiser
デノイザ調整
PreConvolution=2PreConvolution=1
ReconstructionSamples=1ReconstructionSamples=16
動かしてもだいぶ目立たなくなった!
#UE4 | @UNREALENGINE
Global Illumination Denoiser
PreConvolution=1
ReconstructionSamples=16
#UE4 | @UNREALENGINE
Global Illumination Denoiser
PreConvolution=2
ReconstructionSamples=1
#UE4 | @UNREALENGINE
Sky Light
#UE4 | @UNREALENGINE
Ray Tracing Sky Light
シャドウ関連の問題
● MaskedマテリアルのシャドウがOpacity Maskを無視する
● マテリアルエレメント毎のキャストシャドウが効かない
● リフレクションに映るSky Lightの見た目が違う
#UE4 | @UNREALENGINE
Ray Tracing Sky Light
r.RayTracing.SkyLight.EnableTwoSidedGeometry=0で回避
両面描画なマテリアルのシャドウを有効にするかどうか
植物などの影が濃くなりすぎる場合があるためオフに
MaskedマテリアルのシャドウがOpacity Maskを無視する
#UE4 | @UNREALENGINE
Ray Tracing Sky Light
影を落としたくない窓ガラスは別オブジェクトにして回避
マテリアルエレメント毎のキャストシャドウが効かない
#UE4 | @UNREALENGINE
Ray Tracing Sky Light
シャドウありシャドウなし
r.RayTracing.Reflections.RayTraceSkyLightContribution=1
レイトレリフレクション内でスカイライトシャドウを描画する
デノイズがかからなかったりで全く同じ見た目にはならず、かなり暗くなる
リフレクションに映るSky Lightの見た目が違う
#UE4 | @UNREALENGINE
Ray Tracing Sky Light
走行時静止時
動くとどうなる?
GIほどではないがやはり動くと目立つ
#UE4 | @UNREALENGINE
Ray Tracing Sky Light
調整後調整前
デノイザ調整
GIと同じくデノイザを調整して解決!
#UE4 | @UNREALENGINE
Reflection
#UE4 | @UNREALENGINE
Ray Tracing Sky Light
走行時静止時
動くとどうなる?
ほんの少しノイズが増えているがほとんど問題なし
#UE4 | @UNREALENGINE
Ray Tracing Reflection
RT Reflectionには正しく映らないものが多い
● AO
● Global Illumination
● デノイズされたSky LightやSoft Shadow
● SubSurface Scattering
などなど
#UE4 | @UNREALENGINE
Ray Tracing Reflection
RT Reflectionには正しく映らないものが多い
#UE4 | @UNREALENGINE
Ray Tracing Reflection
Two Sidedマテリアルの陰影が
ピンク色になってしまう
#UE4 | @UNREALENGINE
Ray Tracing Reflection
Two Sidedマテリアルがピンク色になる
シェーダーコードの書き換えで解決!
#if MATERIAL_SHADINGMODEL_SUBSURFACE || MATERIAL_SHADINGMODEL_TWOSIDED_FOLIAGE
uint ShadingModel = GetMaterialShadingModel(PixelMaterialInputs);
if ( ShadingModel == SHADINGMODELID_SUBSURFACE || ShadingModel == SHADINGMODELID_TWOSIDED_FOLIAGE )
{
Payload.CustomData = GetMaterialSubsurfaceData(PixelMaterialInputs);
}
#endif
EngineShadersPrivateRayTracingRayTracingMaterialHitShaders.usf 385行目辺り
#UE4 | @UNREALENGINE
Ray Tracing Reflection
AfterBefore
4.26で修正予定
もんしょさん&篠山さん ありがとうございます!
#UE4 | @UNREALENGINE
Ray Tracing Reflection
Sky Lightのシャドウが描かれず
明るすぎ
#UE4 | @UNREALENGINE
Ray Tracing Reflection
Sky Lightのシャドウが描かれず明るすぎる
RayTraceSkyLightContribution=1 or
AfterBefore
#UE4 | @UNREALENGINE
Ray Tracing Reflection
Sky Lightのシャドウが描かれず明るすぎる
だいぶ暗くなってしまうけど・・・
RayTraceSkyLightContribution=1 or
#UE4 | @UNREALENGINE
Ray Tracing Reflection
Sky Lightのシャドウが描かれず明るすぎる
Lit状態ならさほど気にならない
RayTraceSkyLightContribution=1 or
#UE4 | @UNREALENGINE
Ray Tracing Reflection
ソフトシャドウも選択できるが
デノイズがかからず粗い
#UE4 | @UNREALENGINE
Ray Tracing Reflection
ソフトシャドウも選択できるが、デノイズがかかっておらず粗い
Normalで歪めたり、ある程度粗い材質なら目立たない
LitReflection
#UE4 | @UNREALENGINE
Ray Tracing Reflection
ソフトシャドウも選択できるが、デノイズがかかっておらず粗い
Normalで歪めたり、ある程度粗い材質なら目立たない
Roughness高めRoughness低め
#UE4 | @UNREALENGINE
Ray Tracing Reflection
今回は使わなかったが、リフレクション関連のデノイザオプションもある
#UE4 | @UNREALENGINE
Translucency
#UE4 | @UNREALENGINE
Ray Tracing Translucency
Reflection、Refractionに正しく映らないものが多い
● AO
● Global Illumination
● デノイズされたSky LightやSoft Shadow
● SubSurface Scattering
などなど
#UE4 | @UNREALENGINE
Ray Tracing Translucency
RT Translucencyの屈折
正確に映らない情報が多く、動かした時のノイズも多め
#UE4 | @UNREALENGINE
Ray Tracing Translucency
残念ながらRefractionは不採用
Refractionをオフ、Max Refraction Rays 1で運用
#UE4 | @UNREALENGINE
Ray Tracing Translucency
描画面積の小さいProp程度ならアリかも?
残念ながらRefractionは不採用
#UE4 | @UNREALENGINE
Ray Tracing Translucency
RT Translucencyの反射
Refractionオフでも使用可能
#UE4 | @UNREALENGINE
Ray Tracing Translucency
走行時静止時
動くとどうなる?
不透明リフレクションと同じく、動いてもさほど気にならない
#UE4 | @UNREALENGINE
Ray Tracing Translucency
NvidiaのRTX Branch https://github.com/NvPhysX/UnrealEngine/tree/RTX-4.25
半透明の描画はラスタライズで、反射部分だけレイトレで行う
Hybrid Translucencyというのもある
#UE4 | @UNREALENGINE
レイトレ検証まとめ
● Ambient Occlusion
● Global Illumination
● Sky Light
● Reflection
● Translucency
#UE4 | @UNREALENGINE
レイトレ検証まとめ
Ambient Occlusion
● クオリティ、パフォーマンスともに優秀
積極的に使っていきたい
#UE4 | @UNREALENGINE
レイトレ検証まとめ
Global Illumination
● パフォーマンスに難あり
● 速い動きに弱い
● デノイザの調整でリアルタイムも可
#UE4 | @UNREALENGINE
レイトレ検証まとめ
Sky Light
● シャドウ関連の問題に注意
● 速い動きに弱いが、GIと同じくデノイザの調整で改善
#UE4 | @UNREALENGINE
レイトレ検証まとめ
Reflection
● 反射に正確に映らない部分を把握しておく
● 粗が目立つ部分はNormalやRoughnessの調整で誤魔化せる
#UE4 | @UNREALENGINE
レイトレ検証まとめ
Translucency
● ReflectionとRefractionに正確に映らない部分を把握しておく
● 広い面積でRefractionを使うのは厳しいかも
● Refractionを切って反射だけ使うこともできる
反射も不要であればラスタライズでいいかも
#UE4 | @UNREALENGINE
完全動的なシーンができた!
RTX2080ti
1920 x 1080
30fps前後
#UE4 | @UNREALENGINE
せっかくなのでライトを動かしてみよう
#UE4 | @UNREALENGINE
Sun and Sky
を使ったライティング
#UE4 | @UNREALENGINE
Sun and Sky
座標や時間からライティングをシミュレーション
Sun and Skyのドキュメント
https://docs.unrealengine.com/ja/Engine/Rendering/LightingAndShadows/SunSky/index.html
#UE4 | @UNREALENGINE
Sun and Sky
時間や季節の変化が自由自在に!
※雪景色を作る場合は冬用アセットが必要
#UE4 | @UNREALENGINE
作例:クラゲ
#UE4 | @UNREALENGINE
#UE4 | @UNREALENGINE
検証内容
● Ambient Occlusion
● Global Illumination
● Sky Light
● Translucency
● Reflection
#UE4 | @UNREALENGINE
検証内容
● Ambient Occlusion
● Global Illumination
● Sky Light
● Translucency
● Reflection
今回は未使用
#UE4 | @UNREALENGINE
なぜクラゲでリフレクション?
#UE4 | @UNREALENGINE
クラゲを作るからには・・・
● すりガラスのようなやわらかい透け感を表現したい
● DoFかけたい
#UE4 | @UNREALENGINE
クラゲを作るからには・・・
ぼんやりと内臓が透けて見える
これをやってみたい
#UE4 | @UNREALENGINE
半透明表現検証
RT ReflectionのRoughnessのような効果がほしい
Roughness 0.25Roughness 0.0
#UE4 | @UNREALENGINE
半透明表現検証
RT ReflectionのRoughnessのような効果がほしい
残念ながらレイトレ半透明では不可能
#UE4 | @UNREALENGINE
ならば!
#UE4 | @UNREALENGINE
半透明表現検証
RT ReflectionのRoughnessのような効果がほしい
リフレクションレイを突き抜けさせれば
半透明っぽくなるのでは・・・?
#UE4 | @UNREALENGINE
レイを突き抜けさせるには
#UE4 | @UNREALENGINE
マテリアルで法線をいじる
#UE4 | @UNREALENGINE
半透明表現検証
RT Reflectionを利用して半透明っぽくする
反転したカメラベクトルを法線とすることで・・・
#UE4 | @UNREALENGINE
半透明表現検証
RT Reflectionを利用して半透明っぽくする
Tangent Space Normalを切る必要あり
#UE4 | @UNREALENGINE
半透明表現検証
RT Reflectionを利用して半透明っぽくする
ほぼ真逆にレイが飛ぶ
#UE4 | @UNREALENGINE
半透明表現検証
RT Reflectionを利用して半透明っぽくする
RoughnessやNormalを工夫して
すりガラスっぽく
#UE4 | @UNREALENGINE
半透明表現検証
透けているように見えるが、実際には不透明の反射扱いなので・・・
Depthにしっかり描画される
#UE4 | @UNREALENGINE
半透明表現検証
透けているように見えるが、実際には不透明の反射扱いなので・・・
Depthにしっかり描画される
DoFがかかる!
#UE4 | @UNREALENGINE
Reflection半透明の注意点
● メッシュが重なった分Reflectionのバウンス回数を増やさないといけない
他の反射物にも影響が出る
複雑な形状ほどバウンス数が必要で、処理負荷に繋がる可能性も
● そもそも想定された使い方ではない
今回はReflectionのみの運用だったので無事だったが、どこに悪影響が出るか分からない
今後のアップデートでシェーダーが書き変わればできなくなる可能性も
#UE4 | @UNREALENGINE
狙っていたぼんやり透ける感じ
& DoFが表現できた!
#UE4 | @UNREALENGINE
実行ファイル
https://drive.google.com/file/d/1N7K9O1vj6ypwsAB_v6m5k4E2RzPmR5A9/view?usp=sharing
プロジェクト
https://drive.google.com/file/d/1nlYv0YoLzNXgeU1sN6BSt5CrB9FKO9M1/view?usp=sharing
実行ファイル&プロジェクト
公開してます
#UE4 | @UNREALENGINE
UE4のレイトレ各機能を使って
リアルタイムコンテンツは作れるか?
#UE4 | @UNREALENGINE
作れた!
#UE4 | @UNREALENGINE
レイトレのメリット、デメリットを把握し
プロジェクト毎に適切な使い方を
#UE4 | @UNREALENGINE
UE4でレイトレコンテンツを作るメリット、デメリット
メリット
● ライティングの動的変化
Sun and Skyと組み合わせることで簡単に日時や季節変化をシミュレートできる
列車や飛行機の中など、動くものへのライティングに対応できる
● 物理的な正確さ
ReflectionやGIが正確かつ動的になり、今まで困難だった表現も可能に
● イテレーションの速さ
ベイク不要なのでもちろんLight Mapも不要
モデル作成からライティングのチェックまでがかなり早くなる
#UE4 | @UNREALENGINE
UE4でレイトレコンテンツを作るメリット、デメリット
デメリット
● 処理負荷
GIを筆頭に従来の機能と比べるとかなり重い
シーンによっては従来の表現でも十分なクオリティを出せている場合もある
● 未対応な部分
リフレクションや半透明の映り込みなど、苦手とする部分がある
● 動きが付くと基本的にノイズが増える
今回は遅めに動かしてはいたが、それでもGIのノイズは厳しかった
更に速い動きになるとまた別の対応が必要かも
#UE4 | @UNREALENGINE
ありがとうございました

UE4 Ray Tracingによる リアルタイムコンテンツ制作