Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

UE4のレイトレで出来ること/出来ないこと

22,648 views

Published on

2019/04/24に開催されたUE4 Ray Tracing Nightの発表資料です。

Published in: Engineering
  • Login to see the comments

UE4のレイトレで出来ること/出来ないこと

  1. 1. Ray Tracing Night @ Tokyo UE4のレイトレで出来ること/出来ないこと
  2. 2. 自己紹介 もんしょ もんしょの巣穴管理人 Twitterアカウント:@monsho1977 都内のゲーム開発会社エンジニア →令和元年からフリーランス Unreal Engine 4 マテリアルデザイン入門の共著 →付録の一部執筆と本編の監修 日本酒と岩の人と一部で言われてる →間違ってない
  3. 3. 内容 UE 4.22で使用可能になったリアルタイムレイトレーシングの基本を紹介 →実例はのちのお二方におまかせ! ● UE 4.22におけるリアルタイムレイトレの使い方 ● リアルタイムレイトレとパストレーシングの違い ● 各種機能紹介 ● レイトレの制約 ● 速度 注意:単語の省略について レイトレーシング→レイトレ パストレーシング→パストレ
  4. 4. リアルタイムレイトレの使い方
  5. 5. リアルタイムレイトレの使い方 必要な機材 • Unreal Engine 4.22 • Windows 10 2018 October Update (1809)以降 • NVIDIA Volta / Turing世代以降のGPU もしくは一部のPascal世代GPU Titan V / Geforce RTXシリーズ GTX 1060以上
  6. 6. リアルタイムレイトレの使い方 UE 4.22の設定 • 起動オプション 起動時引数で -dx12 を追加する • C++プロジェクトの場合 プロジェクトの構成プロパティ→デバッグ→コマンド引数に追加 • BPプロジェクトの場合 Unreal Engineのショートカットを作成→引数に追加 プロジェクトのショートカットでは効果がないので注意!
  7. 7. リアルタイムレイトレの使い方 UE 4.22の設定 つづき • プロジェクト設定で以下の2つを有効化 Support Compute Skincache Ray Tracing Supoort Compute Skincacheを有効にしないと有効化出来ない • 有効化したら再起動
  8. 8. リアルタイムレイトレの使い方 パラメータの変更方法 • 一部アクターの設定とデバッグコマンドでの変更 詳細な設定は今後アクター等の設定に含まれていくと思われる • デバッグコマンドはr.RayTracing、r.PathTracing にまとまっている 例) r.RayTracing.AmbientOcclusion:レイトレによるAOの有効/無効 r.PathTracing.RandomSequence:ランダム手法の変更 • 一部の設定を保存したい場合は.iniファイルを利用する BPでデバッグコマンドを呼び出す方法もあり
  9. 9. リアルタイムレイトレと パストレーシング
  10. 10. リアルタイムレイトレとパストレーシング 同じじゃないの? • レイトレーシングは始点と方向(有限 or 無限)を持ったレイを追跡する技術 追跡してシーンとの衝突を検出する 衝突したあとに何をするかは自由 • パストレーシングは光の経路(パス)を追跡する カメラに飛び込んでくる光がどのような経路をたどったかを調べる カメラからレイを飛ばしてその経路を追跡する ここでレイトレーシングが使われている • レイトレーシングを使って映像を作成する方法をパストレーシングと呼ぶ パストレーシングはレイトレーシングの一種とも言える
  11. 11. リアルタイムレイトレとパストレーシング でも、UE4にはリアルタイムレイトレとパストレーシングがあるけど、何が違うの? • UE4のパストレーシングはレイトレーシングのみで映像を作成する 本来の意味のパストレーシングと同じ • リアルタイムレイトレーシングは一部の映像表現のみレイトレーシングを行う 基本的なレンダリングはリアルタイムCGでお馴染みのラスタライザ • DirectX Raytracing(DXR)を利用して、ラスタライザとレイトレのハイブリッドを実現 Direct3D12の拡張機能 ラスタライザでは難しい、主にスクリーンスペース系の技術をレイトレで処理 • デバッグコマンドやシェーダはレイトレとパストレで別れている レイトレ:r.RayTracing, Shaders/Private/RayTracing パストレ:r.PathTracing, Shaders/Private/PathTracing
  12. 12. リアルタイムレイトレで使える技術
  13. 13. リアルタイムレイトレで使える技術 UE4のリアルタイムレイトレでは何を描画できるか? すべての描画オブジェクトをレンダリングできるわけではないので注意! 描画できるものでもすべての機能が使えるわけではないので注意! • 描画できるもの Static Mesh Skeletal Mesh Destructible Mesh Niagara Alembic Geometry Cache • 描画できないもの Terrain Foliage Cascade Procedural Mesh
  14. 14. リアルタイムレイトレで使える技術 UE4のリアルタイムレイトレでは何が使えるか? • アンビエントオクルージョン • リフレクション • シャドウ • グローバルイルミネーション • スカイライト • 矩形ライト • 半透明 • リファレンス用パストレーシング
  15. 15. リアルタイムレイトレで使える技術: アンビエントオクルージョン
  16. 16. アンビエントオクルージョン • Screen Space Ambient Occlusionの代替として使用できる デフォルトON OFFにするとSSAOに切り替わる • デバッグコマンド r.RayTracing.AmbientOcclusion レイトレAOのON/OFF切り替え • アクター設定 PostProcessVolume.RayTracingAmbientOcclusion.SamplesPerPixel レイトレAOのサンプリング数/1Pixel/1Frame • AOの強度と範囲はSSAOと共用 PostProcessVolume.AmbientOcclusion項目が使える • レイトレ後、時間的/空間的なデノイズ処理が行われる
  17. 17. アンビエントオクルージョン Ray Tracing AO Screen Space AO
  18. 18. アンビエントオクルージョン デノイズ前 デノイズ後
  19. 19. リアルタイムレイトレで使える技術: リフレクション
  20. 20. リフレクション • リアルタイムレイトレの目玉機能 Screen Space Reflectionの代替機能 デフォルトON OFFにするとSSRが有効化 • デバッグコマンド r.RayTracing.Reflections レイトレリフレクションのON/OFF • アクター設定 PostProcessVolume.RayTracingReflections.MaxBounces リフレクションのバウンス回数 回数を増やすことで合せ鏡の描画も可能 • レイトレ後、時間的/空間的なデノイズ処理が行われる • 完全反射のほうが有利 SSRの場合は完全反射を避けたほうがいいが、レイトレの場合は逆 ラフネスが高いとノイジーになり、残像感も残りやすい
  21. 21. リフレクション Ray Tracing Reflection Screen Space Reflection
  22. 22. リフレクション r.RayTracing.Reflections.MaxBounces = 1 r.RayTracing.Reflections.MaxBounces = 4
  23. 23. リフレクション All Roughness = 0.2 r.RayTracing.Reflections.SamplesPerPixel = 1 r.RayTracing.Reflections.SamplesPerPixel = 4 r.RayTracing.Reflections.SamplesPerPixel = 16
  24. 24. リアルタイムレイトレで使える技術: シャドウ
  25. 25. シャドウ • 動的シャドウ(シャドウマップ)の代替 デフォルトON OFFにするとシャドウマップに切り替わる • ライトごとに設定が可能 CastRaytracedShadow ONでレイトレシャドウ、OFFでシャドウマップ • デバッグコマンド r.RayTracing.Shadows レイトレシャドウ全体のON/OFF OFFにすると各ライトの設定を無視してすべてシャドウマップに r.RayTracing.Shadows.EnableTwoSidedGeometry シーンすべてのポリゴンを両面描画と考慮してレイトレシャドウを行う
  26. 26. シャドウ • Static Lightには無効 Static Lightのシャドウは焼付のみ • Stationary, Movable Lightの処理は同一になる Movableと同様にライトごとの計算 Stationaryの場合はライトマップの計算が行われる • Source Radiusの値によってソフトシャドウを実現可能 ポイントライト、スポットライトのみ Source Radiusが 0 より大きな値になっているとレイトレ後にデノイズ処理が行われる • メッシュ単位のCast Shadowは適用される OFFにするとシーンとリフレクション映像のシャドウのどちらも消える Shadow Two Sidedは効果がないので、メッシュ単位で両面描画設定はできない
  27. 27. シャドウ Ray Tracing Shadow Shadow Map
  28. 28. シャドウ Ray Tracing Shadow Shadow Map Spot Light Source Radius = 30
  29. 29. リアルタイムレイトレで使える技術: グローバルイルミネーション
  30. 30. グローバルイルミネーション • 動的グローバルイルミネーション デフォルトOFF ライトマップと併用される レイトレGIのみにしたい場合はライトをMovableにするなどで対応 • デバッグコマンド PostProcessVolume.RayTracingGlobalIllumination.Enable レイトレGIのON/OFF r.RayTracing.GlobalIlluminationが-1(デフォルト)の場合 r.RayTracing.GlobalIllumination.Desoiser レイトレGI用のデノイザーのON/OFF • 静的なシーンであれば使わない方が無難 他の技術より処理が重め、品質をあげようとすると更に重い 運用するなら解像度を下げるのが効果的
  31. 31. グローバルイルミネーション Light Map Only Light Map + Ray Tracing GIRay Tracing GI Only
  32. 32. グローバルイルミネーション SamplesPerPixel = 1 SamplesPerPixel = 16SamplesPerPixel = 4
  33. 33. グローバルイルミネーション SamplesPerPixel = 1 ScreenPercentage = 50 SamplesPerPixel = 16 ScreenPercentage = 50 SamplesPerPixel = 16 ScreenPercentage = 100
  34. 34. リアルタイムレイトレで使える技術: スカイライト、矩形ライト
  35. 35. スカイライト • 遮蔽情報を参照可能なスカイライト デフォルトOFF 動的なライティング計算の代替 通常のMovable Lightと違い、遮蔽情報を扱うことができる • ON/OFFはライト単位で行う Cast Raytraced ShadowをONにすると有効化 • Mobility設定に関わらずON/OFFができる Stationary, Staticの場合でもONにすることが出来る ライトマップも有効化されるので注意 • レイトレ後、デノイズ処理が行われる サンプル数が少ないと厳しい印象
  36. 36. スカイライト Stationary Sky Light + Baked Light Map Ray Tracing Sky LightMovable Sky Light
  37. 37. スカイライト SamplesPerPixel = 1 SamplesPerPixel = 16SamplesPerPixel = 4 r.RayTracing.SkyLight.Denoiser = 1
  38. 38. 矩形ライト • 矩形ライトはON/OFFによって計算手法に変化がある デフォルトOFF OFF時はラスタライザと同じ直接光計算+レイトレシャドウ レイトレシャドウは他のライトのシャドウと同様に設定可能 ON時はレイトレのみでライト計算 遮蔽もライト計算の中で行われる デノイズされていないため、サンプリング数に依存しやすい • ライト単位ではON/OFFできない 現状はシーン全体のみ • デバッグコマンド r.RayTracing.StochasticRectLight 矩形ライトのON/OFF r.RayTracing.StochasticRectLight.IsTextureImportanceSampling Source Textureが指定されている場合に重要度サンプリングを行うかどうか
  39. 39. 矩形ライト r.RayTracing.StochasticRectLight = 1 r.RayTracing.StochasticRectLight = 0
  40. 40. 矩形ライト SamplesPerPixel = 1 r.RayTracing. StochasticRectLight = 0SamplesPerPixel = 16
  41. 41. リアルタイムレイトレで使える技術: 半透明
  42. 42. 半透明 • 描画順序を意識する必要のないレイトレ半透明 デフォルトOFF • アクター設定 PostProcessVolume.RayTracingTranslucency.MaxRefractionRays 透過レイのトレース回数 この回数以上に半透明が重なっていると途中で打ち切り • デバッグコマンド r.RayTracing.Translucency レイトレ半透明のON/OFF PostProcessVolumeにはON/OFF機能はない • 半透明はとても制約が多い レイトレになっても半透明は立ちふさがる壁だった… 時 空 を 超 え て あ な た は 一 体 何 度 ー ー 我 々 の 前 に 立 ち は だ か っ て く る と い う の だ ! 半 透 明 !
  43. 43. 半透明 Ray Tracing Translucency Rasterisation Translucency
  44. 44. 半透明 MaxRefractionRays = 4 MaxRefractionRays = 16
  45. 45. 半透明 • 屈折を使う場合、マテリアルのSpecularで調整 通常はSpecularがマスクされているので使えない LightingModeをSurface FowardShadingかSurface TranslucencyVolumeに変更 • ただし現在の屈折は計算がおかしいように見える 半透明物質からレイが出ていく場合に空気のIORを考慮していないっぽい? • 結果↓ Specular=0.5でガラスの設定だが、ガラスっぽくない…
  46. 46. リアルタイムレイトレで使える技術: パストレーサー
  47. 47. パストレーサー • リアルタイムレイトレとは別にリファレンス用として実装されている View Mode→Path Tracingで有効化 • ラスタライザを使わず、レイトレのみでレンダリング その分重いので、インタラクティブに使用するのは難しい • デバッグコマンド ShowFlag.PathTracing パストレーサーのON/OFF 0:完全OFF 1:完全ON 2:エディタの設定に依存 r.PathTracing.RandomSequence レイトレース時の乱数生成手法 • 現状ではリファレンスにするのは厳しい印象
  48. 48. パストレーサー Real Time Ray Tracing Path Tracing
  49. 49. リアルタイムレイトレの制約
  50. 50. リアルタイムレイトレの制約 • レイトレならレイを飛ばすだけですべての問題が解決する! そんなふうに思っていた時代が私にもありました… • 現実は厳しい! リアルタイムレイトレには制約がいっぱい! 今後解決されるであろう制約もある そもそもパストレーサーにも制約がある • 各機能ごとに別々にレイトレするため、機能によって対応していないものがある 対応しようと思えば出来る? 速度面では不安が… リアルタイムと言いづらくなりそう • 制約というわけじゃないけど不具合もある 不具合を見つけたらバグ報告しましょう! 報告されない不具合はスルーされる可能性高いです エンジニアの方は修正できそうなら修正してプルリク!
  51. 51. リアルタイムレイトレの制約 説明する制約 • リフレクションの半透明 • Niagaraスプライト • Maskedマテリアル • 半透明マテリアルのシャドウ • レイトレ半透明ごしのリフレクション • GIとリフレクション • スカイライトとリフレクション • 矩形ライトとリフレクション • マテリアルの使える機能/使えない機能 • AlembicのGeometry Cache
  52. 52. 制約:リフレクションの半透明 • リフレクション側には半透明マテリアルが表示されない 現状ではどんな設定にしても無理 Preview4までは不透明で描画されていた 不透明 半透明加算合成
  53. 53. 制約:リフレクションの半透明 • 半透明設定が無理でもDither半透明ならいけるのでは!? 残念!
  54. 54. 制約:リフレクションの半透明 • 粒子系のNiagaraパーティクルなら不透明マテリアルで対応してもいいかも GDC 2019で発表された『TROLL』デモがどうしてるかは不明 https://www.youtube.com/watch?v=Qjt_MqEOcGM • ただし、後述する問題は残る
  55. 55. 制約:Niagaraスプライト • スプライトとは? ゲームではエフェクトで主に用いられる 常にカメラ方向を正面にする板にテクスチャを貼り付けただけのもの 元々は2Dゲームでパタパタアニメするキャラ1つを指す カメラ方向に向く処理をビルボード処理とも呼ぶ
  56. 56. 制約:Niagaraスプライト • レンダリングカメラ方向を向くスプライトたち 結果がこれ レンダリングカメラ方向を向いている
  57. 57. 制約:Niagaraスプライト • レイトレ用のシーンジオメトリがこちら • この形状としてシーンに登録されているため、シャドウにも影響が出る グレーマンの後方にあるカメラを 向いた板としてシーンに登録され ている
  58. 58. 制約:Maskedマテリアル • アンビエントオクルージョンはMaskedマテリアルを考慮しない SSAOはMaskedマテリアルに対応している Ray Tracing AO Screen Space AO
  59. 59. 制約:半透明マテアリルのシャドウ • 不透明扱いのシャドウ 透過したようなシャドウ、色付きのシャドウは対応していない はっきりくっきりしたシャドウが出てしまうので違和感が大きい Cast ShadowをOFFにしたほうが無難 • Niagaraパーティクルの場合、リフレクションと同じ問題が発生 カメラとライトの向きによって影が細くなったりする シャドウOFF推奨だが、Cast Shadowが動作しない なんでや!
  60. 60. 制約:レイトレ半透明ごしのリフレクション • レイトレ半透明は半透明マテリアルにレイトレした結果を表示する MaxRefractionRaysの数だけレイを飛ばす 打ち切られたらそこまでの結果を合算し、アルファ値を使って元画像に合成 • 打ち切られる前に不透明マテリアルに衝突すると? 不透明マテリアルからレイトレ レイトレリフレクションのバウンス回数等は固定っぽい • 結果!
  61. 61. 制約:GIとリフレクション • レイトレリフレクションはレイトレGIを考慮しない カメラからの映像とリフレクション越しの映像で差異が出てしまう • ライトマップはリフレクションに影響する リフレクションとの差異はない Stationary Light・ライトマップON Movable Light・レイトレGI ON
  62. 62. 制約:スカイライトとリフレクション • レイトレリフレクションはレイトレスカイライトを考慮しない GIと全く同じ ライトマップなら影響する Stationary Light・レイトレスカイライトON Movable Light・レイトレスカイライトON
  63. 63. 制約:矩形ライトとリフレクション • レイトレ矩形ライトを使った場合、リフレクションに矩形ライトが映らない • レイトレ矩形ライトを使わなければ映る r.RayTracing.StochasticRectLight = 0 r.RayTracing.StochasticRectLight = 1
  64. 64. • 使えるライティングモデルは少ない DefaultLit Clear Coat • DefaultLit扱いになるライティングモデル Subsurface Preintegrated Skin Subsurface Profile Two Sided Foliage Hair Cloth Eye • 何故か使えないライティングモデル Unlit:リフレクションで無効化 制約:マテリアルの使える機能/使えない機能
  65. 65. • DXRはレイトレーシングを行う前にシーンを構築する必要がある シーンの構築段階でシーン内のポリゴン座標は確定していなければならない SkinCacheが有効でなければならない理由がこれ スプライトのビルボード問題もここに起因する • SkinCacheはスケルトンによるデフォーメーションとモーフターゲットに対応している スケルトン・モーフターゲットの計算をCompute Shaderで行う →結果をSkinCacheとして保存 →DXRのシーン構築に利用する • SkinCacheはマテリアルの頂点シェーダには対応していない World Position Offsetが使えない 風で揺れる木、頂点ディスプレースメント、テッセレーションはNG • Customized UVは使用できる SkinCacheとは無関係なので 制約:マテリアルの使える機能/使えない機能
  66. 66. • 結果 制約:マテリアルの使える機能/使えない機能 リフレクションに頂点アニメが 適用されていない シャドウもアニメーションしない レイトレ半透明ONの場合、半透明 マテリアルもアニメーションしない 半透明はリフレクションに映らない
  67. 67. • 頂点アニメーションの代わりにAlembicのGeometry Cacheを使えないか? いける! 制約:AlembicのGeometry Cache
  68. 68. • Alembicが使える!これで勝つる! だがしかし…! 制約:AlembicのGeometry Cache Blenderで作った水シミュレーション再生 Houdiniで作ったFractureシミュレーションを配置
  69. 69. リアルタイムレイトレの速度
  70. 70. • 今回は簡単な計測しかしていません みんなが使いそうかな?と思った機能を中心に計測しています • 基本はFPSのチェックくらい NVIDIA Nsight Graphicsを使用 • DXRのデバッグは現状ではNsightかPIXのみ パフォーマンス計測ならNsightの方が個人的には便利 デバッグは複数キャプチャ出来るPIXの方がやりやすいかも? • どちらを使うにしてもパッケージングが必要 エディタから直接は無理っぽい リアルタイムレイトレの速度
  71. 71. • パッケージを作成したら[Select Target Process]ウィンドウで.exeを指定 -dx12を付けて起動することを忘れずに • GPUキャプチャボタンが有効になっているはずなのでボタンを押してキャプチャ 複数キャプチャが可能 • あとはデバッグ! DXRのデバッグ:PIX 起動はLaunchボタン
  72. 72. • メニューの[Connect]を押してプロセスへの接続を開始 -dx12を付けることと、[Automatically Connect]をNoにすること • 起動したらNsightに戻る→現在のウィンドウで[OK]ボタンを押してConnectウィンドウに戻る [Attach]タブに起動したプロセスがあるのでダブルクリックでAttach • あとはキャプチャしてデバッグ! DXRのデバッグ:Nsight
  73. 73. RT Ambient Occlusion SSAO RTAO SamplePerPixel = 1 RTAO SamplePerPixel = 4
  74. 74. RT Reflection SSR RTR MaxBounces = 1 RTR MaxBounces = 4 RTR MaxBounces = 8
  75. 75. RT Reflection RTR MaxRayDistance = -1 RTR MaxRayDistance = 100 RTR MaxRayDistance = 10000
  76. 76. RT Global Illumination RTGI OFF SamplePerPixel = 1 ScreenPercentage = 100 SamplePerPixel = 4 ScreenPercentage = 100 SamplePerPixel = 4 ScreenPercentage = 50
  77. 77. RT Global Illumination SamplePerPixel = 4 ScreenPercentage = 50 MaxBouces = 1 SamplePerPixel = 4 ScreenPercentage = 50 MaxBouces = 4 SamplePerPixel = 4 ScreenPercentage = 50 MaxBouces = 8
  78. 78. RT Stochastic Rect Light SamplePerPixel = 1 SamplePerPixel = 32 SamplePerPixel = 64
  79. 79. RT Sky Light SamplePerPixel = 1 SamplePerPixel = 8 SamplePerPixel = 16 SamplePerPixel = 16 Denoiser OFF
  80. 80. RT Translucency MaxRefractionRays = 1 MaxRefractionRays = 4 MaxRefractionRays = 8 MaxRefractionRays = 8 Refraction ON
  81. 81. • UE4ではマテリアル数に応じたHit Tableが生成される DXRではShader Tableとも呼ばれる マテリアルアセットが同一であればHit Group自体は同じものが使用されている • Hit Tableとは、Hit Groupとそこに渡すパラメータ(テクスチャなど)から構成されている要素 のテーブル レイが衝突した際にそのプリミティブの対応するHit Tableが参照される • マテリアル数が同一であればマテリアルアセット数そのものはあまり関係なかった マテリアルインスタンスを積極的に使っても速度差が出なかった マスターマテリアルが相当数になってくると差が出るかもしれない 要計測 • マテリアルをまとめてHit Tableを減らせば高速化出来るのでは? Hit Table数によるパフォーマンス
  82. 82. • こんなシーンで計測 球1つが1メッシュ1マテリアルの場合 球5x5が1メッシュ1マテリアルの場合 これを切り替えできるようにして計測 Hit Table数によるパフォーマンス
  83. 83. • 球1つが1メッシュ1マテリアルの場合 Hit Table数によるパフォーマンス Hit Table数 DispatchRaysの速度
  84. 84. • 球5x5が1メッシュ1マテリアルの場合 Hit Table数によるパフォーマンス Hit Table数 DispatchRaysの速度
  85. 85. • 微妙な差ではあるが、安定した速度差が出ている Hit Table数を減らした方が遅い • なぜ? 詳細不明 イベントのプロファイルしようとしたら出来なかった UE4の問題?要調査 • 推測 メッシュをまとめたことによりBVHの構成が変化 結果としてレイトレースが重くなっているのでは? Hit Tableの参照やシェーダの実行自体はHit Table数とあまり関係がないかも シェーダ自体の複雑度は実行速度に関係すると思われる • テクスチャサンプリングを行っている場合はHit Tableが減ったほうが有利かも https://shikihuiku.wordpress.com/2019/03/29/falcorのpathtraceサンプルをnsightgraphics を使って最適化してみる/ Hit Table数によるパフォーマンス
  86. 86. まとめ
  87. 87. • リアルタイムレイトレーシングはいくつかの技術を代替する 主にスクリーンスペース系 基本のレンダリングはラスタライザ • 従来技術では対応できない表現が可能になる リフレクションが顕著な例 光源に大きさがある場合のシャドウも良い結果をもたらしている • 制約はそれなりにある パフォーマンスとトレードオフ出来るものもあるが、出来ないものもある 特に半透明関係とパーティクルはいろいろと問題がある • 不具合はまだ多い 特にドライバのクラッシュは割と発生する 修正できたらプルリクエストを出しましょう! まとめ
  88. 88. ご清聴、ありがとうございました

×