【UnityShader】#pragma #6
前回の成果
ドラゴンが透明になった。
今回やること
// 今まで #pragma surface surf Standard fullforwardshadows // 今回 #pragma surface surf Standard alpha:fade
この変更点について説明していなかったので、これについて説明します。
#pragmaとは
シェーダーをどのようにコンパイルするかを指定してあげるものです。
まずは
#pragma surface surf Standard fullforwardshadows
について解説します。
// 元の文 #pragma surface surf Standard fullforwardshadows // 説明 pragma宣言 サーフェスシェーダーを使うよ 関数名 ライティングモデル (オプションパラメータ)
となっています。
Standardに入るもの
ライティングモデル名 | 用途 |
---|---|
Standard | 物理ベースのもの |
StandardSpecular | 物理ベースのもの |
Lambert | 拡散 |
BlinnPhong | スペキュラー |
次に、StandardとStandardSpecularの違いについて説明します
標準の構造体
struct SurfaceOutput { fixed3 Albedo; // ベースカラー fixed3 Normal; // 法線 fixed3 Emission; // 発行度合い half Specular; // 鏡のような反射 fixed Gloss; // オブジェクトの凹凸 fixed Alpha; // アルファ };
SpecularとGlossは
を参照してください。
ライティングモデルがStandard
Standardは、出力構造体のSurfaceOutputStandardを使用します。
SurfaceOutputStandardは、
void surf (Input IN, inout SurfaceOutputStandard o) { o.Albedo = fixed4(1.0f, 1.0f, 1.0f, 1); }
以前も使ったことのあるこのsurf関数の出力構造体のこと。
struct SurfaceOutputStandard { fixed3 Albedo; // ベースカラー(diffuseかSpecular) fixed3 Normal; // 法線 half3 Emission; // 発光度合い half Metallic; // 0=非メタル, 1=メタル half Smoothness; // 0=粗い, 1=滑らか half Occlusion; // オクルージョン(デフォルト 1) fixed Alpha; // 透明度のアルファ };
DiffuseとMetallicとOcclusionはStandardSpecularの後に説明します。
ライティングモデルがStandardSpecular
StandardSpecularは、出力構造体のSurfaceOutputStandardSpecularを使用します。
SurfaceOutputStandardSpecularはまだ記述したことなさそうです。
struct SurfaceOutputStandardSpecular { fixed3 Albedo; // diffuse色 fixed3 Specular; // specular色 fixed3 Normal; // 法線 half3 Emission; // 発光度合い half Smoothness; // 0=粗い, 1=滑らか half Occlusion; // オクルージョン(デフォルト 1) fixed Alpha; // 透明度のアルファ };
どう使い分けるね〜ん
\ | Albedo | Metallic | Specular | Smoothness |
---|---|---|---|---|
Standard | ○ | ○ | × | ○ |
StandardSpecular | ○ | × | ○ | ○ |
この画像を見るに、Metallicを使用したいかSpecularを使用したいかの違いでどちらを選ぶかは好みの問題らしい。
って思ったけど・・・
本当に好みの問題なのか試してみる。
普通のSceneにSphereを置くだけ。
Specular
Skyboxは消して、Specular用のdefaultのMaterialをアタッチしただけ。
特筆することはない。
Albedo(ベースカラー)を変更してみる。
あれ?色が変わらない。
じゃあAlbedoは白に戻して、Specularを変更してみる。
色が変わった・・・。
Albedoの白は無視されてるのかなって思ったので、Specularはそのままで、Albedoを青にしてみた。
やっぱりAlbedo無視されてる!
なんで?
Specularとは何かを思い出してみてください。
反射光の色を制御するものです。
なので、オブジェクト自体のAlbedoの色は関係ないということです。
Metallic
Skyboxをつけて、Metallic用のdefaultのMaterialをアタッチした。
これも特筆することはない。
次にMetallicのスライダーを1にしてみる。
わかりにくいですが、Skyboxが反射しています。すごい。
Albedoを変えても反射しています。
以上のことから似てすらいない気がする。
参考にしたサイト様
Lambertに行く前に
そもそもlightModelのStandardとStandardSpecularは物理ベースのもの。 LambertとBlinnPhongは物理ベースではありません。
物理ベース、と呼ばれることから分かるように、レンダリングする際の色の決定を物理ベース、つまり「光のエネルギーを用いて」表現することを言います。
とのことです。
この物理ベースのシェーダーが最近主流になってきているそうなのでそもそもあまり使うことがないようだ。
Lambert
それでも知りたくなるのがエンジニアの性。
構造体は
struct SurfaceOutput { fixed3 Albedo; // ベースカラー fixed3 Normal; // 法線 fixed3 Emission; // 発行度合い half Specular; // 鏡のような反射 fixed Gloss; // オブジェクトの凹凸 fixed Alpha; // アルファ };
この標準のものとなる。
ただでさえ本題と逸れているのにもっと逸れそうなので、もっと詳しく知りたい方は
上記2つのサイト様が詳しく記述してあります。
BlinnPhong
調べてみると、LambertにSpecularが加わったものらしい。
これも話が逸れてしまうので、
このサイト様を参考にしてください。
今回は以上となります。