【Unity VFX】ゼルダBotW 風の爆発を作ってみた

2021/06/26に公開

ゼルダBotWのボムっぽい爆発を作ってみました。
https://youtu.be/KjkSFhCxfZc

今回の記事ではシェーダー周りの技術的な解説をしたいと思います。

環境

Unity 2020.2.0a17

使用したツール・機能など

輪郭ディゾルブ

ゼルダBotWの爆発では、球の輪郭付近にノイズの模様が付いたような表現が実装されています。

ゼルダBotWの爆発

フレネル + ノイズテクスチャ

ノイズテクスチャとフレネルをかけ合わせることにより、近い表現を作ることができます。

Color BurnブレンドやVivid Lightブレンドを利用することで、中心は黒く、外側だけノイズが付いたような結果が得られます。

シェーダー実装 (Amplify Shader Editor)

以下のようなノードを組むことで実装できます。

見た目の調整

ノイズのコントラストや色などを調整することで、以下のようなものをつくることができます。

シェーダーは以下のようになっています。

くり抜き表現

ゼルダBotWの爆発では、フレネルの球体をディゾルブの球体でくり抜いたような表現が実装されています。

こちらはStencilバッファを利用することで、同様の表現を作ることができます。

Stencilバッファを利用したくり抜き

通常、モデルの内側のモデルは隠れてしまいます。(画像左)
ステンシルバッファを利用して、外側のモデルをくり抜くことにより画像右のような表現を作ることができます。

Stencilを利用するための設定 (Amplify Shader Editor)

プロパティの追加

Stencilをマテリアル上から設定するため、以下の3つのプロパティを追加します。

  • Stencil Reference : ステンシルテストの参照値
  • Stencil Comparison : ステンシルテストの成功条件
  • Stencil Pass : ステンシルテスト成功時のふるまい

プロパティの設定

Auto-Registerのチェックを有効にします。
Stencil ComparisonやStencil Passに関してはEnumを設定しておきます。


Stencil Bufferの設定

Passカテゴリから、Stencil Bufferのチェックを有効にし、Reference、 Comparison、 Pass Front を設定します。

結果

シェーダーを保存すると、マテリアル上にStencilを設定するための項目が追加されます。

くり抜きを行うためのマテリアル設定

今回は以下のような設定を行います。

  1. 内側の球を最初に描画し、画面にステンシル1を書き込む
  2. 外側の球を2番目に描画し、ステンシル0の場合に描画を行う (ステンシル1の領域では描画をスキップする)

描画の順序はRenderQueueでコントロールします。

内側の球のマテリアル設定

内側のマテリアルでは、Stencil 1 を画面に書き込むように設定を行います。

外側の球のマテリアル設定

外側のマテリアルでは、Stencil = 0 の時にだけStencilテストを成功させるような設定を行います。
Render Queue = 3001 に設定し、 内側の球(Render Queue = 3000)が描画された後に外側の球が描画されるようにします。

結果

内側の球で外側の球がくり抜かれたような表示になります。

参考リンク

https://docs.unity3d.com/ja/2018.4/Manual/SL-Stencil.html

シェーダー

https://gist.github.com/rngtm/b03dfab7b90aee5e28a744aeb86493b9

Discussion