Shader

https://unity3d.com/jp/get-unity/download/archive

※こちらのダウンロードを左クリック、ビルトインシェーダーからスタンダードシェーダーの中身を見ながらメモ

docs.unity3d.com

Unity のシェーダーは、次の 3 つの方法のいずれかで記述

docs.unity3d.com

 

・Properties   Inspectorで表示

・Subshader    

各シェーダーは SubShader のリストから構成されます。少なくともひとつが必須,

Unity はサブシェーダーのリストから、エンドユーザーのマシンでサポートされる最初のサブシェーダーを選択

・FallBack

もしサポートされるサブシェーダーがない場合、Unity は Fallback シェーダー の使用を試みる。

 

//←はコメントです。

//シェーダーの名前 /を付けると階層になる

Shader "sono/Standard_test"
{

f:id:SonoBlog:20160718234152p:plain

//次にProperties

{}  

・Inspectorで表示される所 パラメーターの一覧を定義できる

docs.unity3d.com

 

//よくわかってないけど、ユニティーのメタリックセットアップをインプットて事?

 CGINCLUDE
        #define UNITY_SETUP_BRDF_INPUT MetallicSetup
    ENDCG

 

//SubShader   ここがメインかなぁ~

 

Tags

Tags ブロックでは「いつ」「どのように」レンダリングを行うかの指定を Key-Value の形式で与える

Pass はタグを使用していつどのようにしてレンダリングエンジンによりレンダリングすべきかを指定

docs.unity3d.com

Pass ブロックの中には色々な命令を記述できる

(Cull  ZTest  ZWrite  Blend  ColorMask   Offset   etc・・・)

docs.unity3d.com

CGPROGRAM 〜 ENDCG

サーフェイスシェーダは、このブロック内に記述

最初の行にある pragma 文は、サーフェイスシェーダをどのようにコンパイルするかを指示

 

複数のシェーダープログラムのバリアントを作る

#pragma shader_featureとか#pragma multi_compile  etc

docs.unity3d.com

■#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 

組み込みのショートカットのほとんどが、かなり多くのシェーダーバリアントをもたらします。それらが必要ないことを分かっている場合

 

CgNVIDIA が開発したシェーダ言語

d.hatena.ne.jp

http.developer.nvidia.com

 

HLSLマイクロソフトが開発した Direct3D API 用のシェーダ言語

※HLSL は NVIDIA と共同で開発したものなので言語的には Cg に似ている

docs.unity3d.com

 

シェーダーのロード時間を最適化

docs.unity3d.com

 

参照

tips.hecomi.com

-------------------------------------------------------------------------------------------------------

用語

シンタックス:構文規則

 

#define  

機能 :文字列の置き換え

書式 :#define <文字列1> <文字列2>

// #define   はプリプロセッサ 

ソースプログラムをコンパイルする前に、ソースプログラムに対して行われる前処理を プリプロセス と呼ぶ。このプリプロセスを行なうプログラムのことを プリプロセッサ と呼ぶ 

 

 ・バリアント(Variant)

どのような型のデータでも格納できる特殊な型

Variant型の変数は代入時に代入する値のデータ型がチェックされ、それに合うデータ型が自動的に選択される

“variant”は「異なる」「多様な」などの意味を持つ英単語

 

備考

 

サーフェースシェーダーの例

docs.unity3d.com

 ※私、底辺デザイナーですのでプログラムはズブの素人。自分用メモ