開発のための言語や環境と資料:超速Unityシェーダ入門(2)

Unityのロゴ。

基本的にどのような開発環境であってもシェーダはシェーダ専用の言語を用いて開発します。 特に Unity のシェーダを開発するときは、ShaderLab と呼ばれる Unity 独自の言語仕様と、 それ以外の言語とを組み合わせることになります。

ShaderLab

Unity でデフォルトのシェーダを新規に追加したとき、必ずこの形式で記述された shader ファイルが生成されます。 Shader Lab のソースコードは実際には次のようなものです。

Shader "MyShader" {
    Properties {
        _MyTexture ("My Texture", 2D) = "white" { }
        …
    }
    SubShader {
        // Cg / HLSL / GLSL を使ったシェーダの実装
    }
    SubShader {
        // より簡単で低レベルなシェーダの実装
        // マシンスペックに応じてこちらのシェーダを使うようにする
    }
}

言語形式は C や C# に近いです。ソースコードの詳細は後にするとして、ShaderLab に関する資料は Unity の公式の資料か関連書籍を探すのが良いと思います。

Unity の公式のリファレンスは必ずしも十分とは言い難いですが、 先のコンテンツで紹介した Surface Shader や Vertex・Fragment Shader に関する基本的なサンプルと資料は用意されています。

非公式の資料としては次の URL の記事がよくまとめられていて、必要に応じてページ内検索するなどすると良いと思います。

Cg / HLSL / GLSL

執筆時現在までに一般的に使われているシェーダ言語には Cg, HLSL, GLSL などが挙げられます。これ以外にもありますが本質的な話題なので割愛。

HLSLHigh Level Shader Language の略称で、Microsoft DirectX などと共に使われてきたシェーダ言語です。 GLSL GL Shader Language の略称で、OpenGL と共に使われてきたシェーダ言語で、Cg は NVIDIA が提唱する言語です。 いずれの言語も構文・言語仕様は C 言語に近く、HLSL と Cg は良く似た言語となっています。

それぞれの言語の思想や背景、方針などについても割愛するとして、Unity ではほとんどの場合に Cg 言語を利用しています。 Unity では GLSL も利用することができますが、特定の環境に出力する場合にのみ考慮するような形で利用するので、 ひとまず学習に当たっては覚える必要はないと思います。

Cg は HLSL に構造が近く、実際のところ資料を探すにあたり HLSL の資料が見つかることも良くあります。HLSL の資料も抑えておくのが良いです。 HLSL などのリファレンスが置いてある MSDN は比較的読みやすいリファレンスだと思います。変数型や関数を学ぶためには良いと思います。

学習のためには既存のコードを読み書きする

色々公式のリファレンスがあるとしていますが、リファレンスはリファレンスで学習に使えるかというとまたちょっと違います。 シェーダを学習するためには、公式のコードを読み書きしたり、有志によって公開されているコードを動かして改造してみたりするのが良いです。

書籍

シェーダについて言及された書籍を参照するのも良いと思います。私が随所で書いていることですが、 書籍のメリットはある人物がある1つの思想を持って管理した情報を提供していることです。

検索で勉強を進める場合、どうしても複数人の情報を調べますし、それぞれの趣旨や思考・指向が異なってしまい、一連の流れを持って学習を進めることができません。 ただし、一連のコンテンツとして提供されている場合には WEB ベースで学習を進めても良いと思います。

検索も便利ですし、ましてコピペして動かしたいなんて需要があるプログラミングですから、活用できるシーンは沢山あります。 ただ書籍は書籍でまとまっていてよいですし一長一短です。

下の書籍はズブの素人の私に先輩方がオススメしてくださった書籍です(執筆時チームラボインタラクティブチーム所属)。 CG で使う数学の基礎知識とシェーダの入門レベルの情報が掲載されています。 投影変換や平行・回転移動、シェーディングなどについての基本知識も学びたい、手元で参照したい、というときに良いと思います。

検索して情報を集めていると、下記の洋書も良く参考にされているようです。 バージョンアップに伴い、新しい書籍が直ぐに出ているのは更新が早く積極的な情報開示の姿勢が見えて良いと思います。 旧バージョンの書籍が安くなるのも良いですね。

その他の資料

検索すると有志の皆さんが勉強するにあたって実装した簡単なサンプルなどがありますからそれらが非常に優秀な資料になります。 また次のような資料も良くまとまっていて良いですよね。

開発環境

シェーダのソースコードハイライタ

VisualStudio を使っている場合、標準のままだとシェーダのソースコード(Cg言語)はハイライトされませんが、 次の無償のプラグインを導入することによってソースコードをハイライトし、見やすくすることができます。 他に HLSL をハイライトしてくれるシェーダなどがあります。Unity で直接 HLSL ファイルを扱うことはなさそうですけども。

他のテキストエディタを利用している場合にはこの限りではないです。Cg は C や C++ に近い構文の言語ですから、 プラグインなどが提供されていないとき、最悪シェーダファイルの場合には C や C++ のハイライトを適用するように設定すれば可読性は向上するでしょう。

シェーダのデバッグ

シェーダのデバッグは非常に大変ですが、VisualStudio を使えばシェーダもデバッグできるようです(使ったことないですが)。公式に資料が用意されています。 Windows であれば積極的に使っていっても良さそうですね。もしかすると Mono Develop にもあるかも?