[ver.20] PBR使用時のレンダリングでの最適化

  • PBRのレンダリングの仕組み
  • レンダリング手法は「パストレーシング」を使う
  • 「視線追跡レベル」は可能な限り小さくする
  • 「PBRマテリアル」が不要な拡散反射面の場合、「Shade3Dマテリアル」を使用


リニアワークフロー+PBRマテリアルを使用した場合、
物理的にはより正確になった反面、従来のレンダリングよりも速度低下しやすいです。
この部分の最適化について説明します。
リニアワークフローだけを使用した場合の速度低下はありません。
主にPBRマテリアルとレンダリング設定により、レンダリング時間は大きく変わることになります。
なお、この情報はShade3D ver.20.0段階のものになります。

PBRのレンダリングの仕組み

PBRマテリアルのもっとも基本となる要素は「ベースカラー(BaseColor)」「メタリック(Metallic)」「ラフネス(Roughness)」「発光(Emissive)」「法線マップ(Normal)」があります。
加えて「透明」「屈折(スペキュラ)」があります。
PBRマテリアルの「メタリック(Metallic)」「ラフネス(Roughness)」の組み合わせで、金属的な表現や鏡のような鏡面反射、プラスチックや反射の少ないコンクリートや紙など様々な表現ができます。
ここで、レンダリングとしてのPBRについて説明していきます。

レンダリングは「レイトレーシング」をベースにしており、
スクリーンの1点から飛ばしたレイが物体へ衝突したり反射を繰り返して、最終的に1枚の絵になります。

このときの「反射」の挙動がPBRでの大事なポイントになります。
「反射」や「透過(屈折)」がある場合に、1点のレイトレースは枝分かれしていきます。
そのため、レンダリング時間がかかることになります。

メタリックでの反射

PBRマテリアルの「メタリック」は、屈折率が1.0の場合に入射方向から衝突した面の法線方向(n)に対して同じ角度で反射します。
理想的な正反射(鏡面反射)の場合は、鏡のような反射の表現になります。

この場合は、PBRマテリアルは「メタリック」を1.0、「ラフネス」を0.0として表現できます。
この状態は、「Shade3Dマテリアル」の「反射」を1.0としたときの挙動に相当します。

ラフネスがある場合の反射

「ラフネス」がある場合は表面がざらついた表現になります。
凸凹具合(目に見えないくらいの微小な凸凹です)により、物体表面での反射がぶれることになります。

このとき、複数回の反射をレイトレースして平均を求めます。
これを「サンプリング」と呼びます。
これにより、レンダリング時間の増加とノイズが発生することになります。
この状態は、「Shade3Dマテリアル」の「荒さ」を0.0以上にしたときの挙動に相当します。

「ラフネス」を上げていくと、正反射による映り込みが見えない状態になります。
この状態は「拡散反射」(Diffuse)と呼ばれ、「理想的な拡散反射」が行われる場合に半球状に複数回の反射をレイトレースして平均を求めることになります。

これは、PBRマテリアルの「ラフネス」を1.0にしたときの挙動になります。
「Shade3Dマテリアル」の場合は、「反射」と「荒さ」「光沢」が0の挙動に相当します。
光沢も「ラフネス」で変化することになります。

「Shade3Dマテリアル」では、「理想的な拡散反射」が行われる場合に「ランバート」(Lambert)の近似式で計算するため、レイトレースでのサンプリングは行われません。
そのため、速度が確保できていました。
PBR(PBRマテリアル)の場合は「ラフネス」で調整するため、必ず反射のサンプリングは行われます。
そのため、拡散反射の表現になるとノイズも増加することになり、
それを補うためのサンプリングを増やすことで、レンダリング時間がかかる結果になります。

反面、物理的に正確なマテリアルの表現に近づきます。
このPBRの性質を理解することで、レンダリング品質や速度を詰めやすくなります。
以上の知識を元にして、実際のレンダリング時間を短縮していきます。

Shade3DでのPBRレンダリング時の最適化

以下の環境で確認しました。

OS Windows 10
CPU Intel(R) Core(TM) i5-2500 CPU @ 3.30GHz (4コア)
物理メモリ 16GB

直接照明だけのシーン

細かい模様のあるテクスチャをベースカラーに割り当てています。

レンダリング設定ウィンドウでレンダリング手法「レイトレーシング」、大域照明を「無し」にしました。
また、「視線追跡レベル」を4、「レイトレーシングの画質」を30にしています。

レンダリング手法 大域照明 アンチエイリアシング レンダリング時間
レイトレーシング 無し ドラフト 8秒


レンダリングは速いですが、テクスチャの模様が細かいためモアレが発生しています。
また、地面の直線も途切れる箇所が見えます。

次に、アンチエイリアシングでアダプティブサンプリングを使用しました。

レンダリング手法 大域照明 アンチエイリアシング レンダリング時間
レイトレーシング 無し アダプティブサンプリング 6分24秒


きれいになりましたが、レンダリング時間がかなりかかるようになりました。
この場合は、アンチエイリアシングをアダプティブサンプリングに切り替えたのが速度低下の要因となりそうです。

品質は上げたいですがレンダリング速度を低下させたくないという場合、手法を「パストレーシング」に切り替えます。
こうすることで自然にピクセルサンプリングも行われ、アダプティブサンプリングを使う必要がなくなります。

レンダリング手法 大域照明 アンチエイリアシング レンダリング時間
パストレーシング 無し 1分50秒


品質を保ったまま、レンダリング時間が6分24秒から1分50秒に短縮されました。

大域照明があるシーン

大域照明で「パストレーシング」を使用する場合、透過するマテリアルがあるとレンダリング時間がかかります。

以下のレンダリングは3つの面光源を配置し、背景にHDRIを指定しています。
なお、背景としての映り込みの目的でのみ使用するため(光源(IBL)としては使用しない)、背景の「光源としての明るさ」は0.0にしています。
また、レンダリング設定の「視線追跡レベル」を10、「レイトレーシングの画質」を50にしています。
大域照明の設定は、初期値のまま使用しています。

レンダリング手法 大域照明 アンチエイリアシング 視線追跡レベル レイトレーシングの画質 レンダリング時間
レイトレーシング パストレーシング アダプティブサンプリング 10 50 7時間56分18秒


レンダリング時間がかなりかかっています。
ここから最適化していきます。

上記シーンで、レンダリング設定の「視線追跡レベル」を10 → 6にしました。

レンダリング手法 大域照明 アンチエイリアシング 視線追跡レベル レイトレーシングの画質 レンダリング時間
レイトレーシング パストレーシング アダプティブサンプリング 6 50 2時間35分04秒


右のカップは透過する形状のため、「視線追跡レベル」を小さくしすぎると正しく透過しにくくなります。
この場合は「視線追跡レベル」10から6の変更により、レンダリング時間は 7時間56分18秒から2時間35分04秒に大幅短縮できました。

次に、レンダリング手法を「パストレーシング」にしました。

レンダリング手法 大域照明 アンチエイリアシング 視線追跡レベル レイトレーシングの画質 レンダリング時間
パストレーシング パストレーシング 6 50 1時間31分29秒


レンダリング手法を「レイトレーシング」から「パストレーシング」に変更することで、
レンダリング時間は2時間35分04秒から1時間31分29秒に短縮できました。
しかし、地面の高周波ノイズが少し目立っています。

このシーンでは地面のマテリアルはラフネス成分が大きく、ほとんど反射/映り込みはありません。
そこで、地面のマテリアルを「PBRマテリアル」から「Shade3Dマテリアル」に置き換えます。

他の湯呑みやカップのマテリアルはそのままです。

レンダリング手法 大域照明 アンチエイリアシング 視線追跡レベル レイトレーシングの画質 レンダリング時間
パストレーシング パストレーシング 6 50 59分58秒


1時間31分29秒から59分58秒にレンダリング時間を短縮できました。
また、地面の高周波ノイズも減っています。
これは、レンダリング画像に占める拡散反射面(反射/映り込みが少ない部分)が多い場合に有効です。

もう少し最適化できそうです。
最後に「レイトレーシングの画質」を50から40に変更しました。

レンダリング手法 大域照明 アンチエイリアシング 視線追跡レベル レイトレーシングの画質 レンダリング時間
パストレーシング パストレーシング 6 40 51分15秒


「レイトレーシングの画質」調整での速度アップは、他のパラメータの変更に比べてそれほど大きくないですが、
59分58秒から51分15秒にレンダリング時間を短縮できました。
「レイトレーシングの画質」の値が小さすぎると高周波ノイズが目立つことになるため、
何回かレンダリングして最低限の適切な値を探すようにします。

このように「PBRマテリアル」を使用したときは、
レンダリング設定のパラメータをいくつか調整することでレンダリング速度を短縮することができます。
どのシーンのときにどの値を指定すればいいのかというのはシーンによって異なるため、何回かレンダリングを試して詰めていく必要があります。
まとめると、以下の調整が有効になります。

  • レンダリング手法は「パストレーシング」を使う
  • 「視線追跡レベル」は可能な限り小さくする
  • 「PBRマテリアル」が不要な拡散反射面の場合、「Shade3Dマテリアル」を使用

これで、Shade3D ver.20のリニアワークフローとPBRマテリアルの説明は一通り完了しました。
次回、本格的なシーンを実践例として説明していく予定です。

カテゴリー: リニアワークフローとPBRマテリアル