Unityな日々(Unity Geek)

Unityで可視化アプリを開発するための試行錯誤の覚書

Unity Shaderの基本構造

シェーダーとはレンダリングを行うプログラム。Unityには80以上のビルトイン・シェーダーが組み込まれている。

自分でシェーダーを書く場合の基礎知識をまとめる。Unity Manual/Shaders Overview

Shader全体はShderLabでラップされる。基本構造は次のとおり。

Shader "MyShader" {
    Properties {
        _MyTexture ("My Texture", 2D) = "white" { }
        // other properties like colors or vectors go here as well
    }
    SubShader {
        // here goes the 'meat' of your
        // - surface shader or
        // - vertex and fragment shader or
        // - fixed function shader
    }
    SubShader {
        // here goes a simpler version of the SubShader above that can run on older graphics cards
    }
}

UnityのReferenceには、まずShaderLabを理解してから各論に進め、と言っているので、ShaderLabについて。

そもそもシェーダとは、そのシェーダを適用したマテリアルがどのようにレンダリングされるかを定義するプログラム。

Shader "MyShader" { ... } でシェーダを定義する。1つのファイルに1つのシェーダしか定義できない。 "MyShader"には任意の名前をつける。"MyDirectory/MyShader"のようにすれば、MyDirectoryグループの下のMyShader、というように階層(グループ)構造にできる。

Properties {…}は、プロパティ、つまり、ユーザが入力・変更できる変数を定義する場所。オブジェクト指向言語でいえば、Public変数に対応する。

Subshaderは、 Subshader {...} Subshader {...} ... fallback というように、Shaderの中に複数のSubshaderを記述できる。Subshaderは少なくとも1つないといけない。 Shaderが読み込まれると、UnityはSubshaderのリストを上から見ていって、使用しているマシン(=Graphic Card)がサポート可能な最初のSubshaderを適用する。 もしどのSubshaderも使えない場合は、fallbackに指定したシェーダを使う。 これによって、ハイエンドユーザ向けのSubshader、ミドルエンド用、ローエンド用、と書き分けることができる。

    各Subshaderの書き方には次の3種類の方法がある。

  1. サーフィスシェーダ  「光と影」に関するシェーダ。つまりライトと組み合わせて使用される。逆にライトと関係ないならサーフィスシェーダは使うべきではない。Cg/HLSLを使える。

  2. 頂点シェーダ・フラグメントシェーダ  ライトと関係ない効果、あるいは、サーフィスシェーダでは扱えないような特殊な効果を得たいときに使う。Cg/HLSLを使える。  

  3. 固定関数シェーダ  プログラマブル・シェーダを使えない旧式、あるいはモバイル・ハードウェア用。ShaderLabのみで書かれる。