ShaderLab理解 コード追っかけてみた


今回の目的
・どのように動作しているか流れを追う
・前回の内容をさらに細かく
 https://qiita.com/moca_uni/items/edd66190168994e58c89

環境
・Unity5.4
・Windows

※Unity ShaderLab Cg/HLSLを想定
自分なりに構造理解(間違っていたら指摘ください)

初期準備

①Unityからビルドインシェーダーを取得する
<Unity公式>
https://unity3d.com/jp/get-unity/download/archive

②取得したシェーダー内の以下のファイルのみUnityプロジェクトに入れる
 →builtin_shaders-5.4.4f1\DefaultResourcesExtra\UI

③UI-Default.shaderを開く

構造体

①struct部
・ユーザーが定義した構造体「appdata_t」に値が入る
・POSITION:ワールド座標、COLOR:色、TEXCOORD0:UV値が自動で入ってくる
 →これ最初わからなかった・・・
 ※UV値は画像の大きさに関係なく0~1の範囲、U(横軸)、V(縦軸)で値が入ってくる

②vertex部(v2f vert(appdata_t IN))
・ここでは取得した情報の加工を行う
 →何もしない場合はそのままフラグメントへ渡す変数「v2f OUT」にそのままの値を渡せばいい
 ※少しずらす場合は「OUT.texcoord.x = IN.texcoord.x + 0.1;」を「OUT.texcoord = IN.texcoord;」の後に追記する

③フラグメント部(fixed4 frag(v2f IN) : SV_Target)
・座標を変更した情報を元に着色するところ、今回は以下のコードを記述
 → return tex2D(_MainTex, IN.texcoord);
  →vertex部で加工したOUT.texcoordのピクセルを取得して、そのピクセルの色をreturnで確定

まとめ

・構造体で取得する値を決めて
・vertex部で座標を加工(移動・回転・拡縮)等して形を決めて
・fragment部で色の付け方を決める
・今回の場合「appdata_t→vert(appdata_t IN)→v2f→frag(v2f IN)→return」になっていた
※vertex部/fragment部の細かい内容は後でやる

最後に

・Shader本冬コミとかに出したい

お世話になった書籍・サイト
<Unityシェーダープログラミングの教科書 ShaderLab言語解説編>超オススメ!!
https://s-games.booth.pm/items/660001
<サイト>
https://qiita.com/sune2/items/fa5d50d9ea9bd48761b2