Dissolveってなんのこっちゃら?と思って辞書を調べてみたら・・・
Dissolve : 分解する、分解させる、溶かす、解消する
だそうです!
Dissolveシェーダ自体は分解というよりも侵食に近い感じがしますが、ジワーっと消えていくタイプのアニメーションのことです。
この記事ではUnityのサーフェイスシェーダを使ってディゾルブシェーダを作る方法を紹介します。
Dissolveシェーダの考え方
トゥーンシェーダや氷のシェーダなどと比べると、Dissolveシェーダの考え方は非常に簡単です。
nn-hokuson.hatenablog.com
幾何学図形やノイズのテクスチャ(別に幾何学じゃなくても大丈夫!)を用意し、そのピクセル明度によって「表示する・しない」を切り替えます。
幾何学図形のテクスチャはどのようなものでも使用できるので(ノイズ画像がきれいな消え方にはなりやすいですが・・・)いろいろ試してみると発見があるかも!?
ピクセルの明度に対するしきい値をシーケンシャルに変化させることで、フワァっと侵食されて消えていくような効果を表現することができるのです。
まずはいつもどおりの下準備
いつもと同じようにシェーダファイルと、それに対応するマテリアルを作ります。プロジェクトビューで右クリックし、「Create」→「Shader」→「Standard Surface Shader」を選択、「Dissolve」という名前で保存します。作成したDissolveシェーダを選択した状態で、右クリック→「Create」→「Material」でシェーダに対応するマテリアルを作ります。
作成したマテリアルは3Dモデルにアタッチしておきましょう。
Dissolveシェーダの作り方
続いてDissolveシェーダを実装していきましょう。次のプログラムを入力してください。
Shader "Custom/disolve" { Properties { _Color ("Color", Color) = (1,1,1,1) _MainTex ("Albedo (RGB)", 2D) = "white" {} _DisolveTex ("DisolveTex (RGB)", 2D) = "white" {} _Glossiness ("Smoothness", Range(0,1)) = 0.5 _Metallic ("Metallic", Range(0,1)) = 0.0 _Threshold("Threshold", Range(0,1))= 0.0 } SubShader { Tags { "RenderType"="Opaque" } LOD 200 CGPROGRAM #pragma surface surf Standard fullforwardshadows #pragma target 3.0 sampler2D _MainTex; sampler2D _DisolveTex; struct Input { float2 uv_MainTex; }; half _Glossiness; half _Metallic; half _Threshold; fixed4 _Color; UNITY_INSTANCING_CBUFFER_START(Props) UNITY_INSTANCING_CBUFFER_END void surf (Input IN, inout SurfaceOutputStandard o) { // Albedo comes from a texture tinted by color fixed4 m = tex2D (_DisolveTex, IN.uv_MainTex); half g = m.r * 0.2 + m.g * 0.7 + m.b * 0.1; if( g < _Threshold ){ discard; } fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color; o.Albedo = c.rgb; // Metallic and smoothness come from slider variables o.Metallic = _Metallic; o.Smoothness = _Glossiness; o.Alpha = c.a; } ENDCG } FallBack "Diffuse" }
デフォルトのSurface Shaderからの変更点は次の二点です。
・プロパティにDissolve用のテクスチャとしきい値を追加
・surfメソッドにディゾルブのためのプログラムを追加
インスペクタからDissolve用のテクスチャを設定できるようにプロパティに_DisolveTexを追加しています。また、「消す・消さない」のしきい値を決めるための_Threshold変数を追加しています。
surfメソッド内ではDisolveテクスチャから値を取り出し、グレースケールに変換しています。グレースケールの変換式は次のようになります。
Gray = R * 0.3 + G * 0.6 + B * 0.1
こちらの記事も合わせて参考にしてください。
nn-hokuson.hatenablog.com
グレースケールに変換後、明度がしきい値(_Threshold)以下のものについては破棄(discard)しています。
実行結果
マテリアルにDissolve用のテクスチャをセットしてから、_Thresholdの値を変化させると次のようにDissolveの効果が確認できます。
Dissolveテクスチャを変えると消滅の見え方も変わるので、いろいろなテクスチャで試してみてください〜!
まとめ
今回は敵キャラを消滅させるときなど、オブジェクトを破棄したいときに使えるディゾルブ(Dissolve)シェーダを作りました。簡単に色々なパターンを作れるので試してみて下さいね!