UE4 Ray Tracing Nightと後日談

けっこう前のことになりますが、UE4 Ray Tracing Night @ Tokyoというイベントでスピーカーの一人として登壇させていただきました。名前の通り、Unreal Engine 4の新機能であるリアルタイムレイトレーシングについて語るイベントです。

UE4のレイトレーシング機能を使った作例

イベントページ:UE4 Ray Tracing Night @ Tokyo

イベントの趣旨や内容については上記イベントページの「資料」のところに上がっている登壇者のスライドを見ていただくのがいちばんわかりやすいです。僕以外のお二方はUE4やリアルタイムレンダリングのエキスパートでもいらっしゃるので、スライドがそのまま教科書になるぐらいの充実した内容です。UE4に興味のある方は必見です。あ、僕のは初心者の体験談みたいなやつです。当日の雰囲気や概要などは、 Togetterのまとめ とか、CG WORLDの記事 でもなんとなくわかるかもしれません。

僕自身はUE4については初心者にすぎず、実装されたばかりのリアルタイムレイトレを面白がって遊んでいただけだったのですが、イベント発起人の皆さんからお誘いをいただきまして、初心者代表とし登壇させていただいた次第です。こういうイベントでは「登壇するのがいちばん勉強になる」というのが定説でして、僕もテストシーンの作成や発表の準備などを通じてUE4についてあらためて勉強するよい機会になりました。それでもまだ初心者には違いないのですが、「多少はものがわかってきた初心者」として今後も情報を発信していきたいとぼんやり思っています。

UE4レイトレのテスト動画

僕の発表はUE4で作ったコンテンツをリアルタイムで動かすのではなく、CGソフトと同じように動画を出力する目的で使ってみるという趣旨のものでした。その際にUE4のレイトレーシング機能のテストとして制作した動画がいくつかあります。イベントの僕のスライドのページからもリンクされていますが、ここでも簡単に紹介しておきます。

なおUE4のレイトレはこの動画を制作したUE 4.22の時点ではまだ「Experimental」、つまり仕様が確定しておらず開発途上の機能であるため、将来的に正式な機能として実装される時点では多少なりと異なるものになっている可能性大であることにご注意ください。このイベントで使用した4.22の次のバージョンである4.23のPreviewリリースの段階でも既に、ガラス等で使われる「Raytracing Translucency」の挙動が変わっています(仕様なのか意図しない動作なのかは本稿執筆時点ではまだわかりません)。

レイトレ不使用の動画

こちらはUE4でレイトレーシング機能を使っていない作例、つまり従来機能だけを使っている動画です。

間接照明は事前計算されてテクスチャ化されているので、これだけ複雑なライティングを行っていても本当に「リアルタイム」で動き、動画書き出しもあっというまに終わります。

いっぽう映り込みなどはレイトレではなくフェイクなので、ところにより非常にウソくさい感じになってしまいます。こうした制約があるため、従来はゲーム等のリアルタイムコンテンツではこのシーンのような「でっかい板ガラスが目の前に並んでいる」といった場面は使いにくかったようです。

なおこの背景セットは Daz 3Dで購入したもの ですが、本来はリアルタイムCG用ではなくDaz Studioという3Dソフトでレンダリングすることを前提としたものです。

レイトレ全開の動画

こちらはUE4のレイトレーシング機能をめいっぱい使った動画です。

影や反射だけでなくGIによる間接照明まで毎フレームでレイトレーシングで処理しているため、計算時間は非常に長くなり、リアルタイムどころか1フレーム書き出すのに平均47秒(30fpsの1,400倍)もかかっています。もっとも、GIありのフルHDで1フレーム1分を切るというのはオフラインレンダラーの常識からするととんでもなく速いともいえますね。

描写のほうは、仕様上の制約により真っ黒で描画されている領域があちこちにあり、さすがにこのまま完成作品にするのは厳しい出来になっています。また、設定をここまで重くするとUE4のエディタでの操作にも支障が出てきます。UE4のレイトレーシングGIについてはまだ限定的な使用しかできない段階だと思います。将来的にはSSGI(スクリーンスペースGI)という、より高速なGI機能が追加される予定らしいので、そちらに期待したいですね。

折衷設定の動画

こちらはUE4の従来機能の事前計算GIとGI以外のレイトレ機能を組み合わせて使っているものです。

GIについては従来機能なので、レイトレーシングGIに起因する問題点、「間接照明が無効になる領域の出現」と「計算時間の増大」の2つは解消されています。また、こちらの設定では1フレームあたり平均7秒で書き出すことができ、劇的にスピードアップしています。ドアが開閉する部分での照明の変化は事前計算のGIでは表現できないので、設定を変えた2つの動画を出力してオーバーラップ合成で表現しています。

まだ反射と透過が重なったところが真っ黒になっているなど問題点はあるのですが、使いようによってはじゅうぶんいけそうな感触がしますね。仕様上の制約を事前に考慮した上でシーン構築をするか、あるいはUE4のレイトレ機能のほうが改善されてくれれば(たとえばマテリアルやオブジェクト単位、1次レイと2次レイで任意に非レイトレに切り替えられる等)、クオリティとスピードいずれも申し分ないものになりそうです。

比較用・Redshiftによるレンダリング

Ray Tracing Nightのスライドではレイトレ機能の比較用としてC4D + Redshiftによる静止画のレンダリングも出していましたが、動画はレンダリング時間がかかりすぎるので間に合いませんでした。その後、動画をレンダリングしたのでここで紹介しておきます。前半はレンダリングしたままの映像、後半はAfter Effectsのプラグイン Neat Video でノイズ除去を施した映像です。

さすがにガチのレンダラーなので、仕様上の制約で表現できないといった要素はありません。安心して使えます。とはいえ、これはかなり照明の条件が厳しいシーンなので、1280*720のサイズで1フレームあたり4~5分かけてもまだまだザラザラです。正攻法でザラザラを消すにはこの2倍ぐらい時間をかけないといけません。

そこで、Neat Videoでノイズ除去をかけてみたのが動画の後半の映像になります。粒子状のノイズがあっさり消えてしまいます。

AEプラグインによる後処理でレンダリング時間にして2倍の効果が得られるとは驚きですが、決して万能ではありません。ノイズに似た性質のテクスチャもいっしょに消されてしまうのです。この例だと、クマのキャラクターのテクスチャにあるざらついた模様が全部消えてつるつるになってしまっています。

マスクを使ってマテリアル毎にNeat Videoの効果を加減するとか、AOV(マルチパス)で間接照明成分だけにノイズ除去をかけるとか、対策はありそうですが一手間増えてしまいますね。

Neat Videoはテクスチャにも影響する

なおRedshiftにもデノイズ機能がついていますが、効果はNeat Videoにはまだ及ばないようです。Neat Videoは時間的に前後のフレームを参照してノイズ成分を検出しているようなので、単一フレームで完結しなくてはいけないレンダラーで同様の効果を得るのは難しいのかもしれません。

UE4のほうは、レイトレーシング関連のデノイズ機能はありますがノイズをぼかす程度の効果しかないようです。ですが、Temporal AAという時間的にサンプルを補間するアンチエイリアス機能があり、それによって粒子状のノイズがかなり軽減されています。高速なレンダリングの秘密はそのへんにもありそうです(この話もRay Tracing Nightのスライドに書いてあります)。