Unityシェーダーお絵描き入門 - 板ポリの色を変える
楽しいというワードに魅かれて、これをやってみようかと思います。
「適当な板ポリを置いてその上に絵を描く」をやってみます。
Quadを作った
Mesh Renderer が Default-Material になっているので、
右クリック -> Create -> Material でこんな感じの設定のマテリアルを作って
アタッチすれば、水色になった
とりあえずサンプルコードを写経してみる
先ほど作成したMaterial のShaderの箇所から↑のシェーダーを選択(Shader "Custom/Shader1"
適用した結果。リアルタイムで反映されるのはいいですね。
調べていくと、どうやらCGINCLUDEは必須ではなさそう。もっと簡潔にこう書ける
ちなみにこれはフラグメントシェーダーというらしい。ある地点の座標を受け取って、その色を決める関数を作ると、GPUで全ピクセル分実行されて絵になるということらしいです。シェーダーの入門ではよくSurfaceシェーダーを見かけますが、こんな意見もあるようです。
Unityにおける Surface Shader と Vertex/Fragment Shader の大まかな使い分けは、ライトの影響を受けるモノには Surface Shader で、受けないモノには Vertex/Fragment Shader です。
が、勘違いしてはいけません。「Surface Shader > Vertex/Fragment Shader」ではなく、むしろシェーダーの基本は Vertex/Fragment の方です。(以降 V/F Shader と書きます)
コードの意味をわかる範囲で調べてみた。
// シェーダーの名前を定義かな
// シェーダーの1単位っぽい。ただ調べても Unity 公式ページが意味不明過ぎて・・
「Unity の各シェーダーはサブシェーダーの一覧から構成されます。Unity がメッシュを描画するとき、使用するシェーダーを見つけ、ユーザーのグラフィックカードで実行する最初のサブシェーダーを選択します。」
// 同一ファイルに複数のシェーダーを書きたい時はこのSubShaderを並列で並べればいいってことかな
// フラグメントシェーダーだと必ずPassを書かないといけないらしい。Passって何?
// Unity公式は相変わらずよくわからない、もうちょっと初心者にわかりやすく書いてくれればな
「Pass ブロックはゲームオブジェクトのジオメトリを 1 回レンダリングします。」
// 取るとエラーになるし、もうここはフラグメントシェーダーのおまじないってことで・・・
// おそらくCGプログラムをこれから書きますよってこと。じゃあ、今まではCGプログラムじゃなかったのか?
// Unityが標準で用意しているシェーダープログラムを読み込む、だと思う
// 頂点(Vertex)シェーダー に vert_img関数を、Fragmentシェーダー にfrag_test関数を使うと指定しているっぽい
// frag_test は自分でこのあと定義しているけど、vert_img はどっから出てきたかというと、どうやら UnityCG.cginc で定義されている関数っぽい
// ちなみに #pragma (プラグマ)はコンパイラに指示を与えるもので、コンパイルディレクティブっていうらしい
// vert_img はこの記事の説明がわかりやすい
// ここがメインの処理。uvは0〜1の座標が渡されるので、
// 左上が (0, 0, 0, 1)、左下が(0, 1, 0, 1)、右上が(1, 0, 0, 1)、右下が(1, 1, 0, 1)ってことでしょ?あれ?
// UVの座標系は原点が左下なのか、つまり左が0、上が1・・だと
// 左上が (0, 1, 0, 1): 緑、左下が(0, 0, 0, 1): 黒、右上が(1, 1, 0, 1): 黄、右下が(1, 0, 0, 1): 赤
// あってる!
シェーダーって前提となる知識が多くて苦労しそうな予感・・