Shaderとは
陰影処理を行うためのプログラムのこと
Shaderを書く前に
エディタによってはShader用のextensionがあるのでインストールしておくと楽にShaderを書くことができます。
お使いのエディタで調べてみましょう。
Unity上では4種類のShaderを作成することができます。
Surface Shader
ライティングやシャドウを簡単にいい感じにしてくれるShader
Unlit Shader
Shader言語
HLSL
High Level Shading Language
の略称
マイクロソフトによって開発されてDirectXで使われてきた。
後述のCg言語と似ている。
Cg言語
NVIDIAによって開発された。
C言語をベースとした文法。
GLSL
OpenGL Shading Language
の略称
OpenGLで使われてきた。
C言語をベースとした文法。
ShaderLab
UnityではShaderLabというHLSL、Cg言語をラップしたようなもので記述される。
Shaderを書いてみる
オブジェクトの色を青くする最低限のShaderを書いてみる。
Shader "Custom/sample1"
{
SubShader
{
CGPROGRAM
#pragma surface surf Standard fullforwardshadows
struct Input
{
float2 uv_MainTex;
};
void surf (Input IN, inout SurfaceOutputStandard o)
{
o.Albedo = float4(0, 0, 1, 0);
}
ENDCG
}
}
解説
Shader "Custom/hoge/sample1" // Unity上から参照するパスのようなもの。Shader毎のグルーピングに使える
{
SubShader
{
CGPROGRAM // プログラムの内容はCGPROGRAM~ENDCGの中に記述していく
// #pragmaはどの関数がsurfaceなのかを明示している
#pragma surface surf Standard
struct Input
{
float2 uv_MainTex;
};
// surfaceシェーダー関数を定義している。関数名は自由につけることができる
void surf (Input IN, inout SurfaceOutputStandard o)
{
o.Albedo = float4(0, 0, 1, 0); // RGBAでBを1にしているのでオブジェクトは青くなる
}
ENDCG
}
}
尚、Cg言語で扱えるデータ型については下記を参照
https://ja.wikipedia.org/wiki/Cg_(プログラミング言語)#データ型
Properties
Shaderにはプロパティを定義することができ、Unityエディタ上から編集することができるようになります。
Shader "Custom/hoge/sample1"
{
Properties {
// カラープロパティを定義。デフォルト値は黒
_Color("Color", Color) = (0, 0, 0, 0)
}
SubShader
{
// SubShader内でプロパティをメンバ変数として定義
fixed4 _Color;
void surf (Input IN, inout SurfaceOutputStandard o)
{
o.Albedo = _Color;
}
ENDCG
}
}
Colorというプロパティが設定されていますね。
定義できるプロパティは下記を参照
https://docs.unity3d.com/ja/current/Manual/SL-Properties.html