Search Unity

Unity 5.3のスタンダードシェーダーでは、私たちは論理ライト、つまりポイントライトやディレクショナルライト、およびイメージベースドライティングのBRDF(双方向反射率分布関数)をGGXに切り替えました。さらに、私たちはキューブマップの実装を完全に見直し、より正確でノイズのない結果をより少ない処理時間で実現しました。(処理時間の改善は5.4で導入されています)GGXと正規化フォン(Normalized Phong)のもっとも特徴的な違いは微小面の分布様式(microfacet distribution profile)で、次のグラフでみられるように以前にくらべてより高く狭いスパイクとそれに続くよりなだらかな変化を実現しています。

GGXと正規化フォンのグラフ。

この変更で、GGX方式による最終的なライティングは下記に見えるようにより明るいハイライトとそれに続く円光(halo)がよりリアルな質感を与えるようになりました。

GGXと従来方式の正規化フォンによるライティングの比較。

業界互換で比較可能なマテリアル

学術上は物理ベースのBRDF(双方向反射率分布関数)はラフネス(粗さ, roughness) を微小面分布関数のコントロール用変数として使います。学問におけるラフネスはルートとして定義されており、直角なスロープを描くようになっています。よくある誤解に、CGにおいて設定されるラフネスは学問におけるそれと同じだと思うことがあるのですが、実際にはそうではありません。学問におけるラフネスがテクスチャーマップやスライダーに使われないのは「くもり度合い(blur levels)」が均等に分布されておらず、作業がとてもし辛い上にテクスチャーマップの限られたビット数での精度を活かせないという両方の理由があるためです。混乱をさけるため、Unityではスムーズネス(なめらかさ, smoothness) をラフネスのマップの代わりに使います。このスムーズネスは(1-smoothness)^2という式を使って学問におけるラフネスにシェーダー内で変換されます。分布的にはこれはBurley’s roughnessと同等ですが、もっとも粗い(曇った)面を0.0、完全な鏡面反射を1.0にマッピングします。わたしたちはこの方が直感的なことに気がつきました。

標準化された分布の重要性は他のツールで制作したコンテンツをUnityにインポートしたときに近い結果を得られるようにできる点にあります。ほとんどの今日日のCGペイントツールはスムーズネスによる設定をサポートしています。一点明確にしておくと、これは完全な一致を保証しているわけではありません。とはいえ、ディフューズ、スペキュラの明るさ、および全体的なスペキュラの曇り度合いの比例具合は近しくなるはずです。下記のUnityとSubstance Painterの比較イメージはAllegorithmicのWes McDermottさんが提供してくれました。

こちらで見られるように、ビジュアルはとても似通っています。WesさんとAllegorithmicには、本件のコラボレーションと協力的なイテレーションでとてもお世話になったことを改めてここにお礼申し上げます。もし本件についてより深い興味のある方は彼らのPBRとUnity 5についての動画セミナーをチェックすることをお勧めします。

Unity 5.4での改善

Unity 5.4ではキューブマップの畳み込み速度を改善することと、イメージベースドライティング(IBL)で非常にクリーンなビジュアルを得られることに注力しました。下記はUnity 5.4での球のライティングとピクセルあたり50000のレイを使用した伝統的なパストレーサーでの比較イメージです。

こちらで見られるように右側の伝統的なパストレーサーではピクセルあたり50000のレイを用いても大量のノイズが出てしまいます。この理由は基本的なパストレーサー(BRDFインポータンス・サンプリング)が、太陽が物理的に相応な強度で存在するような強い特異点を持つ環境マップではうまく機能しないためです。Unity 5.4はこの問題に対応しており、またオフラインでのキューブマップの畳み込み処理はUnity5.2に比べて約2倍の速度で動作します。

コメント受付を終了しました。

  1. The image links are broken (dropbox contents are not avaialable)

    1. Kristyna Paskova

      2月 5, 2016 11:14 am

      Thanks for noticing, just fixed it!

  2. theprotonfactor

    1月 27, 2016 7:00 pm

    I’m quite curious as to what technique you guys are using in 5.4 for the convolution? As far as I know importance sampling is the “default” way of convolution with GGX.
    If the new method trades speed for accuracy then I’d prefer the option to select the convolution method.

    1. Renaldas Zioma

      1月 27, 2016 10:34 pm

      Our convolution is done with Importance Sampling for higher resolution mipmap levels, but fallbacks to brute-force for low resolution mipmap levels – which was found to be the fastest approach.

      Morten just optimized the heck out of it (including version using AVX) :)

      1. theprotonfactor

        1月 28, 2016 11:08 am

        Ah, that’s so cool! It never occurred to me that lower detail mips probably do not need importance sampling. Very clever way to optimize it. I was a little apprehensive when I read it was going to look better and be more performant, but it makes sense now. Excellent work guys!

  3. > To avoid confusion, Unity uses smoothness instead of roughness maps, where smoothness is converted into academic roughness in the shader, using the formula (1-smoothness)^2

    Whay not postprocess texture to eliminate shader calculation of (1-smoothness) or even entire (1-smoothness)^2 ?

    May be want to have different texture postprocessors to have different realtime in editor corrections of input textures.

    1. Aras Pranckevičius

      1月 27, 2016 8:43 pm

      Not enough precision to store it in an 8 bit/channel texture. This is very similar to why textures typically store sRGB instead of linear color values — to give more precision where it’s needed.

  4. Asger Hoedt

    1月 26, 2016 4:28 pm

    Thanks for the blog post. I love that you’ve found a formal description of roughness. I see the approximation everywhere, but never how it’s defined. Finally I have a well-defined parameter that can be used to switch between multiple glossy BRDFs. :)

    I do want to correct one thing though. That image has not been rendered by a ‘conventional path tracer’, more like a ‘bare minimum path tracer’, with only BRDF sampling. Most conventional path tracers today support multiple importance sampling and an importance sampled environment, which would have that simple scene converging in 500 samples or less.

  5. matt radford

    1月 25, 2016 10:34 pm

    awesome! Will this speed up the runtime execution for DynamicGI.UpdateEnvironment() ?

    Currently i notice a pretty big hit when calling this function when i specify a custom runtime cubemap:

    terrain / sky is done via raytracer and integrated with unity’s lighting
    https://vimeo.com/152037674

    but i get a little stall when extracting lighting directions. Simple solution is to call it extremely infrequently. But im thinking of just writing a faster way of sampling dominant directions. But if i didn’t have to, awesome!