UnityでShaderを書く際、#include "UNityCG.cginc"
や"pragma vertex vert_img
と書くことがあります。これらの意味を自分なりに解説しようと思います。
1.#include "UNityCG.cginc"
とは
公式リファレンスによると、
UnityCG.cginc のデータ構造
- struct appdata_base: 位置、法線、テクスチャ座標、頂点シェーダー入力。
- struct appdata_tan: 位置、法線、接線、ひとつのテクスチャ座標、頂点シェーダー入力。
- struct appdata_full: 位置、法線、接線、頂点カラー、ふたつのテクスチャ座標、頂点シェーダー入力。
- struct appdata_img: 位置、ひとつのテクスチャ座標、頂点シェーダー入力。
となっている。
つまり、Unity上における物体の頂点や法線の情報を引き渡してくれるものだと考えられます。
2.モノクロ調を使った解説
今回はおもちゃラボ様のCustom/monoToneスクリプトを使用させていただきます。
詳しい作り方はリンク先をご覧ください。
Shader "Custom/monoTone" {
Properties {
_MainTex("MainTex", 2D) = ""{}
//インスペクタ表示できる2D型のメインテクスチャを宣言
}
SubShader {
Pass {
//今回はPassは1つだが、2パスにしたい場合はPass{}の後にもう一度Pass{}を追加する
CGPROGRAM
//ここから描画処理
#include "UnityCG.cginc"
//物体の頂点や法線データの取得
#pragma vertex vert_img
//3D空間の頂点座標をカメラで見る2D座標に変換した値
#pragma fragment frag
//頂点座標に付随する色。その場所には何色があるかの値。
sampler2D _MainTex;
//Propertiesで宣言した変数はCGPROGRAM内でもう一度宣言しないと使用できない
fixed4 frag(v2f_img i) : COLOR {
//v2f_img型は2次元のx,y座標をもつ。この座標に対してどう色をつけるかをこの関数で決定する。
fixed4 c = tex2D(_MainTex, i.uv);
//_MainTexのテクスチャのi.uv座標の色の値を取得
float gray = c.r * 0.3 + c.g * 0.6 + c.b * 0.1;
c.rgb = fixed3(gray, gray, gray);
return c;
////座標iにおける、グレースケール化した色値cを返す
}
ENDCG
}
}
}