強火で進め

このブログではプログラム関連の記事を中心に書いてます。

ビルドイン(内蔵)シェーダの「Diffuse」のコードを読む

さて、シェーダの勉強をして無いままでSHADOWGUNのシェーダの解析は難しそうなのでちゃんとUnityのシェーダの勉強からする事にしました。

ビルドイン(内蔵)シェーダのコードをダウンロード

取り敢えず、Unityのドキュメントをざっと目を通したのですが実際に記述する時のコードが少なめで実践派な自分にはイマイチ向いていなかったので以下のページで配布されているUnityに標準でビルドインされているシェーダのコードをダウンロードして読むことにしました。

UNITY: Built-in Shaders
http://www.unity3d.com/support/resources/assets/built-in-shaders

まずは一番シンプルな記述だと思われる Normal-Diffuse.shader を開いてみることにしました。

シェーダの内容はこちら

Shader "Diffuse" {
Properties {
	_Color ("Main Color", Color) = (1,1,1,1)
	_MainTex ("Base (RGB)", 2D) = "white" {}
}
SubShader {
	Tags { "RenderType"="Opaque" }
	LOD 200

CGPROGRAM
#pragma surface surf Lambert

sampler2D _MainTex;
fixed4 _Color;

struct Input {
	float2 uv_MainTex;
};

void surf (Input IN, inout SurfaceOutput o) {
	fixed4 c = tex2D(_MainTex, IN.uv_MainTex) * _Color;
	o.Albedo = c.rgb;
	o.Alpha = c.a;
}
ENDCG
}

Fallback "VertexLit"
}

早速、Unity上で使いたい所ですがそのまま追加するとUnityに内蔵のシェーダとバッティングするのでShaderの名前を test に変更し、 testShader.shader というファイル名で保存。その後にUnityに追加しました。

Shader "test"

これでMaterialのInspectorで選択出来るShaderに test が追加されました。

このまま使ってもシェーダに Diffuse を選択した時のレンダリングと同じになります。

色々といじってみる

これじゃ、面白くないので色々といじってみます。レンダリングに使用する色は surf 関数の o.Albedo で指定しているっぽいので以下の様に変更してみます。

	o.Albedo = float4(1.0, 0.0, 0.0, 1.0);

この変更を行うと赤でレンダリングされ、なおかつInspactorで設定された色は無視されました。ここで色を設定しているので合ってるみたいです。

続いてその下のアルファ値を設定してそうな部分をこの様に変更してみます。

	o.Alpha = 0.5;

透過されたレンダリングに変更されたのでここでアルファ値を設定している様です。

仕組みをちゃんと調べる

今回いじった surf 関数は以下の部分で関連付けられています。

#pragma surface surf Lambert alpha

検索した所、こちらのドキュメントに解説が有りました。

Unity - Writing Surface Shaders
http://unity3d.com/support/documentation/Components/SL-SurfaceShaders.html

#pragma surface surfaceFunction lightModel [optionalparams]

#pragma surface と記述した後に以下のデータを記載するとの事です。

  • サーフェスシェーダに使用する関数
  • ライトモード(Lambert、BlinnPhong)
  • オプション(今回はalphaを使用している為、アルファ値を扱う事が可能)