Renderer Featureを使うとポストエフェクトを組むのが楽になる「SwapBuffer」

高橋啓治郎氏(以下、高橋):1つオマケです。「SwapBuffer」という要素について。URP 12のWhat's Newを覗いてみると、「SwapBuffer」と書いてあります。4行くらいでサラッと書かれていますが、これだけ見てもなんのこっちゃわからないので説明します。

SwapBufferは、Scriptable Render PassにBlitというファンクションが追加されたというアップデートです。わかりやすく言うと、「Renderer Featureを使ってポストエフェクトを組むのがすごく楽になる」機能です。

以前から、Renderer Featureを使うことによってポストエフェクト的なものを組むことはできたんですが、今描かれているフレームバッファに対してポストエフェクトをかけたい場合、これを元に自分で確保したテンポラリのレンダーテクスチャに1回Blitしてから、またこちらに戻すというようにBlitが2回発生します。このテンポラリのRTは誰がどこで確保して、どこで誰が破棄するんだろうと考え出すと複雑になってしまうんです。

しかし、先ほど追加されたRender PathのBlitを使うことによって、URPが勝手に今のフレームバッファとは別にBlit用のRTを用意してくれて、ユーザーがマテリアルを渡すだけでBlit処理を行ってくれます。しかも、これがいつ死ぬかとか誰が確保するのかはぜんぜん気にしなくてOK。マテリアルを1個渡すだけで、フルスクリーンエフェクトが組めてしまうというお手軽な仕組みです。

(スライドを指して)サンプルを見てみると、相変わらずグルーコード的な短いコードを書かないとできないのがなんとも苦々しいですが、これだけのコードを書けばサクッとポストエフェクトを組めるようになりました。やっていることは、マテリアルをインスペクタから貼り付けられるようにして、最終的にBlitを読んでいるだけなので、すごく簡単なスクリプトです。

スクリプトを使ったうえで、ここではシェーダーグラフを使ってフルスクリーン色反転エフェクトを作ってみました。フレームバッファ、メインテクスチャをサンプリングして、One Minusを使って色の要素を全部0・1の間で反転して、フラグメントに書き込むだけのシェーダーグラフです。これをマテリアルにして先ほどのスクリプトにプロパティで突っ込むので、Renderer Featureを有効にすれば、このようにフルスクリーンエフェクトがいきなり動いてくれます。

大下岳志氏(以下、大下):なるほど。

高橋:このようにすごく簡単にフルスクリーンエフェクトを組めるようになったので、みなさんも試してみてはいかがでしょうか。特に、シェーダーグラフでサクッとフルスクリーンエフェクトを組めるのはすごく楽しいので。

大下:そうですね。

高橋:創意工夫して、いろいろなエフェクトを楽しんでほしいと思っています。

大下:コメントがメチャクチャポジティブです。

高橋:うれしいね(笑)。将来的にはコードさえも組まなくていいようにしたいと思っていますが、今は最低限のコードさえ用意すればこういったことが簡単にできるという段階です。今日のサンプルプロジェクトやサンプルコードが入ったサンプルリポジトリをスライドのGitHubのkeijiroのURPTestbedにアップしておいたので、おさらいする時に参考にしてもらえたらと思っています。

アーティスト目線での注目ポイント、プログラマーというか技術的な目線での注目ポイントをいくつか紹介しました。後半のコーナーでは、これ以外のアップデート内容を細かくチェックしていきます。

「Reflection probe」と「Box projection」における機能改善

高橋:「残りの項目をチェックしよう!」と題して後半のコーナーを始めます。前半に説明しなかったWhat's Newを、順に軽く網羅していきたいと思います。

Secene Debug Viewは、先ほど大下さんに触れてもらったので飛ばして、「Reflectin probe blending and box projection support」です。Reflection probeの機能改善も入ったんですよね。

大下:はい。これはわかりやすいと思います。1つ目は、2つのprobeだったり、遠くから近づいたりした時にフェードがかかる、あるいは2つの間をブレンドする機能です。

高橋:blendingですね。

大下:そうですね。2つ目は、box projection。これもビルトインにはもう入っていたんですが、probeの領域をboxで定義することで、その中に入った時の反射の正確性を上げるというテクニックです。

高橋:(スライドを指して)特にこういう四角い壁に囲まれたシーンの反射は、box projectionをオンにすると見た目が顕著にリアルになります。

大下:そうですね。壁から床に落ちているシーンでの整合性がすごく上がるので、いいと思います。

高橋:URPでビルトインと同じ、もしくはそれ以上のことができるようになるのが我々の大目標なので、それがReflection probeにおいても達成されたという感じですね。

大下:「オプションがあるのに有効にならない」とコメントがあります。以前はそうだったかもしれませんが、今でもクオリティセッティングでチェックボックスにチェックを入れないと、この2つは動かないと思います。

高橋:なるほど。一度クオリティセッティングを確認してくださいという感じですね。「URP Deferred Rendering Path」は先ほど説明したので飛ばします。Deferredを使う前にこのドキュメントを一度見てください。すごく丁寧に書かれていて僕も驚きました。

テクスチャを使ってライトの影響範囲にマスクをかける「URP Light Cookies」

高橋:説明したものは飛ばして、次は「URP Light Cookies」です。僕はLight Cookiesを使ったことがないのでイマイチ実感がないんですが。

大下:そうですね。これもビルトインの時からあったんですが、メインの機能はテクスチャを使ってライトの影響範囲にマスクをかけることです。それを使ってライトのプロファイル、形状を作ったり、スライドの絵のように特定の色だけをフィルターのように出したりできる。HDRPよりもずっと簡素な作りです。

高橋:なるほど。Light Cookiesも使えるようになったので、ここでもビルトインを越えるという目標が達成されたのかな。

大下:そうですね(笑)。着実に。

チェックした項目をURP化する「Render Pipeline Converter」

高橋:「Render Pipeline Converter」はなんでしたっけ。

大下:使ってみていい感じだったので、短い動画にまとめました。これは、ビルトインからURPへのコンバートをスムーズにする機能です。使い方は、最初にビルトインで用意したプロジェクトにURPのパッケージを読み込みます。

その後にRender Pipeline Converterを起動して、先に一度イニシャライズで変更ポイントの抽出を行うとスライドのように一覧が出てくるので、確認してコンバートアセットすると、すべてのチェックした項目にURP向けの変更が加わります。基本的にそれだけでURP化はおしまいです。

高橋:なるほど。今回サムネの背景に使ったシーンですね。

大下:そうです。不正なデータもありましたが、実際は特に影響なくそのまま動かすことができました。

高橋:これはありがたいですね。

大下:そうですね。独自のシェーダーが入るとまだ怪しいところはあると思いますが、お試しでプロジェクトを切り替えてみようという時には、すごくハードルが下がったんじゃないかと思います。

高橋:アセットストアで買ったビルトインしか対応してないアセットとかね。

大下:そうですね。

高橋:いいのかもしれませんね。

大下:わりとうまく動いてうれしかったので、動画を作ってみました。以上です。

高橋:Render Pipeline Converterもすごくなりましたね。

「Motion Vectors」がレンダリングできるようになった

高橋:「Motion Vectors」は、Motion VectorsのレンダリングができるようになったことでMotion Blur effectに必要なものですね。

大下:そうですね。ただ、今のところMotion Vectorsがレンダリングできるようになった以上の機能ではない気がしています。

高橋:僕もそう思います。最終的にはこれを使ってテンポラルアンチエイリアスもかけられるようになるといいんですが、とりあえずエフェクトを組むためのインフラとして必要なものなので下地を整えられたという解釈でいいのかな。

大下:今後に期待できそうですね。

高橋:そういうことにしておきましょう。

(次回へつづく)