いんでぃーづ

ゲームいろいろ、いろいろ自由

Unity : 二種類の StandardShader の違い

Unity5で鳴り物入りで追加されたStandardShader ですが、みなさん使いこなせているでしょうか。

一口に StandardShaderと言っていますが、このシェーダーは実は二種類あるんです。

f:id:sugar_affordance:20170104153332p:plain

StandardStandard (Specular setup) がありますね。

この差って一体なにー?(ナレーション) というのを、まとめてみようというのが今日のお題です。

その前に

まず共通事項として押さえておくことがいくつかあります。

アルベド

どちらのモードでも、Albedoアルベド)はオブジェクト自体の色の指定です。

下はアルベドテクスチャのみを設定した球です。(Skyboxがないほうが分かりやすいのでLighting設定をいじった状態)

f:id:sugar_affordance:20170104153413p:plain

ちゃんとグラデーションどおりに色がついています。

反射光の種類

ライトから発生した光が、なんらかのオブジェクトに当たって反射した光を反射光と言いますが、その種類にディフューズ反射スペキュラ反射があります。

Standardシェーダでは、この二種類の光の性質を把握することが、非常に重要です。

ディフューズ反射(diffuse)

拡散反射とも呼ばれ、物体の表面からいくつもの方向に向かって反射していく光のことです。 Wikipediaの図をみるとわかりやすいですが、 一本の光に対して何本もの拡散反射光が発生します。

スペキュラ反射(specular)

鏡面反射と呼ばれ、鏡のように一方向にのみ反射する光です。 この反射は、一本の光に対して一本のみが発生します。

現実世界ではテカテカツルツルした表面で多く発生する反射光で、ハイライトなどが発生します。

上記二つの光はどちらか一つだけが発生するのではなく、一つの光で両方が発生しています。
それらの量は、マテリアルの設定により比率が変わっていきます。それを変化させるのがSmoothnessです。

Smoothness

表面がどのくらいデコボコかを表す数値です。

マテリアル上ではスライダーで 0〜1 を設定できますが、この数値ではディフューズ反射とスペキュラ反射の割合を指定すると言い換えることができます。

値が低い(表面がデコボコ)なほどディフューズ反射 > スペキュラ反射、値が大きいほど逆になります。

Specular 設定

いよいよ二種類の設定についてですが、Specular設定のほうがわかりやすいのでこちらから説明します。

こちらの設定はズバリ、反射光の色を直接 指定 制御します。

(コメントで指摘いただきましたが、「あくまで入射光がサーフェイスに当たって反射する場合の計算に用いられる」という考え方が正しいとのことです)

例として、Specularテクスチャのみを設定した状態を見てみます。 Skyboxには真っ白なテクスチャを指定した状態です。

f:id:sugar_affordance:20170104153504p:plain

アルベドが設定されていないにもかかわらず、オブジェクトに色がついています。

これは周囲からオブジェクトに入ってくる光(このシーンでは真っ白な光)が反射し、スペキュラに設定したテクスチャの色によって制御された光が反射 しているためです。

つまりオブジェクト自体の色に関係なく、反射光の色を制御することでオブジェクトの見え方を変えているわけです。

Metalic設定

次はMetalic設定シェーダ(Standardのほう)ですが、まずはSpecularと同様にMetalicテクスチャを設定した状態を見てみます。

f:id:sugar_affordance:20170104153530p:plain

f:id:sugar_affordance:20170104153534p:plain

Metalicテクスチャの色は全く反映されず、スカイボックスが写り込んでいます。

実はMetalicに設定されたテクスチャのRGB値は無視され、アルファ値のみ が適用されます。(テクスチャのドットごとの位置が、オブジェクト上に貼られた位置に対応)

たとえば全面のアルファ値が255のテクスチャをMetalicに設定すると、Metalicテクスチャなし&スライダーを1にした状態と同じ設定になります。

f:id:sugar_affordance:20170104153553p:plain

このMetalicという数値とSmoothnessは似ていて混乱の元になっていると思いますが、説明を公式マニュアルから引用すると、

metallic レベルが最大の場合、表面色は完全に環境からの反射によって制御されます。表面が metallic でなくなると、アルベド色がより鮮明になり、表面反射は、不明瞭になるのではなく、表面色の上に表示されて見えるようになります。

となっているので、アルベド色と環境光のブレンドパラメータを制御していると解釈すればいいのかなあと思います。

実際、上の状態でアルベドテクスチャを設定すると、アルベドに環境光をブレンドした見た目になります。

f:id:sugar_affordance:20170104153614p:plain

Metalic値でアルベドと環境光のブレンドを指定、Smoothnessでディフューズ反射とスペキュラ反射の比率を指定し、オブジェクトの見え方を変えていくということになります。

まとめ

一概にまとめてしまうと誤解が生じるかもしれませんが、以上をまとめると

Standardはアルベドと環境光をブレンドして反射光を決める設定
Standard(Specular setup)は反射光の色を制御する設定

と解釈しておけば、ある程度理解を深めつつStandardShaderを使っていけるかと思います。

*参考

Unity - マニュアル: Metallic vs Specular ワークフロー

Metallic モード: Metallic パラメータ

Specular モード: Specular パラメータ


“Unity” and Unity logos are trademarks or registered trademarks of Unity Technologies or its affiliates in the U.S. and elsewhere, and are used under license.


免責事項

当サイトの広告バナー、リンクによって提供される情報、サービス内容について、当サイトは一切の責任を負いません。

また、当サイトの情報を元にユーザ様が不利益を被った場合にも、当サイトは一切の責任を負いません。

すべて自己責任でお願いします。