Unityのシェーダのプロパティを使ってみる
はじめに
前回の記事では、頂点シェーダ内で行われている座標変換について説明しました。 ちょっと前回の分量が多かったので今回は軽めに。
自分の作ったシェーダのマテリアルのインスペクタにプロパティを追加してみます。
Unityのバージョン: 2018.2.6f1
プロパティの定義
まず最初に今回のシェーダのコードを載せます。
Shader "MyShader/ShaderProperties"
{
Properties
{
_Color ("Color", Color) = (1.0, 1.0, 1.0, 1.0)
}
SubShader
{
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
};
struct v2f
{
float4 vertex : SV_POSITION;
};
uniform float3 _Color;
v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
return o;
}
float4 frag (v2f i) : SV_Target
{
return float4(_Color, 1);
}
ENDCG
}
}
}
前々回の単色塗りつぶしシェーダがベースになっています。 塗りつぶし色をプロパティから選べるようにしました。
Cg/HLSLコード内でuniform
をつけて宣言している変数と、
最初のShaderLabの領域のProperties
ブロックがポイントです。
uniform
をつけて宣言されている変数はuniform型の変数という特別な変数になります。
頂点シェーダの頂点ごとに変わる入力変数や、
フラグメントシェーダのフラグメントごとに変わる入力変数とは異なり、
uniform型の変数はすべての頂点、すべてのフラグメントで等しい値となります。
Cg/HLSLでは宣言時にuniform
が必須ですが、Unityではトップレベルの変数宣言は自動で
uniform
がついている扱いになるのでuniform
修飾子は省略できます。
uniform
をつけておいた方がuniform変数であることがわかりやすいのでつけてあります。
プロパティの値はこのuniform変数として受け取ることになります。 頂点ごとに別の値を渡したい場合はMeshのUVや頂点色などを利用します。
ShaderLabのProperties
ブロックでは、Cg/HLSLコードのuniform型の変数と同じ名前で
プロパティを定義します。
プロパティの定義では、表示名とプロパティのタイプ、そしてデフォルト値を指定します。
ここではColor
を指定しましたが、他にもVector
やFloat
、2D
など
いくつかのものが指定できます。
詳しくはこちらのドキュメントに記載されています。
おわりに
今回は自作シェーダのマテリアルのプロパティについて解説しました。
ソースコードはこちらのリポジトリに置いてあります。