知識0からのUnityShader勉強

知識0からのUnityShader勉強

UnityのShaderをメインとして、0から学んでいくブログです。

【UnityShader】#pragma #6

前回の成果

soramamenatan.hatenablog.com

ドラゴンが透明になった。


今回やること

// 今まで
#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は

soramamenatan.hatenablog.com

を参照してください。


ライティングモデルが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 ×

f:id:soramamenatan:20190603152157p:plainMetallic と Specular のワークフロー - Unity マニュアル:より引用

この画像を見るに、Metallicを使用したいかSpecularを使用したいかの違いでどちらを選ぶかは好みの問題らしい。

って思ったけど・・・

本当に好みの問題なのか試してみる。

f:id:soramamenatan:20190605174145p:plain

普通のSceneにSphereを置くだけ。

Specular

f:id:soramamenatan:20190605174918p:plain

Skyboxは消して、Specular用のdefaultのMaterialをアタッチしただけ。
特筆することはない。

Albedo(ベースカラー)を変更してみる。

f:id:soramamenatan:20190605174744p:plain

あれ?色が変わらない。
じゃあAlbedoは白に戻して、Specularを変更してみる。

f:id:soramamenatan:20190605175043p:plain

色が変わった・・・。
Albedoの白は無視されてるのかなって思ったので、Specularはそのままで、Albedoを青にしてみた。

f:id:soramamenatan:20190605175151p:plain

やっぱりAlbedo無視されてる!

なんで?

Specularとは何かを思い出してみてください。
反射光の色を制御するものです。
なので、オブジェクト自体のAlbedoの色は関係ないということです。

Metallic

f:id:soramamenatan:20190605180836p:plain

Skyboxをつけて、Metallic用のdefaultのMaterialをアタッチした。
これも特筆することはない。

次にMetallicのスライダーを1にしてみる。

f:id:soramamenatan:20190605181019p:plain

わかりにくいですが、Skyboxが反射しています。すごい。

Albedoを変えても反射しています。 f:id:soramamenatan:20190605181155p:plain

以上のことから似てすらいない気がする。

参考にしたサイト様

indie-du.com

Lambertに行く前に

そもそもlightModelのStandardとStandardSpecularは物理ベースのもの。 LambertとBlinnPhongは物理ベースではありません。

物理ベース、と呼ばれることから分かるように、レンダリングする際の色の決定を物理ベース、つまり「光のエネルギーを用いて」表現することを言います。

[Unity] PBR(物理ベースレンダリング)をやってみる - Qiita:より引用

とのことです。
この物理ベースのシェーダーが最近主流になってきているそうなのでそもそもあまり使うことがないようだ。


Lambert

それでも知りたくなるのがエンジニアの性。

構造体は

struct SurfaceOutput
{
    fixed3 Albedo;      // ベースカラー
    fixed3 Normal;      // 法線
    fixed3 Emission;    // 発行度合い
    half Specular;      // 鏡のような反射
    fixed Gloss;        // オブジェクトの凹凸
    fixed Alpha;        // アルファ
};

この標準のものとなる。

ただでさえ本題と逸れているのにもっと逸れそうなので、もっと詳しく知りたい方は

nn-hokuson.hatenablog.com

docs.unity3d.com

上記2つのサイト様が詳しく記述してあります。

BlinnPhong

調べてみると、LambertにSpecularが加わったものらしい。

これも話が逸れてしまうので、

nn-hokuson.hatenablog.com

このサイト様を参考にしてください。

今回は以上となります。