波打際のブログさん

主に、プログラミング備忘録など。

シェーダー入門したくないけど書いてみたい その1

はじめに

 この記事ではシェーダに関して入門することができません。とりえあずUnityでシェーダを書いて見たい人向けのブログです。シェーダに関する詳細な知識は一切紹介しません。

予めカミングアウトしておくと筆者もシェーダー入門してません。

前提

  • Unityをそこそこ使ってる
  • シェーダーを書いたことがない(人向け)

諸注意

 この記事は薄っぺらい知識で記述されています。記事に誤りがございましたらコメント欄からご指摘お願いいたします。

事前準備

 alfa-jpn/ShaderLesson · GitHub から ShaderLesson.unitypackage を取得し、Unityにインポートしてください。

演習問題について

 インポートしたパッケージを確認してください。題材番号ごとににフォルダ分けされており、演習問題は各フォルダの `Shader/` 下の `Question.shader` を書き換えて解きます。`Answer.shader`は演習の解答例です。どうしても解けない場合は`Answer.shader`を見てください。

00.シェーダについて最低限知っておくべきこと

そもそもシェーダーとは

 とても難しそうに思えてしまいますが、シェーダーで実装しなければいけないことは色情報を決定する処理だけです。

数学的知識は必ずしも必須ではない。

 プログラミングと聞くと数学が必要と勘違いしている人たちと同様の勘違いです。Unityのシェーダーにおいては用途によって必要になるだけです。

でもライトの計算とか必要なんでしょ?

 そういう難しいことは積極的にUnityの便利な機能に委託していきましょう!

01.HelloShader

 `01.HelloShader/HelloShader.unity` を開いてみてください。開くとこのように真っ黒な箱が表示されていると思います。
f:id:alfa-jpn:20150803005237p:plain

 このCubeオブジェクトのマテリアルには次のようなシェーダが適用されています。

Shader "ShaderLesson/01.HelloShader/Question" {
    SubShader {
        Pass {
            Tags { "RenderType" = "Opaque" }
        
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            float4 vert(float4 v:POSITION) : SV_POSITION {
                return mul (UNITY_MATRIX_MVP, v);
            }

            fixed4 frag() : SV_Target {
                return fixed4(0, 0, 0, 1.0);
            }
            ENDCG
        }
    }
}

このシェーダのポイント

 このシェーダには2つの重要なポイントがあります。一つ目はvertという頂点シェーダが存在すること、二つ目はfragというフラグメントシェーダーが存在することです。他の部分は定型文みたいなものだと覚えてください。このレッスンでは触れません。

頂点シェーダ

 名前のまんまです。モデルの頂点を画面上の座標に変換するシェーダです。本当は非常に面倒くさい計算が必要になりますが `UNITY_MATRIX_MVP` のおかげで、モデルの頂点を乗算するだけで画面上の座標に変換できます。

フラグメントシェーダ(別名:ピクセルシェーダ)

 ピクセルシェーダと言われたほうがピンときますね。最終的な色を決定するシェーダです。今回は `return fixed4(0, 0, 0, 1.0);` で黒色を返しているだけです。

御託はこのへんまでにして、シェーダ書いてみましょう!

演習

 上記のシェーダを書き換えて、下記のような赤色の箱がレンダリングされるシェーダを作ってください。
(演習問題の進め方は ブログ上部の 事前準備->演習問題について を参照してください。)
f:id:alfa-jpn:20150803013105p:plain



今回はここまでです。ここから6回に渡り `色` に関連したシェーダを入門せずに書いていこうと思います。

次回はUV座標について解説と演習を行います。