Unity 5のレンダリングパイプラインの拡張:コマンド・バッファ

Unity 5では、ユーザーの目に見える多くのグラフィック機能(新しいStandardシェーダー、リアルタイムグローバルイルミネーション、反射プローブ、新しいライトマッピングワークフローなど)を追加してきましたが、レンダリング内部にも取り組んできました。最適化」(例:マルチスレッドによる光のカリング)や「より一貫性を持たせる」(例:リニアとガンマの色空間の間でより一貫性を持たせる)といった典型的なことに加え、我々は以下を実現する方法についても検討した。 拡張性.
社内やベータテストのグループ内では、さまざまなアプローチについて議論してきた。スクリプト・コールバックの増加、小さな「やるべきことのリスト」バッファの組み立て、完全なレンダリング・パイプラインをゼロから作成する機能、ある種の視覚的なツリー/グラフ・レンダリング・パイプライン構築ツールなど、さまざまなアイデアが飛び交った。Unity 5では、私たちは「コマンド・バッファ」と名付けた「やることリスト」バッファを作成する機能に落ち着きました。
グラフィックスのコマンド・バッファは、実行するコマンドの低レベルのリストである。例えば、Direct3DやOpenGLのような3DレンダリングAPIは、通常、GPUによって実行されるコマンドバッファを構築して終わる。Unityのマルチスレッドレンダラは、呼び出しスレッドとレンダリングAPIにコマンドを送信する「ワーカースレッド」の間にコマンドバッファも構築します。
私たちの場合、考え方は非常に似ているが、"コマンド "は多少レベルが高い。GPUの内部レジスタXを値Yに設定する」といった内容の代わりに、「このマテリアルでこのメッシュを描画する」といったコマンドになります。
スクリプトからコマンドバッファを作成し、そこにレンダリングコマンドを追加することができます(「レンダーターゲットを設定、メッシュを描画、...」)。そして、これらのコマンド・バッファは、カメラのレンダリング中のさまざまな時点で実行されるように設定できる。
たとえば、通常のオブジェクトがすべて終わった後に、遅延シェーディングGバッファにいくつかの追加オブジェクトをレンダリングすることができます。あるいは、スカイボックスが描画された直後に雲をレンダリングする。または、カスタムライト(ボリュームライト、ネガティブライトなど)を、通常のライトがすべて終わった後に、ディファードシェーディングライトバッファにレンダリングします。などなど、面白い使い方がたくさんあると思う。
スクリプトAPIドキュメントのCommandBufferと CameraEventのページを見てください。
オーケー、オーケー。
例えば、ぼやけた屈折をすることもできる:

不透明オブジェクトとスカイボックスがレンダリングされた後、現在の画像が一時的なレンダーターゲットにコピーされ、ぼかされ、グローバルシェーダーのプロパティとして設定されます。次に、ガラスオブジェクト上のシェーダーは、屈折をシミュレートするために法線マップに基づいてUV座標をオフセットして、そのぼやけた画像をサンプリングする。 これはシェーダーGrabPassが行うことと似ているが、よりカスタムなことができる(この場合はぼかし)。
もうひとつの使用例:カスタム遅延ライト。 球形と筒形のライトがある:

通常のディファードシェーディングライトパスが行われた後、各カスタムライトに対して球が描画され、照度を計算するシェーダがライティングバッファに追加されます。
さらに別の例として、延期されたデカールがある。

アイデアとしては、Gバッファーが完成した後、デカールの各「形」(ボックス)を描き、Gバッファー内容を修正する。これはディファード・シェーディングでライトがどのように行われるかに非常に似ていますが、ライティングを蓄積する代わりにGバッファ・テクスチャを修正する点が異なります。

各デカールは、ここではボックスとして実装され、ボックスボリューム内のジオメトリに影響を与える。
実は、ここに上記のすべてを実証する小さなUnity(5.0 beta 22)のプロジェクトフォルダがあります: RenderingCommandBuffers50b22.zip.
スクリプトは100行程度のコードである。
これはエキサイティングなことだと思う。みんながどうするか楽しみだ!
