はじめに
好きな絵作りをするためにシェーダを書く必要が出てきたので勉強したときのメモ
Unityはシェーダを書いてすぐ確認できるのでUnityで勉強することにしたが、
Unityドキュメントで書式を把握するのは結構大変。
書式を気にせずサクッといじりたいのであればUnreal Engineのブループリントエディタで書くほうが楽な気もする。
シェーダの追加
追加は簡単で、Assetフォルダで右クリックすればShaderを追加できる。
けどいきなり4種類も出てきて何がなんだか初めてのときはさっぱりわからん。
- Standard Surface Shader
- Unlit Shader
- Image Effect Shader
- Compute Shader
とあるが、上から順番にざっくりと
- Unity標準の物理ベースシェーディングの一部をいじるシェーダー
- 自力で全部書くシェーダー
- ポストエフェクトシェーダー
- コンピュートシェーダー
って感じ。
SurfaceShaderは面倒なライティングとかUnityが用意してくれるので楽チン。
UnlitShaderは全部自前でやるので面倒だけど好きに絵作りできる。
あと二つは名前の通り。
ちなみに別物シェーダーが生成されるのではなく書式テンプレが変わるだけなので、
Surface Shader生成したあとUnlit Shader書式に直せばUnlitで動く。
SurfaceShaderはUnityがコンパイルしていろいろやってくれるので
Unlitで使うPass{...}が使えなかったりするので注意。
自作シェーダーの適用方法
マテリアルを生成して自作シェーダーをD&D等で指定すればよい。
Assetフォルダにマテリアルを置いたり、スクリプト上で実行時にマテリアルを生成してシェーダを割り当てたりする。
後者はImage Effect Shaderでよく使う割り当て方。
参考になるもの
基本だけどUnity > Standard Assetsにあるシェーダーが一番確実な資料。
Unlit > TextureとかImage Effect > Blurとか見てみるとよい。
ざっくりとしたシェーダー構成
Shader "グループ名/シェーダー名" {
//Inspectorと連携する入力パラメータ
Properties {
//入力テクスチャ 場合によっては自動割り当て
_MainTex ("Texture", 2D) = "white" { }
// other properties like colors or vectors go here as well
//色
_Color ("Color", Color) = (1,1,1,1)
//小数値
_Value ("Value", Float) = 1.0
}
//シェーダー実装1
SubShader {
CGINCLUDE
//この間にパス共通設定記述
ENDCG
//頂点シェーダー等記述。書式はsurfaceやunlitで違う
}
//シェーダー実装2 実装1が使えないときはこっちが使われる
SubShader {
}
}
Shaderの座標系
頂点シェーダー
頂点単位で処理される。
頂点情報はローカル座標系で渡されるのでMVP変換してビューポート座標系に変換して返す。
サーフェイスシェーダー
フラグメントシェーダー
頂点情報で決定された描画ピクセル毎に処理される。
ウィンドウ座標系な値を取得することもできるが、
基本的に頂点シェーダーで計算した法線やuv値の補間値を使うことになる。
Shaderのパス
パス1で黒塗りして、パス2で本書きとパスで複数回描画指定ができる。
1シェーダーに複数機能をもたせたいときは多パス記述しておいて、スクリプトで描画のときどのパスを使うか指定したりする。
モデルに黒縁をつける絵作りでは
- Pass1 頂点を法線方向に膨らませて裏面黒塗り
- Pass2 通常描画
という2パス描画が簡単な方法として使われる。
SurfaceShaderの複数パス
SubShader内に複数描画処理(パス)を書く際はCGPROGRAM〜ENDCGで囲む
SubShader{
//1パス目
CGPROGRAM
...
ENDCG
//2パス目
CGPROGRAM
...
ENDCG
UnlitShaderの複数パス
SubShader内に複数描画処理(パス)を書く際はPass{...}で囲む
SubShader{
//1パス目
Pass {
CGPROGRAM
...
ENDCG
}
//2パス目
Pass {
CGPROGRAM
...
ENDCG
}