PBRマテリアルのテクスチャは実際どのようなテクスチャなのか

最近はSubstance designerやpainter、その他のツールが普及してPBRテクスチャオーサリングも一般的になってました。既に優れた解説ドキュメントや翻訳も色々あるのですが、まだデザイナーには習熟のハードルが高い所もあります。最近レクチャーなどしていた経験上詰まりポイントなども少し分かってきたのでアーティスト/デザイナー向けにおさらいできたらと思います。
個人の検証ですのでなるべくソースをつけていきたいと思います。

用語

まずPBRの実装による用語の違い、PBR導入以前からの用語との混同が理解を妨げています。実装レベルで同様のパラメーターを違う単語で表現しているので、「単語は違うが意味の近い、あるいは同一のパラメーター」を以下にまとめてみました。例えば、Specular、Metallic、Glossinessなどは似たようなパラメーターの印象を抱きますが全然意味合いの違うパラメーターだったりします。今回はUnityのStandard ShaderとUnreal、BlenderのDisney Principled BSDFを基準に話を進めてみたいと思います。

拡散反射光鏡面反射光金属/非金属マイクロサーフェイス
Albedo
Diffuse(Delighting)
BaseColor(Metallic=0)
Specular
Reflectivity
BaseColor(Metallic=1)
Metallic
Metallness
Microsurface
Roughness
Smoothness
Glossiness
(実装によって0-1が反転している場合がある)

2つのワークフロー

例えばUnityでPBRを取り扱う場合まず選択肢に上がるのはStandardShaderです。しかし、StandarShaderを選択しようとすると似たようなStandardが2つあることに気づくと思います。
この2つは何なのか?どっちを選べばいいのか?
一番簡単な解決法はsubstance designerやpainterからプリセットを選んで出力したものをそのまま入れることです。もし出力された各テクスチャの意味を理解できないのであれば、それが一番安全ですが、今回はもう少し理解を進めてみたいと思います。
まず、大きく分けてPBRテクスチャのセットアップには2種類あります。ここでいうセットアップというのはデザイナー、アーティストが用意すべきアルベド/メタリック/ラフネスなどの組み合わせです。実装によって用意すべきテクスチャの内容は変わりますが、現在は大きく分けてSpecularとMetallicと呼ばれる2種類が主流といえると思います。

ここで注意すべきは、Specularという名前はPBR導入以前から使われているため、Specularマップを使用することはPBRではないという誤解があります。PBR以前のレガシーなSpecularとは同じ名前でも意味するものは違うと考えてください。そのためrefrectiveと言い換えてるワークフローもあります。

First off, using a metalness map is not a requirement of PBR systems, and using a specular map does not mean an asset is “not PBR”. I see comments about this regularly on forums, when someone sees an artist creating a specular and gloss map they often ask “Why aren’t you using PBR?”, so lets break down what PBR actually is.

https://marmoset.co/posts/pbr-texture-conversion/#mm

UnityでいえばStandardがMetallicのセットアップでStandard(Specular)が名前の通りSpecularのセットアップになります。これはゲームエンジンやレンダラによって固定されていたり複数あったりします。

どちらを選択すべきか/メリットデメリット

2つあるといってもどちらをを選択すべきか?
実のところ正しく設定されていればどちらのセットアップを選んでも結果は一緒になります。特に指定が無ければアーティストはMetallicを選ぶのがよいと思います。いわゆるMetallicワークフローと呼ばれているものはDesney Principled BRDFがベースになっていて、UnrealやBlenderなどで使用できる現在主流のセットアップです。一般的にアーティストがコントロールするのに向いていると言われています。

Pros of the metalness workflow
Simplifies materials into two categories, insulators and metals, which may make it more difficult to author content with unrealistic texture values

メタルネスワークフローの利点:一部引用 

マテリアルは金属と非金属というカテゴリに簡素化されます。これらはデザイナがリアルでないテクスチャ値を作ることを難しくします)

https://marmoset.co/posts/pbr-texture-conversion/#mm

一方specularは実際の拡散反射率、鏡面反射率を直接反映したデータになるのでより素のスキャンしたデータ、あるいはそれに近いものになると言えると思います。specular値を直接コントロールするのでMetallicよりもコントロールできる度合いは広いですが、注意しないと容易くアルベド、スペキュラ双方に不正確な値を入力してしまいます。その結果、PBRとしては不正確なマップを作成してしまいます。

Cons of the specular workflow
1.Easy to use illogical reflectance values which gives inaccurate results

スペキュラワークフローの欠点:一部引用 

不正確な結果をもたらす非論理的なリフレクタンス値を使いやすくなります)

https://marmoset.co/posts/pbr-texture-conversion/#

各ワークフローにはそれぞれメリットデメリットがありますが、それが何故そうなるのか、カテゴリの簡素化とは、非論理的なリフレクタンス値とは何か、それらの点を理解するためには各ワークフローをもう少し深く理解する必要があります。ここでもう一歩踏み込むために必要な知識が4つあります

  1. エネルギー保存則
  2. 金属/非金属
  3. フレネル反射
  4. スペキュラF0

より正確な理解のためには最終的には数式の理解やシェーダーのコードを読む必要がありますが、デザイナー/アーティスト(特に本項を読む方にとっては)にとっては詳細な理論や実装より、「良好なアウトプット、必要最小限の知識」であることのほうがより重要だと思います。

エネルギー保存則

エネルギー保存則というと物理学の用語なので難しく感じるかもしれませんが、デザイナーが把握しておくべき情報は2つ。

  • 光の反射は大きくわけて拡散反射と鏡面反射の2つ
  • 入射した光のエネルギー > 反射した後の光のエネルギー

凄く雑に言えば入射したエネルギーの大きさが10として
拡散反射が2なら鏡面反射は8、拡散反射が8なら鏡面反射は2というように、入射したエネルギーより大きくならないように、入射した光に対して拡散反射と鏡面反射がエネルギーを取り合うような形になります。

拡散反射と鏡面反射でエネルギーが分配される

エネルギーの分配のされ方はまず大きく分けて金属か非金属かによって大きく違いが出ます。つまり金属か非金属によって光の反射の見え方に違いが出ます。

金属/非金属

光の反射の性質が金属(Metal)と非金属(Dielectic)で大きく異なるという点を把握することはとても重要です。下の画像は非金属と金属の反射の性質の違いを表しています。

Physically Based Rendering for Artists
https://www.youtube.com/watch?v=LNwMJeWFr0U

非金属(Dielectic)ではスペキュラ反射は色がつかず白くなっているのが分かると思います。以下にデザイナ/アーティストが把握しておくべき性質をまとめました。 金属(Metal)の場合はスペキュラ反射のみになり、さらに特徴としてはスペキュラ反射にも色がついていることです。

非金属金属

スペキュラに色がつかない(グレー)
フレネル効果が強い


スペキュラ反射のみ
スペキュラに色がつく
フレネルはあまり影響しない

フレネル効果

金属と非金属の大きな違いにフレネル効果があります。特に非金属は入射光と面の角度(グレージング角)によって鏡面反射率が大きく変わる性質があります。

Physically Based Rendering for Artists
https://www.youtube.com/watch?v=LNwMJeWFr0U

湖などの反射を考えてみましょう。水は透明なので足元は透けて見えますが、遠方は周辺の環境を反射して水の中は見えません。光の入射角度が浅くなると鏡面反射率が高くなり、90度になると全反射になります。このような現象をフレネル効果と言います。非金属の場合その効果が顕著に現れます。金属は元々鏡面反射率が高いのでこの効果をあまり受けません。

スペキュラF0

「specular F0」の画像検索結果
『THE COMPREHENSIVE PBR GUIDE Volume 1: The Theory of PBR by Allegorithmic』私家訳版
https://www.slideshare.net/nyaakobayashi/pbr-guide-vol1jp

特にサーフェイスを真正面から見た時のスペキュラ値をF0と呼びます。フレネル反射は角度が浅くなるにつれて強くなりますが、非金属において真正面から見ている場合(最もフレネル効果の影響が薄い状態)でも2-5%程度のスペキュラ反射があります。

カラーチャートを確認する

エネルギー保存則や金属/非金属と言ったパラメーターが実際どのようにテクスチャ作成に影響するのか確認します。

https://docs.unity3d.com/ja/2017.4/Manual/StandardShaderMaterialCharts.html

これはUnityのSpecularカラーチャートです。Albedoは表面の拡散反射色を定義します。Diffuseとの大きな違いはAOなどのライティング要素が削除されていることです。

An albedo map defines the color of diffused light. One of the biggest differences between an albedo map in a PBR system and a traditional diffuse map is the lack of directional light or ambient occlusion.

https://marmoset.co/posts/physically-based-rendering-and-you-can-too/#albedo

非金属アルベドは拡散反射色がそのまま入っています。一方金属はほぼ鏡面反射しかしないため、エネルギー保存則からアルベドが黒になっているのが確認できると思います。

Specularを見てみます。
非金属のスペキュラには黒ではなくグレーが入っています。これはSpecularF0の項目で説明した通り非金属でも2-5%鏡面反射します。その影響を受けてグレーが入っています。ただし、非金属はなので鏡面反射色はつきません。

しかし、8bitのRGBは0-255です。2-5%をマップすると値は大体5-13になるはずです。ですがチャートでは40-75になっています。
これはsRGBがガンマ補正されたデータを持つことが原因です。
高速化近似ではリニアの値に1/2.2乗をかけることでsRGBガンマの値に変換できます。

$$ sRGB = Linear^ {0.4545} * 255 $$

そうすると値は43-65になりチャートの非金属スペキュラ値の範囲におさまります。ガンマ補正についてはここでは触れませんが以下のリンクで詳細に解説があります。
参考:物理ベースレンダリング -リニアワークフロー編 (2)-
https://tech.cygames.co.jp/archives/2339/

金属はほぼ鏡面反射のみなのでアルベドが黒くなってるのとは反対に カラーレンジが155-255と高いレンジになっています。

https://marmoset.co/posts/physically-based-rendering-and-you-can-too/

QuixelのMEGASCANSのチャートも見てみます。Reflectivityという呼称になっています。rには非金属はグレー、金属はカラーが入っているのが分かると思います。つまりこれはSupecularセットアップのマテリアルであるという事が分かります。

Supecularセットアップのカラーを見ると、エネルギー保存則や金属/非金属のルールに従ってカラーが指定されています。非金属のSpecularカラーのグレーは実測されたデータに基づく方が良好な結果を得られますが、屈折率から求めることもできます。どちらにせよアーティストには手間のかかる作業です。
もし自作マテリアル内で非金属スペキュラF0の値に困った場合は、特に必要が無ければ4%(sRGB(59,59,59))を使用することをお勧めします。(その理由は後述)カラーのレンジを除けば、Specularセットアップにおいて守るべきことは

  • 金属のアルベドに黒以外の値をいれない
  • 非金属のスペキュラは2-5%以外のグレーをいれない

ただこのルールは金属か非金属か、あるいは間違ったデータかをAlbedo、Specularの両マップをまたいで判断しなければなりませんし、マップ作成時にエネルギー保存則を考慮しなければなりません。このルールは先ほども述べた

1.Easy to use illogical reflectance values which gives inaccurate results
(スペキュラワークフローの欠点:一部引用 不正確な結果をもたらす非論理的なリフレクタンス値を使いやすくなります)

https://marmoset.co/posts/pbr-texture-conversion/#

この欠点の原因になっています。アルベドとスペキュラは拡散反射光と鏡面反射光のエネルギー保存に影響されるため、2つまとめて管理しなければPBRシステムを破壊してしまいます

メタリックセットアップ

Albedo/Specularでセットアップする事の難しさを踏まえたうえで解決策を考えます。

  • 金属/非金属で反射の性質が大きく分かれる→金属/非金属のパラメータを持つ
  • 非金属Albedoと金属Specularをひとつのカラーマップにまとめる
https://docs.unity3d.com/ja/2017.4/Manual/StandardShaderMaterialCharts.html

Specularセットアップにおいて、金属のアルベドはほぼ黒であり、非金属のスペキュラは一様に狭い範囲のグレーです。
そこで非金属のアルベドと金属のスペキュラをひとつにまとめます。その上で、metallicの値が0の時はこのマップは非金属アルベドとして、1の時は金属スペキュラとして使用されます。(そのためかアルベドと言うのは実態と食い違うため、UnrealではBaseColorと呼称しています。)
では非金属スペキュラと金属アルベドはどうなるのでしょうか。金属アルベドは黒が自動で設定されます。非金属スペキュラは4%(sRGB(59,59,59))に固定されます。値を簡略化することによって金属か、非金属かという判断しやすいパラメーターでマテリアルの反射を正しく設定できるのがMetallnessセットアップの利点です。以下metallic値によってベースカラー(カラーマップ)がどう適用されるかの表です。

metallic =0metallic =1
材質非金属
金属
アルベドカラーマップ をアルベドとして使用するアルベドは0(黒)
スペキュラ4% sRGB(59,59,59)カラーマップをスペキュラとして使用する

メタリック(金属)マップは、ベースカラーマップ上にある金属部分と絶縁体部分のデータを区別するためのマスクとして機能する。不導体のF0値は、マニュアルではいじらず、シェーダーに処理させる。(中略)

メタルマップ中の黒い部分をシェーダーは、ベースカラーマップ中の対応する領域に対して、不導体かつ反射率の値が4%(0.04)として解釈する。第一巻で論じたように、4%という値は、一般的な不導体マテリアルのほとんどをカバーしている

『THE COMPREHENSIVE PBR GUIDE – Vol. 2: Practical guidelines for creating PBR textures 』私家訳版 4P

https://www.slideshare.net/nyaakobayashi/70100srgb180255

これがスペキュラセットアップにおいて非金属スペキュラ値が不明の場合 sRGB(59,59,59)を勧める理由です。 Metallicセットアップにおける非金属のスペキュラのデフォルト値がsRGB(59,59,59)なのでこの値を入れておけば結果が一致するはずです。ただ、殆ど差はないとはいえspecularセットアップでは40-75の幅がある値を丸め込んでしまうため、RGBすべてが使用できるSpecularセットアップの方がより精細にコントロールできる、とは言えるでしょう。
また、実装によってはSpecularを調整するために追加のコントロールが存在するものもあります。

Pros of the specular workflow

More control over reflectivity for insulators is provided with a full color input.

Specular workflowの利点から引用:

フルカラーの入力によってより絶縁体の反射率のふるまい をコントロールできる

https://marmoset.co/posts/pbr-texture-conversion/#metalvspec

metallnessマップは金属/非金属の値を0、1で指定します。ここで悩ましい事は0.5などの値を指定できるか、ということです。実際データとしては中間値を持つことは当然可能ですが、その値が持つ意味をよく考える必要があると思います。PBRのシステムを維持するのであれば原則0、1以外の値は使用すべきではありません。アーティストが原則以外の手法を採る際はよく検討してください。

PROTIP: Metalness maps should use values of 0 or 1 ( some gradation can be okay for transitions).( Metalnessマップは、0または1の値を使用する必要があります(トランジションに多少のグラデーションを使用できます) )

https://marmoset.co/posts/physically-based-rendering-and-you-can-too/#refl
makemetal01

実際にMetallnessマップは白と黒のハイコントラストの画像になります。Metallnessセットアップにおける最低限のルールは

  • 非金属は0(黒)金属は1(白)のみを使用するそれ以外は遷移色として扱う

この一点のみになります。金属/非金属のルールだけ守ればスペキュラのようにマップ作成時にエネルギー保存などを意識する必要がなくなるため、アーティストがルールを理解しやすく、コントロールのしやすいワークフローでもあると言えます。ただ、Metalnessという名前の持つイメージとは違い直接反射を扱うマップではない事に注意が必要です。あくまで「ここは金属か、非金属か」という事を示すマップになります。

If artists do not understand workflow, it’s easy to use illogical values in metalness map and break the system(もしアーティストがワークフローを理解していない場合、非論理的な値をメタルネスマップ内で使用しやすくなり、システムを破壊する。)

https://marmoset.co/posts/pbr-texture-conversion/#metalvspec

結局のところMetallicのセットアップにおいてもマップの内容を理解してテクスチャを作成しないと、PBRシステムが意図しない結果を生み出してしまう事はSpecularセットアップと変わりません。

マイクロサーフェイス/ラフネス/スムースネス・・・

Specular、Metallicの2つのセットアップではいずれも2つのマップが関連して大きな意味を持っていました。エネルギー保存を考える必要があったり0、1で固定だったりとコントロールし辛く思えるかもしれませんが、実際はこのマイクロサーフェイスによって質感を強力にコントロールできます。

マイクロサーフェイスは物質表面の目に見えないレベルの微細な凹凸を表現します。目に見えるレベルはnormalでコントロールします。問題は実装によって名前が色々あり、Microsurface,Roughness,Smoothness,Glossinessなど色々ありますが、全てマイクロサーフェイスをコントロールするパラメーターです。ただし0-1が逆転している場合もあり(特にRoughnessとSmoothness)エンジンを変更する場合などは注意が必要です。

ここで重要な点はラフネスやスムースネスはSpecularやAlbedoといったパラメーターには直接関連しないという事です。つまり、ラフネスに0-1の範囲でどんな値を入れてもPBRシステムを壊す事は無いという事です。
まずアーティストはAlbed/SpecularあるいはBaseColor/Metallicを定義し、その後でラフネスやスムースネスによってマテリアルをコントロールするというのがPBRテクスチャ作成時の標準的なワークフローになります。

まとめ

https://marmoset.co/posts/physically-based-rendering-and-you-can-too/#refl

SupecularとMetallic、正しく設定すれば同様の結果が得られますが、使用されるテクスチャの内容がわずかに違うため、難しく感じるかもしれません。しかし上の比較を確認すればちゃんと説明通りのカラーが指定されていることが分かります。

ここまでテクスチャの意味合いや理由を説明してきました。
PBRについては既に優れた解説や書籍があるのですがデザイナーにとっては情報が分散していたり、エンジニア向けで数式がいっぱい出てきてわからん!ということも多かったので、ひとまず自分の把握しているデザイナー向けの情報をなるべくソース付きで整理して書いてみました。それも間違ってたり何年後かには変わったりしているかもしれないので、とりあえず1エントリーで全部書きました。縦長で申し訳ないです。
デザイナーにとってはSPのようなツールを使ってアートに集中すべきかもしれませんが、今後はテクスチャのチャンネルに追加情報を持たせたり金属と非金属でマテリアルを分けてmetallicテクスチャを省略するなどのワークフローを実現するために、エンジニアリング的な思考も必要になるかもしれません。

おまけ1 非金属スペキュラ値

非金属のスペキュラ値は実測した値を基準にすべきですが、計算からも求めることができます(屈折率も元はと言えば計測したデータではありますがより豊富です。)IORが屈折率になります。

$$ specular ={\left( \frac{IOR-1}{IOR+1}\right) }^2 $$

屈折率は
http://ww1.tiki.ne.jp/~uri-works/tmp/
こちらのサイトから計測データをお借りします。
天然ゴムの屈折率は1.519です

$$ {\left( \frac{1.519-1}{1.519+1}\right) }^2 = 0.04245 $$

0.042(4%)という値が出ました。この値は非金属F0、2~5%の中に納まっています。これを先ほどのガンマ補正の式に代入すると

$$ 0.042^ {0.4545} * 255 =60.36 $$

60.36という値が得られました。非金属スペキュラに色はつかないのでsRGB(60,60,60)が天然ゴムのsRGB Specular値になります。
UnityのSpecularチャートのnon-metalの範囲40-75にも収まっています。
Metallicでは0か1で指定すればいいですが、Specularではこのように非金属スペキュラを求めることもできます。

おまけ2 Principled BRDFのSpecular

SupecularとMetallicの2つのセットアップがありますが、UnrealやBlenderのPrincipled BSDFにはMetallicセットアップにもかかわらずSpecularのインプットが存在しています。そして0.5の初期値が入っています。
MetallicなのにSpecularとは面妖な・・・と一瞬思ってしまいますがこのパラメーターが4%固定のMetallicにおけるSpecularを調整するパラメーターになります。

解説によればこの値は特に指定が無ければ変えるべきではないとされています。
Unrealの日本語マニュアルを読むと

ほとんどの場合、Specular 入力を接続せずに、デフォルト値は 0.5 のままにしておきます。
0 と 1 の間の値を設定して、ノンメタル のサーフェス上で、現在のスペキュラリティ量をスケールします。メタルには無効です。

https://docs.unrealengine.com/ja/Engine/Rendering/Materials/MaterialInputs/index.html

わからん・・・

実はDisney Principled BRDFはwikipediaに詳細な解説が載っています。サンキューウィキペディアン。
さっそくスペキュラレベルの項を確認すると

スペキュラレベル (鏡面反射量、単にスペキュラとも書かれる)

スペキュラレベルパラメータは、誘電体の鏡面反射率を0.08 (8%) で割って指定する[31]。スペキュラレベルは屈折率 (IOR) から算出することもできる: (((ior-1)/(ior+1))**2)/0.08 [1]。スペキュラレベルの標準値は0.5 (= IOR 1.5) となっている。

https://ja.wikipedia.org/wiki/物理ベースシェーディング#元資料のパラメータ

誘電体の鏡面反射率なのは分かりました。屈折率から算出できることも上で書きました。しかし0.08で割るとは・・・となってしまいました。
ここで重要なのはMetallicにおける非金属の標準スペキュラ値が4% sRGB(59,59,59)であることです。

http://i.imgur.com/rR05wJE.jpg
『THE COMPREHENSIVE PBR GUIDE – Vol. 2: Practical guidelines for creating PBR textures 』私家訳版
https://www.slideshare.net/nyaakobayashi/70100srgb180255

つまり0-8%を0-1にリマップする(0.08で割る)ことで4%を0.5に対応させるという事のようです。1を入力すると8%が指定されます。
非金属のスペキュラが2-5%であることを考えると、0.25-0.625の範囲が非金属SupecularF0ということになりそうです。
supecularを調整するというよりは0~8%の間で直接非金属supecularF0値を上書きするパラメーターのようです。確かにメタルでは無効だ・・・
(実際は特殊なマテリアルのために1以上の値も入力できるようです)

参照

『THE COMPREHENSIVE PBR GUIDE Volume 1: The Theory of PBR by Allegorithmic』私家訳版
https://www.slideshare.net/nyaakobayashi/pbr-guide-vol1jp
『THE COMPREHENSIVE PBR GUIDE – Vol. 2: Practical guidelines for creating PBR textures 』私家訳版
https://www.slideshare.net/nyaakobayashi/70100srgb180255
PBR TEXTURE CONVERSION
https://marmoset.co/posts/pbr-texture-conversion/
PHYSICALLY-BASED RENDERING, AND YOU CAN TOO!
https://marmoset.co/posts/physically-based-rendering-and-you-can-too/


コメントは受け付けていません。