お米 is ライス

C#やらUnityやらを勉強していて、これはメモっといたほうがええやろ、ということを書くつもりです

【Cg Programming/Unity】Basics ~ Minimal Shader【順番にやっていく】

en.wikibooks.org

やっていくぞう!
前にGLSLはチラッとやったことがあるのだけど、CGとかHLSLになると色々書き方が違うのでMinimal Shaderからやり直し。
全部書き起こすのはめんどくさいのでなるべく要点だけにとどめておきたい。

Unityを開いてプロジェクトを作るんだ

せやね

シェーダを新規作成しろ

「Projectウィンドウ」→「Create」→「Shader」→「Standard Surface Shader」で作成する
作成したファイルをダブルクリックするとエディタが開いてシェーダファイルを編集できる。
このファイルは拡張子が「.shader」で、「ShaderLab」というUnity独自の記法で書かれている。

さて、作成したファイルの中身を以下のように書き換える。

Shader "Custom/MinimalShader"
{
    SubShader
    {
        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            float4 vert(float4 vertexPos : POSITION) : SV_POSITION
            {
                return UnityObjectToClipPos(vertexPos);
            }

            float4 frag(void) : COLOR
            {
                return float4(1.0, 0.0, 0.0, 1.0);
            }
            ENDCG
        }
    }
}

Passでくくられた部分が1つのまとまりとなって描画を行う。
Passをいっぱい書けばそれだけ複雑な描画を行うことができる。

CGPROGRAMからENDCGまでの間にシェーダ言語であるCGスクリプトを書く。

シェーダには頂点シェーダやフラグメントシェーダなどがあり、#pragma vertex vertは頂点シェーダとしてvertという関数を用いるということを宣言している。フラグメントシェーダについても同様である。
頂点シェーダやフラグメントシェーダが何なのかは別途調べていただきたい。

vert関数では各頂点のローカル座標であるvertexPosを、UnityObjectToClipPosという既定の関数を使ってクリッピング座標に変換している。
: POSITIONと書くことによってvertexPosが頂点のローカル座標であることを宣言している。
: SV_POSITIONはこの関数の返り値がクリッピング座標であることを宣言している。

frag関数ではそのピクセルでの色を定数値(1, 0, 0, 1)と設定する(つまり赤色)。
: COLORはこの関数の返り値がピクセルの色であることを宣言している。

作成したシェーダファイルで実際に描画してみるのだ

  1. 適当にMaterialファイルを作成する
  2. 作成したシェーダファイルをドラッグ&ドロップ等してMaterialファイルに適用する
  3. 適当にCubeなどのオブジェクトをScene上に配置する
  4. MaterialファイルをCubeにアタッチする

これで今回作成したシェーダスクリプトを使ってCubeを描画できる。
frag関数内の(1, 0, 0, 1)(0, 1, 0, 1)などに変更してやれば、書いたスクリプト通りにCubeが描画されていることがより実感できるだろう。

シェーダファイルのエディタ

シェーダファイルを編集しようとすると当然デフォルトではVisual Studioが開くのだが、Visual StudioさんでUnityのシェーダを書こうとすると非常にストレスフルな挙動になっているので何とかしたい。
とりあえず、VSCodeに「ShaderlabVSCode」という拡張を入れればいい感じに補完とかもしてくれそう。
とはいえ、C#Visual Studioで書きたいとなるとExternal Editorはそのままにしておきたいのでどうしたものか。。。
応急処置としてエディタ拡張でシェーダファイルの横にVSCodeで開くボタンを出しておくことでVisual StudioVSCodeを使い分けられるようにしておく。

f:id:spi_8823:20200502012340p:plain

書いたスクリプトは以下
【Unity】Projectビューにエクスプローラで開くボタンを追加するエディタ拡張 - コガネブログ を参考)

次はこちら。
spi8823.hatenablog.com

余談

いやまとめるの思った以上に体力いるな。。。
これは一日坊主説ある。