Shader Forgeで作成したシェーダーファイルをcgincでまとめてしまう

#Shader Forgeで作成したシェーダーファイルからcgインクルードファイルは作れるか？
Unity向けのビジュアルシェーダーエディタであるShader Forgeは、.shaderという拡張子のついているシェーダーファイルを作成しています。

Shader Forgeで作成された.shaderファイルからcgインクルードファイルが作れたら、Shader Forgeだけでは作りにくいような複雑なシェーダーも作れるはずなので、実験してみました。

![0718-23_01.png](https://qiita-image-store.s3.amazonaws.com/0/12313/f31d26e6-7c20-bc40-f649-1b019d40bff2.png)


#１：Shader Forgeでサンプルシェーダーを作ってみる
まずはShader Forgeでサンプルシェーダーを作ってみます。
１つめは、HalfLambertのシェーダーです。

![sf_halflamberttest_7202016.png](https://qiita-image-store.s3.amazonaws.com/0/12313/669ca71d-e671-768a-899c-419aaa8965db.png)

こちらはHalfLambertTest.shaderという名前のシェーダーファイルになっています。

２つめとして、Outlineのみのシェーダーを作成します。

![sf_outlinetest_7202016.png](https://qiita-image-store.s3.amazonaws.com/0/12313/bea15a31-9ea4-81ad-4ca4-8640a96289d7.png)

こちらはOutlineTest.shaderという名前になっています。

これらの拡張子.shaderのファイルは、Visual StudioやMonodevelopmentのようなIDEで開くことができます。

#２：cgインクルードをする.shaderファイルを作成する
つぎにcgincファイルを挿入するひな形となる.shaderファイルをテキストで用意します。
UnityのProjectウィンドウから適当なshaderファイルを新規作成し、以下のコードを中身にコピペしてしまえばいいでしょう。

```cgincbase.shader
//このShaderファイルのシェーダー名を指定する
Shader "Shader Forge/IncludeTest"
{
	Properties
	{
	//ここに必要なプロパティを各shaderファイルからコピーする

	}
	SubShader
	{
		Tags
		{
		//全体にかかるタグがあればここに

		}

//以下、ひとつめのPASS
		Pass
		{
			// このパスの名前があれば
			Name " "
			Tags{
				// このパスだけのタグがあれば

			}

			CGPROGRAM
			// 以下、ShaderForgeで作成したshaderファイルのあるパスのCGPROGRAMヘッダー

			// 以下、上のCGPROGRAMヘッダー部分を除いたパスの中身を別ファイル化したcgincをインクルード
			#include " .cginc"
			ENDCG
		}

// 以下、必要な数だけパスを繰り返し
		Pass
		{
			// このパスの名前があれば
			Name " "
			Tags{
				//このパスだけのタグがあれば

			}

			CGPROGRAM
			// 以下、ShaderForgeで作成したshaderファイルのあるパスのCGPROGRAMヘッダー

			// 以下、上のCGPROGRAMヘッダー部分を除いたパスの中身を別ファイル化したcgincをインクルード
			#include " .cginc"
			ENDCG
		}

	}
	// FallBackの指定を入れておく
	FallBack "Legacy Shaders/Diffuse"
}
```

こちらにShader Forgeで作成した、HalfLambertTest.shaderおよびOutlineTest.shaderから必要な要素だけコピペします。

#３：HalfLambertTest.shaderを開いて中身を検討する

ここからはShaderファイルをIDEで開いて、中のコードを検討することになります。
HalfLambertTest.shaderは次の様な構成になっています。
ざっと中身を見てみると、冒頭にプロパティがあり、SubShaderの中には「Forward」と「Forward_Delta」の２つのPassがあります。

![HalfLambert.png](https://qiita-image-store.s3.amazonaws.com/0/12313/063940c0-273b-13d5-3afa-ada0a363222f.png)

これらを上の図のようにブロックに分割して、ひな形の方にコピペしていきます。
また緑と紫のブロックに関しては、各々「HalfLambertTestForward.cginc」「HalfLambertTestForwardDelta.cginc」という名前で、別ファイルとしてセーブしておきます。


#４：OutlineTest.shaderを開いて中身を検討する

続いてOutlineTest.shaderは次の様な構成になっています。
こちらにも２つのPassがありますが、最後のPassはあまり意味のある処理をやっていないようですので、ここはバッサリと切ってしまいます。

![Outline.png](https://qiita-image-store.s3.amazonaws.com/0/12313/3bf9618f-f1aa-3955-3380-bbbf1d601c4d.png)

こちらも青のブロックは、「OutlineTest.cginc」という名前で別ファイルとしてセーブしておきます。

#５：cgインクルードファイルとして２つのシェーダーを読み込む

さて、２のひな形より内容をコピペしたshaderファイルを「IncludeTest.shader」と名付け、３および４の各要素を指定の場所にコピペすると、以下の様な状態になります。

![Include.png](https://qiita-image-store.s3.amazonaws.com/0/12313/63915dc2-d78b-d5d7-f6d8-a137ac43e466.png)

こちらのシェーダーファイルからマテリアルを作成すると、１で作成した２つのシェーダーがひとつのシェーダーとしてUnity上で利用することができます。

![0720-22_01.png](https://qiita-image-store.s3.amazonaws.com/0/12313/245bfdf4-e77f-2142-dcb1-f9a8ebd1a5b1.png)

#まとめ
途中.shaderファイルを開いて中身を検討する必要がありますが、必要な部分とそれらをコピペする先には法則性がありますので、いくつか.Shaderファイルを開いてみれば理解できるようになることでしょう。

Shader Forgeを使って直感的に作成した複数のシェーダーをこのようにまとめてしまったり、cgincとして別のシェーダーに再利用することができれば、さらに利用の幅が広がることでしょう。

Enjoy Your Happy Unity Life :-)

※本投稿は、Unity5.3.5f1とShader Forge v.1.27で検証しています。

※※ちなみに今回作ったHalfLambert＋Outlineのシェーダーは普通にShader Forgeで組むことができますので、この目的のためにcgincをする必要はありません。念のため(^^;)