【UnityShader】Shader自習メモ①
わかんない!シェーダわかんない!
シェーダのやってることは1つもわかんないよ!
そもそも頂点シェーダって何!?頂点?だから何なの!?
Passって何?どこにあればいいの!?float2とfloat4だと何がいいの!?何でふたつでわけてるの?floatはfloatじゃないの!?
わかんないから牛歩学習する
目標はステンシルを利用?したアウトライン表現のできるシェーダ作りとモーショングラフィクスっぽいやつです。
まずは基本構造
とにもかくにも構造がわからない。
だからデフォルトのスクリプトも読めない。
結果お話にならない。
ので
UnityEditor上のCreate>Shader>どれかでシェーダーファイルを作成し、VSなりで開きます。
なんかゴチャゴチャ長いのが書いてありますが、要点だけ抜き出すとこういう構造になってるみたいです。
シェーダ基本構造のコード
//Shaderファイルの場所を指定 Shader "Custom/MonicaTest" { //インスペクタから受け取るプロパティ Properties { //UnityEditorのInspectorウィンドウから変更できる } //SubShaderブロックはShaderブロックに必ず1つ以上存在する SubShader { //Passブロックは必ず1つ以上存在する //Passブロックが実際に見た目に影響を与える Pass { CGPROGRAM~に実際のシェーダコードを記述 CGPROGRAM //ここに実際のシェーダコードを記述する ENDCG //~ENDCGに実際のシェーダコードを記述 } } }
こんな感じです。
Shaderの記述で最低限必要なブロックが以下のように構成されています。
- Shaderブロック
- Propertiesブロック
- SubShaderブロック
- Passブロック
- CGPROGRAM~ENDCG
- Passブロック
SubShaderブロックは1つ以上と書いてありますが基本レベルのシェーダーでは1つで十分です。
シェーダの内容部分って実は関数のように記述するらしくて
それらの処理をCGPROGRAM~ENDCG内に記述します。
Editorから作れて、入門できるシェーダ
StandardSurfaceShader
光の計算などをUnity側でやってくれるスグレモノ・・・らしい。
でも完全初心者にはむいてなさそうなんで、後回しにします。
UnlitShader
頂点・フラグメントシェーダのこと。らしい。
3Dモデルから頂点と、その頂点でできた図形のそれぞれで分けて、描画するみたいなシェーダ。
こっちを使って勉強していきたいと思います。
頂点・フラグメントシェーダの中身
結構ごちゃごちゃしてますがPassの中のCGPROGRAM~ENDCGにメイン処理がある感じです。
通常のC#スクリプトで言うClass{}に近いですかね?
CGPROGRAM~ENDCGの中身
さらにその中から要点だけザッと見てみます。
- #programa ??? ?????
使う関数の宣言(?)の部分です。
vertex vert は頂点関数の名前を「vert」に命名
fragment frag はフラグメント関数の名前を「frag」に命名
そんなことを書く部分です。
vertとfragは任意の名前に変えられますが、一般的な命名らしいのでそのままでいきましょう。
- #include "??????"
標準では"UnityCG.cginc"だけありますが、これがあるおかげでShader言語が使えるみたいな感じです。
C#スクリプトで言うusingです。自作のもの追加できるらしい・・・難しそうなのでスキップ。
- struct ???{}
おなじみの構造体ですね。
appdata はシェーダが適用されるモデルのデータっぽい。
v2f はvertex to fragmentの略だそうで、vert関数からfrag関数に値を受け渡すための架け橋。
- v2f vert (appdata v){}
頂点関数。
戻り値はfrag関数へ渡すためv2f型。
引数はモデルデータらしきappdata。
- fixed4 frag(v2f i) : SV_Target
フラグメント関数。
戻り値はfloat4型(いや何だそれ)
引数はvert関数から受け取るためv2f型。
SV_Targetは気にしなくていいと思う(ピクセルカラー的な意味)
なぞのワードと使い方
floatが何種類かあったと思います。
float,float2,float4,ですね。(float3もあるらしい)
floatは見ての通り普通のfloat。少数が入ります。
float2は配列です。2つまでfloat型の値が入ります。
float4も同じく。こちらは4つまで。
実際に使うときは
float a = 1.0; float2 b = float2(0.0, 1.0); float4 c = float4(1,1,1,1);
こんな感じです。
基本的に
float2はXY座標系で表される画像などの情報を受け取るために使います。
float4は色の値が多く、RGBA値として使うことが多いです。
vert関数やfrag関数の戻り値、引数は既に受け渡しができているので触らなくていいと思います。
色々あるけど・・・
初心者が最初に触るべきはfrag関数です。
- 仕組みが単純
- 処理の反映を確認しやすい
この2つが大きな理由ですね。
このfrag関数を学んでからいろんなShaderを勉強するとよさそうです。
とうわけでfrag関数をメインにやっていきます。
・・・・次回から。
次回できました
参考にさせていただいたサイト・スライド
・「楽しい!Unityシェーダー お絵描き入門! 」
@setchiさんのスライド
ガチガチの初心者が始めるべき順番、知識量を適切に教えてくれる。受け身で始めるならこっち。
docs.google.com
・おもちゃラボさん
調べたいことに対しての情報が良い感じに載っていてスゴイ。自発的に始めるならこっち。
nn-hokuson.hatenablog.com