Search Unity

物理ベースシェーディングの使用:実用的なアプローチ

, 2月 18, 2015

Unity 5 の開発期間中、Unity では社内で Viking Village プロジェクトをシェーディングとライティングのワークフローのテスト環境として使用してきました。

Unity 5 ベータ版をお使いの方は、アセットストアから Viking Village パッケージをダウンロードして、Unity 5 でのシーンの組み立て方や照明の方法をご確認ください。また、以下にいくつかの知見を紹介します。

テンプレート環境の作成

テクスチャとシェーダーの設定が適切に動作していることを確認するには、様々なライティング設定のあるシンプルなシーンを使用することをお勧めします。これは、異なるスカイボックスやライトなど、モデルへの照明に寄与するものであれば何でも構いません。

Unity 5 を開くと、新しい空のシーンには、デフォルトの環境光設定やリフレクション設定と同様に、プロシージャルスカイが設定されていることに気づくでしょう。ここを出発点とするのが適切だと思われます。

lightcond5fr640x480loop.1

テンプレート環境には、以下のものを使用しました。

  • HDR カメラレンダリング

  • 2、3 個点在させたリフレクションプローブ(物体上の局所的な反射を再現するため)

  • まとまった数のライトプローブ

  • HDR のスカイテクスチャとマテリアル、およびプロシージャルスカイのセット。このプロジェクトに同梱されているスカイは、「Dutch Skies 360」の作者である Bob Groothuis 氏が Unity 用にカスタムメイドしたものです。

  • 強度と HDR のスカイカラーを一致させたオフホワイトのディレクショナルライト

スカイテクスチャのパノラマを調整する

ほとんどのスカイテクスチャには太陽が(フレアなども一緒に)入っており、太陽からの光は表面で反射します。これにより、3 つの問題が発生する可能性があります。

1) 太陽を表現するために使用するディレクショナルライトは、スカイボックスに描かれた太陽の方向と正確に同じ方向を向いている必要があります。そうしないと、マテリアルの表面に複数のスペキュラー反射のホットスポットが現れてしまいます。

2) 反射した太陽とスペキュラー反射のホットスポットが重なり、強すぎるスペキュラーハイライトの原因になります。

3) ベイクされた太陽の反射は、表面が影になっている場合にも遮蔽されないため、シーンが暗いときは過度な光沢が出てしまいます。

image11

太陽をスカイテクスチャから消去し、ディレクショナルライトとレンズフレアを使って再現する。

その結果、太陽のハイライト、フレア、太陽光線、HDR 値をスカイテクスチャから編集し、ディレクショナルライトを使用して再適用する必要があります。.

物理ベースのシェーディングマテリアルのオーサリング

現実世界の質感を再現しようというときに当て推量で作業をすることを避けるには、すでに知られた信頼のおけるリファレンスに従うのがいいでしょう。スタンダードシェーダーは、スペキュラカラーとメタリックの両方のワークフローをサポートしています。どちらも表面から出る反射光の色を定義します。スペキュラーのワークフローでは色は直接指定されるのに対して、メタリックワークフローでは色は拡散色とスタンダードシェーダーの制御項目で設定されたメタリックの値の組み合わせから導き出されます。

Viking Village プロジェクトでは、スタンダードシェーダーのスペキュラーカラーワークフローを使用しました。アセットストアからダウンロードできる較正用のシーンには、便利な較正用チャートが含まれています。マテリアルをデザインする際には、このチャートを定期的に参照しました。

マテリアルにアプローチする際には、スペキュラーワークフローとメタリックワークフローのどちらかを選択することができ、それぞれに独自の値と参照用のチャートが用意されています。スペキュラワークフローでは、鏡面反射した光の色を直接選択し、メタリックワークフローでは、材料が照らされたときに金属のように振る舞うかどうかを選択します。

スペキュラー値のチャート

UnitySpecularChart

メタリック値のチャート

UnityMetallicChartスペキュラーワークフローとメタリックワークフローのどちらを選択するかは、主に個人の好みの問題ですが、どちらのワークフローを選択しても、通常は同じ結果を得ることができます。

チャートや値の他に、現実世界で見られる表面のサンプルを収集することは非常に価値があります。模倣しようとしている種類の表面を見つけ、それが光にどのように反応するかを理解することは非常に役立ちます。

マテリアルの設定

最初のうちは、較正用チャートから派生した色、値、スライダーを使用して、素朴ながら調整可能なマテリアルの表現を作成すると便利なことがよくあります。その後、元のマテリアルを参照しながらテクスチャを適用して、特性が保持されていることを確認することができます。

materialcompare_refl.1

上段:テクスチャなし。下段:テクスチャを施した状態。左から右の順に、岩、木材、骨、金属。

テクスチャを作成するための従来のアプローチ

Viking Village のテクスチャは、従来の手動による方法(写真と微調整)と、Quixel 社から提供された拡散/アルベド、スペキュラー、グロス、法線マップのスキャン画像の両方を使用してオーサリングされています。

マテリアルのテクスチャチャンネルにディテールを追加する際には注意が必要です。たとえば、通常、テクスチャにはライティング(アンビエントオクルージョン、シャドウなど)を配置しないほうが賢明です。物理ベースレンダリングのアプローチを取れば、必要となるライティングはすべて提供されます。

当然のことながら、写真のレタッチはスキャンデータを使用するよりも、特に物理ベースシェーディング(PBS)に適した値を考えるとなると、より難しいものになります。Quixel SuiteAllegorithmic Substance Painter など、プロセスを簡単にするためのツールがあります。

スキャンされたデータ

PBS で較正されたスキャンテクスチャを使用すると、データはすでにチャンネル別に分離されており、アルベド、スペキュラー、スムースネスの値が含まれているため、編集の必要性が軽減されます。PBS で較正されたデータを提供するソフトウェアに、エクスポート用の Unity プロファイルが含まれているとベストです。Photoshop や関連ツールを使用して値を較正する必要がある場合は、常に参照用チャートをサニティチェックとして、またガイドとして使用することができます。

マテリアルの例

Viking Village シーンでは、テクスチャのメモリ消費量を適度な範囲内に収まるように工夫しながら、大量のコンテンツを用意しています。例として、高さ 10m の木製クレーンをどのように設定したかを見てみましょう。

多数のテクスチャ、特にスペキュラーテクスチャと拡散テクスチャについては均質であり、それでいて異なる解像度を必要とすることに注意してください。

image10例 1:このクレーンオブジェクトには 2 つのマテリアルが使われており、また、2 つの拡散テクスチャ、1 つのスペキュラースムースネステクスチャ、2 つのオクルージョンテクスチャ、2 つのディテールテクスチャが含まれています。

image06例 2:このシールドには 1 つのマテリアルが使われており、1 つの拡散テクスチャ、1 つのスペキュラースムーステクスチャ、1 つのオクルージョンテクスチャが含まれ、ディテールテクスチャはありません。

Screen Shot 2015-02-17 at 17.12.23
左:クレーンのインスペクターで両方のマテリアルを表示。右端がシールドのマテリアルを表す。

  • アルベドテクスチャ:スペキュラワークフローでは、表面から跳ね返った拡散光の色を表します。左の画像(クレーン)で見られるように、必ずしも高度なディテールを必要とするわけではないのに対し、右のテクスチャ(シールド)ではかなりの独自のディテールが含まれています。

vv albedo texturePainted Crane Diffuse Map スニペットは、無地の木の色と光の強度を持っています。控えめな量のディテールが含まれています。右の画像:解像度の高い(ppi)ユニークなディテールを持つシールドの拡散テクスチャ。
image09クレーンのマテリアルの Diffuse の値(テクスチャなし)

  • スペキュラー:金属以外(絶縁体)は比較的暗い無彩色ですが、金属の値は明るく、色が着いている場合もあります(金属の錆、油、汚れはメタリックではないことを覚えておいてください)。木材表面のスペキュラーは、スペキュラーテクスチャの恩恵をそれほど受けられなかったため、マップを入力する代わりに特定の値を使用しました。

image07クレーンの木材部の Specular の値

Screen Shot 2015-02-17 at 17.40.23クレーンの金属部分のスペキュラーマップ(メタリックシェーダーを使用していない)。右:シールドのスペキュラーテクスチャ。

  • スムースネスは PBS マテリアルの重要な要素です。これは、サーフェスのバリエーション、不完全性、ディテールに寄与し、オブジェクトの状態や経年変化を表現するのに役立ちます。
    クレーンの場合、スムースネスは表面全体でかなり一定であったため、値で代用することができました。これにより、適度なテクスチャメモリの節約ができました。

image05クレーンの木材部分の Smoothness の値。テクスチャは必要ありません。

Screen Shot 2015-02-17 at 17.51.13クレーンの金属部分(メタリックシェーダー未使用)の Smoothness マップ。右:金属と木材が混在したシールドの Smoothness マップ。

image01

1:ライトマップ付き AO、2:オクルージョンテクスチャ、3:拡散光のオクルージョン、4:イメージエフェクト SSAO

セカンダリテクスチャと解像度

セカンダリテクスチャは、ディテールのレベルを上げたり、マテリアル内にバリエーションを持たせるために使用することができます。Detail Mask プロパティを使用してマスクすることができます。

クレーンの例では、一次拡散木質テクスチャの解像度が低いため、二次テクスチャセットは非常に重要です。これにより、最終的なサーフェスに細かいディテールが追加されます。この例では、ディテールマップはタイル状になっており、解像度はかなり低くなっています。これらは他の多くの木の表面で繰り返されるため、テクスチャのメモリを大幅に節約することができます。

image20セカンダリのアルベドマップと法線マップは、低解像度のメインの拡散マップと法線マップを補うものです。どちらのテクスチャも、村全体の木の表面に広く「オーバーレイ」され、タイル化されることで、全体的なテクスチャメモリを削減します。拡散ディテールマップにライティング情報を提供する場合は、メインの拡散マップにそのような情報を追加するのと同様の効果があるため、注意が必要です。

image16クレーンの木の表面。左:セカンダリテクスチャマップあり、右:セカンダリテクスチャマップなし。

これらのワークフローは、Viking Village プロジェクトのデザインに大いに役立ちました。これが皆さんにとって役立てば幸いです。また、皆さんからのコメントもお待ちしております。

謝辞

Viking Village プロジェクトは、HDR サーフェスキャプチャ技術および PBS 対応テクスチャを収録している Quixel Megascans ライブラリを開発している Quixel 社のクリエイティブチームとのパートナーシップにより開始されました。

このシーンに命を吹き込んでくれた Emmanuel “Manu” Tavares 氏と Plamen “Paco” Tamnev 氏に感謝します。

ぜひ、アセットストアでプロジェクトをダウンロードしてください。Unity 5.0.0 RC2 用に最適化されています。

35 replies on “物理ベースシェーディングの使用:実用的なアプローチ”

Great article: I need just a little information:

You have written:

The baked-in sun reflection is not occluded when the surface is in shadow and it becomes overly shiny in darkness.

I have this issue in one of my project where I want to make use of both indoor and outdoor environments. I can clearly see that, on some really shiny materials, such as Glass, the skybox is reflected on them, but they are occluded inside a solidified box (made with Blender). I partially solved this by disabling reflections, but how can I make glasses reflect the indoor environment without disabling skybox reflection (this way I can make external items reflect the skybox)?

Thanks!

Hey there,

the secondary details maps are very cool.
However, I saw that
– if you apply them, they “add” to the general Albedo map in a certain way but I cannot figure out how exactly. Is that a colour-add or an overlay (e.g. similar to a certain blend mode in Photoshop)?
– you did the project in cooperation with Quixel. I’d love to fully edit my Unity 5 materials with Quixel but so far could not spot a possibility to add a “secondary albedo x2 detail” channel there. Is there a way to do that?

I keep getting an error while trying to download this package from the Asset Store, using Unity 5. Anyone else is experiencing the same?

We had problems materializing some Asset Store packages. The download should work now.

Can you explain your object’s materials? For example, the fish texture “prop_fish_01_d.tif” is really washed out. I am sure that you did that for a reason, but it is not clear to me yet, and I would really to understand it. Thank you.

[…] makes good use of the real-time global illumination feature, physically based shading, reflection probes , HDR environment lighting, the linear lighting pipeline and a slew of […]

I was kind of indifferent to PBR, I didn’t really get it until a few nights ago when i seriously tried it out. It’s amazing what you can achieve, the variety of textures with just a diffuse and normal map even. It’s much more realistic and feels based in nature. Great work. I’m sure there will be a lot of beautiful projects that take advantage of it.

Hi Erland, very nice work. Could the teleporter demo you worked on last year be made available in the asset store as well?

One thing I don’t get is the use of light probes. I thought they were only used for lighting dynamic objects? But this is mostly a static scene.

Lightmapping small prop objects like rocks, grass etc is overkill and can be very bad for both baking performance and runtime performance due to larger lightmaps. This is especially important for realtime GI & realtime lightmaps but it is equally applicable to baked lightmaps.

So it is a good idea to use lightprobes to light these small props for performance reasons. You will notice that all shields, grass, fences, barrels and other smaller objects are lit via lightprobes.

Houses & terrain is marked static. This also means that light bounces off of terrain & houses only, which when you want to do realtime GI is a very reasonable tradeoff. I think it would make a quite unnoticable difference to bounce lighting if the fences, barrels, leaves were fully lightmapped (and thus light also bouncing off it)

hello friends
Wow, I’m shocked the trailer , really exciting , all the Unity exciting.

There is a problem with the mat_terrain_near material in this package. I get a pink surface. Anyone know how to fix this?

RC2 had some changes to the builtin cginclude files which conflicted with a shader in the project. Please update the package on the asset store. It is fixed now.

There is a problem with the asset store package updater. It keeps downloading the old package. To reproduce (Win 7):

-Close Unity 5 RC2.
-Delete downloaded file “Viking Village.unitypackage” from the AppData folder.
-Open the asset store inside Unity and download the viking village. It will show version 1.0.1758, which is the latest version.
-Once downloaded, extract the package into a new project.
-You will see that the ground shader still has an error (pink).
-Restart Unity.
-Open the asset store inside Unity and notice that the viking village package version number has changed to 1.0.1755, which is the old version. It also states that there is an update available, but I just downloaded the latest version (or so I thought).

You forgot to mention how important it is to set the colour space to linear. If you don’t then it throws the smoothness/specular values way off (overly shiny). You can deal with that in sRGB space by doing a sRGB to linear conversion, or simply a corrective gamma curve in Photoshop, but it begins to break down the ‘simple to use’ ethos behind physical rendering. I think this kind of thing should be handled automatically: Substance Designer and other apps can handle it, I hope Unity will in the future.

Aside from that, thank you – it looks wonderful, and thanks for the breakdown and great charts.

[…] Source link […]

Impressive project and really well done sharing it on the asset store. Personally I would recommend doing this with every testing scenes Unity is making. For example: That sci-fi room shown earlier about realtime global illumination, the doll, the transporter scene, sci-fi engine scene. Everyone can learn so much about it, and I enjoy stripping those scenes down and learn from it.

Anyways, last little comment. The name “Groothuis” is spelled wrong, it’s now written down as “Groothius” Just a little comment ;)

Thank you, fixed Bob Groothuis’ name.

Sharing demo projects on the AssetStore is something we at Demo team have been wanting to do for a long time. What has been stopping us, is that it comes with a cost to the project: considerably limited possibility to:
1) use third-party content (because of copyright reasons), and
2) develop our own tools and custom solutions on top of Unity (because of increased maintenance complexity).
This situation is quite restrictive, and the result would be, that we would be holding back from using the full potential of Unity.

This being said, we still wanted to do it for at least some of our projects, so… here is one :)

Thank-you so much for the charts! It’s always much easier to have a reference where you can use the work which people have done before, to make your design choices a lot more accurate and quicker! :D

[…] that effects my packs is the new Physically Based Rendering pipeline. As an artist this means some different techniques when creating various maps for your models. The end result, though, is very much worth the extra […]

Thank you very much for this post. As Jashan said similar posts are super useful to give us overview about where you go and how you think in the process of bringing all these feature to life. Thank you again. Thanks to Unity and your team we can bring education to whole world. Enjoy your day and look forward to 5.0 release. Marek.

Quite impressive project. I was wondering if we can re-use some of Viking Village textures and/or materials in our own assets (at Unity Asset Store) when Unity 5.0 will come out?

Definately! That is the purpose of this demo. Link is at the very top of this blog post :)

That’s very nice to hear, as today there are various issues with getting even simple textures (due to licenses) on the web, and putting texture in the asset is usually treated as redistribution. I am very excited about this project.

That’s very generous. I was wondering about something related to this. I’m hoping to publish some assets in the store soon and it is Sci-Fi. So I was wondering if it was okay to use some of the Angry Bots sounds in my demo level (provided I give due credit, of course). From your answer can I assume that the same applies to all previous UT content?

Yes, the usual Asset Store license applies. Dig into details here: http://unity3d.com/legal/as_terms, but long story short, as long as you use the assets “as incorporated and embedded components of electronic games and interactive media and distribute such electronic game and interactive media”, you’re fine.

[…] Throughout the development of Unity 5, we’ve used our Viking Village project internally as a testing ground for shading and lighting workflows. If you’re using the Unity 5 beta, you can download the V…[続きを読む] […]

Blog postings like this are super-useful and make it much easier to get into the flow with PBS/PBR! You might even consider linking some of those from the main documentation for some more details / examples than what you’d usually put into the manual.

Really nice work, it is all coming together with Unity 5 at last, my thanks to all the women and men that have must have died bringing PBR and realtime GI to the masses, it will soon be in the hands of the people, and hopefully not violently explode so much as it has during the beta ;-)

Comments are closed.