Shader
https://unity3d.com/jp/get-unity/download/archive
※こちらのダウンロードを左クリック、ビルトインシェーダーからスタンダードシェーダーの中身を見ながらメモ
Unity のシェーダーは、次の 3 つの方法のいずれかで記述
- Surface Shader
- 頂点シェーダーとフラグメントシェーダー
- 固定関数シェーダー
・Properties Inspectorで表示
・Subshader
各シェーダーは SubShader のリストから構成されます。少なくともひとつが必須,
Unity はサブシェーダーのリストから、エンドユーザーのマシンでサポートされる最初のサブシェーダーを選択
・FallBack
もしサポートされるサブシェーダーがない場合、Unity は Fallback シェーダー の使用を試みる。
//←はコメントです。
//シェーダーの名前 /を付けると階層になる
Shader "sono/Standard_test"
{
//次にProperties
{}
・Inspectorで表示される所 パラメーターの一覧を定義できる
//よくわかってないけど、ユニティーのメタリックセットアップをインプットて事?
CGINCLUDE
#define UNITY_SETUP_BRDF_INPUT MetallicSetup
ENDCG
//SubShader ここがメインかなぁ~
Tags
Tags ブロックでは「いつ」「どのように」レンダリングを行うかの指定を Key-Value の形式で与える
Pass はタグを使用していつどのようにしてレンダリングエンジンによりレンダリングすべきかを指定
Pass ブロックの中には色々な命令を記述できる
(Cull ZTest ZWrite Blend ColorMask Offset etc・・・)
CGPROGRAM 〜 ENDCG
サーフェイスシェーダは、このブロック内に記述
最初の行にある pragma 文は、サーフェイスシェーダをどのようにコンパイルするかを指示
複数のシェーダープログラムのバリアントを作る
#pragma shader_featureとか#pragma multi_compile etc
■#pragma
shader_feature
シェーダーの未使用のバリアントがゲームのビルドに含まれない
■#pragma
multi_compile
のショートカット
multi_compile_fwdbase
ForwardBase(Forward Rendering ベース)pass 種類で必要とされるすべての変異体をコンパイル
:変異体は、異なるライトマップタイプやシャドウをオン/オフに切り替える主要な異なるライトで対処
multi_compile_fwdadd
ForwardAdd
(forward rendering additive) の pass タイプをコンパイル、
(Directional、Point light、Spot)のライトを処理するためのバリアントとクッキーテクスチャによるバリアントをコンパイル
multi_compile_fwdadd_fullshadows
上記と同じですが、ライトがリアルタイムシャドウをつけるための機能も含まれている
multi_compile_fog
異なるフォグ(霧)の種類(off/linear/exp/exp2)を処理するいくつかのバリアントに展開
■
#pragma skip_variants
組み込みのショートカットのほとんどが、かなり多くのシェーダーバリアントをもたらします。それらが必要ないことを分かっている場合
Cg は NVIDIA が開発したシェーダ言語
HLSL はマイクロソフトが開発した Direct3D API 用のシェーダ言語
※HLSL は NVIDIA と共同で開発したものなので言語的には Cg に似ている
シェーダーのロード時間を最適化
参照
-------------------------------------------------------------------------------------------------------
用語
シンタックス:構文規則
#define
機能 :文字列の置き換え
書式 :#define <文字列1> <文字列2>
// #define はプリプロセッサ
ソースプログラムをコンパイルする前に、ソースプログラムに対して行われる前処理を プリプロセス と呼ぶ。このプリプロセスを行なうプログラムのことを プリプロセッサ と呼ぶ
・バリアント(Variant)
どのような型のデータでも格納できる特殊な型
Variant型の変数は代入時に代入する値のデータ型がチェックされ、それに合うデータ型が自動的に選択される
“variant”は「異なる」「多様な」などの意味を持つ英単語
備考
サーフェースシェーダーの例
※私、底辺デザイナーですのでプログラムはズブの素人。自分用メモ