【Cg Programming/Unity】Basics ~ Minimal Shader【順番にやっていく】
やっていくぞう!
前に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
はこの関数の返り値がピクセルの色であることを宣言している。
作成したシェーダファイルで実際に描画してみるのだ
- 適当にMaterialファイルを作成する
- 作成したシェーダファイルをドラッグ&ドロップ等してMaterialファイルに適用する
- 適当にCubeなどのオブジェクトをScene上に配置する
- 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 StudioとVSCodeを使い分けられるようにしておく。
書いたスクリプトは以下
( 【Unity】Projectビューにエクスプローラで開くボタンを追加するエディタ拡張 - コガネブログ を参考)
次はこちら。
spi8823.hatenablog.com
余談
いやまとめるの思った以上に体力いるな。。。
これは一日坊主説ある。