デフォルトライティング関数
・Unityではあらかじめ下記のライティング関数が利用されている。
・構造体の詳細については※4 公式リファレンス参照。
関数名 | ライティング関数へ渡す構造体 | タイプ |
---|---|---|
Lambert | SurfaceOutput | 非物理ベース |
BlinnPhong | SurfaceOutput | 非物理ベース |
Standard | SurfaceOutputStandard | 物理ベース |
ライティングの切り替え
・下記2か所を設定する。
#pragma surface surf 関数名
void surf (Input IN, inout ライティング関数へ渡す構造体 o) { }
自作ライティング関数
①定義
・関数名は「Lighting」で始める。
・関数の引数は以下の通り。(その他の引数については ※1公式リファレンスを参照)
タイプ | 引数 |
---|---|
カメラビューなし | half4 LightingMyName(SurfaceOutput s, half3 lightDir, half atten) |
カメラビューあり | half4 LightingMyName(SurfaceOutput s, half3 lightDir, half3 viewDir, half atten) |
void LightingAnyMethodName(SurfaceOutput s, half3 lightDir, half atten) { return 描画色; }
②宣言
#pragma surface surf 「Lighting」を除いた関数名
void surf (Input IN, inout ライティング関数へ渡す構造体 o) { }
ライティングをOFFにする
・シェーダの作成に当たり、ライトを切りたい場合があるは以下の設定を行う。
1. Window -> Rendering -> Lighting Settingを選択する。
2. Intensity Multiplierの値を「0」に設定する。
物理ベースと非物理ベース
特徴について
・物理ベースレンダリング (PBR : Physically - Based Rendering)
・非物理ベースに比べて、より物理学のモデル(光の屈折や反射)に近い計算を行うことで、より現実に近い描写を行うことができる。
- energy conservation (エネルギー保存則) - 受けた光量以上は反射できない。
- microsurface scatteringstate-of-the-art (微小表面反射) - 荒い面はなめらかな面に比べて不安定な光を反射する
- Fresnel reflectance (フレネル反射) - スペキュラ反射は「かすめ角」に現れる。
- surface occlusion (面閉塞) - 角の暗がりや反射しにくい面
・イメージする質感を直感的に作成できる。
(例えば、Metallicというパラメタに1を設定すると金属っぽくなり, 0を設定すると非金属っぽくなる。)
・非物理ベースに比べて、高負荷である。
種類
・Materialのインスペクタビューからシェーダを「Standard」「Standard (Specular)」を選択する。
・どちらを選択しても同一のマテリアルを作成できるため、どちらを選ぶかは好みの問題である。
・詳細な違いについては※2 公式リファレンス参照
・マテリアルのサンプルは※3 公式リファレンス参照
透過の設定
・Materialのインスペクタビューから「Render Mode」を切り替える。
Type | 2 | 3 |
---|---|---|
Transparent | 半透過 | α=0でも光は反射するため透明にはならない。鏡のようなオブジェを作りたいときに使用 |
Fade | 完全透過 | αが透明度となる。 |
CutOff | 部分透過 | α < C となる部分の描画をスキップする。 |
参考サイト
1. Custom lighting models in Surface Shaders
2. Metallic と Specular のワークフロー
3. マテリアルチャート
4. サーフェスシェーダーの記述