キッチンシーンのライティングとレンダリング

  • システム情報の確認
  • ライティング調整(三点照明)
  • レンダリング設定の調整
  • レンダリング時間を短縮する
  • 「レイトレーシングの画質」の値の差分からレンダリング完了時間を推測
  • ペイントツールでの調整(ポストプロセス)

前回は、キッチンシーンにアセットを外部参照としてインポートしました。

今回はライティングの調整を行い、レンダリングを完成させます。
チュートリアルの「静物画のシーン (光源とカメラを配置)」と同じように「三点照明」を考慮します。
また、室内シーンはレンダリング時間がかかるため、レンダリング設定の調整を行います。

レンダリング環境

今回は時間のかかるレンダリングを行うため、Shade3Dを使っているマシンスペックも記載しておきます。

  • OS : Microsoft Windows 10 (64-bit)
  • CPU : 4 x Intel(R) Core(TM) i5-2500 CPU @ 3.30GHz
  • 物理メモリ : 16 GB
  • GPU : NVIDIA GeForce GTX 1060 6GB

このマシン情報は、Shade3Dのメインメニューの「ヘルプ」-「システム情報」から確認することができます。
なお、GPU(グラフィックカード)はレンダリングでは影響しません。
レンダリングは、CPUのスペックが速度アップに貢献することになります。

光源の指定

現段階では以下の光源要素が指定されています。

背景のHDRI


部屋の外からの光として、背景のHDRIでIBLを行っています。
この背景画像は、ShadeExplorerから「背景」-「Park_of_pine_1.shdbgr」を割り当てました。

無限遠光源

太陽光の代わりとして、無限遠光源を1つ配置しています。

右の大きな窓から光が入るようにしました。

向きの調整は、プレビューレンダリングして確認しています。
パストレーシングにすると時間がかかるため、「レイトレーシング」を使用しました。

床の照り返し用の面光源

窓から入った光が床で照り返す表現として、面光源を配置しました。

本来は必要のない光源ではあるのですが、キッチン棚/シンク側、天井の間接照明をより際立たせるために指定しています。
以下はレイトレーシングのみの直接照明のみのプレビューレンダリングの比較です。
左が面光源の照り返しなし、右が面光源で照り返しを指定しています。

この面光源は、形状情報ウィンドウで「明るさ」を500としました。

ここまでが前回までのシーンでのライティング設定になります。

三点照明

この段階では、手前のテーブルが暗くなってしまっています。
ここでの「キーライト」は窓から入る太陽光になります。
正面のキッチンシンクのある窓からの光は「バックライト」としてHDRIによるIBLを使っています(弱めの光)。
ここで「フィルライト」として、カメラを向いている方向に正面を照らす光を面光源で与えました。


このフィルライトにより、全体的な暗い箇所を照らしています。
面光源の「明るさ」を550としました。
向かって右の窓からの光(キーライト)を強調したいため、フィルライトの向きを少し右から入るように傾けています。
プレビューレンダリング(レイトレーシング)すると以下のようになりました。

手前のテーブルも照らされるようになりました。

光源は以上です。
後は間接照明のためのレンダリング設定を行います。

色補正 (Shade3D ver.20)

Shade3D ver.20からは、色補正でのガンマ指定を行わなくてもリニアワークフローの仕組みによりフォトリアルな結果が得られるようになっています。
全体の明るさ(露出)は、色補正ウィンドウの「ゲイン」で調整します。
ここでは「ゲイン」を10としました。

蛍光灯などで照らされていない室内シーンの場合は、初期状態では真っ暗になっていることが多いです。
以下の画像は左がゲイン1、右がゲイン10を指定しています。

注意点として、暗いからといって補助の光源をむやみに配置してはいけません。
人間の目やカメラも同じですが、「露出」で表現される全体の明るさ調整もフォトリアルでは大事な要素になります。

レンダリング設定 (Shade3D ver.20)

レンダリングは、まずはプレビューレンダリングで「レイトレーシング」で光源の明るさや向きを確認/調整後、
間接照明のパラメータを緩く指定しレンダリングサイズを小さくしてプレビューレンダリングで「パストレーシング」で確認、
間接照明のパラメータを最終レンダリング用に詰めてレンダリングサイズを調整して「パストレーシング」を行うようにします。

イメージウィンドウでレンダリング設定を表示して調整します。

「手法」を「パストレーシング」にします。
「大域照明」タブを選択し、「大域照明」で「パストレーシング」を選択します。
Shade3D ver.20の場合は、これだけの指定でレンダリングはフォトリアルに近づきます。
ver.19までのバージョンの場合はチュートリアルの過去の記事「リニアワークフロー」をご参照くださいませ。

間接照明の確認

レンダリング設定の「その他」タブを選択し、「視線追跡レベル」を3、「レイトレーシングの画質」を30として、テストレンダリングします。
初期状態では「視線追跡レベル」は5、「レイトレーシングの画質」をは50となっています。

間接照明の効果を確認するために、「視線追跡レベル」「レイトレーシングの画質」ともに小さい値にしました。
この2つのパラメータが、レンダリング速度と品質のバランス調整で直接的な影響を与えます。

透視図のコントロールバーよりプレビューレンダリングの「設定」で「レンダリング設定」を指定することで、
レンダリング設定のパラメータを採用するようになります。
間接照明で占められる室内シーンはレンダリング時間がかかるため、できるだけレンダリング時間を短縮するようにし、粗いながら最終結果が掴める状態を把握してから
レンダリング設定/レンダリングサイズを最終調整し、イメージウィンドウ上でレンダリングを行うのがよいと思われます。

プレビューレンダリングで5分ほど待つと以下のようになりました。

間接照明の光の回り込みはこれでよさそうです。

「視線追跡レベル」の調整

食器棚の上の明るい形状は、コップや計量カップなどの半透明を指定した表現になります。
これは「視線追跡レベル」が足りないための打ち切りが明るさとして見えてしまうことになります。
「視線追跡レベル」は、物体表面にレイが衝突した場合の反射回数の最大を指定します。
映り込みとして鏡面反射する場合、半透明がある場合は、
「視線追跡レベル」を上げる必要があります。
「視線追跡レベル」を3から8としました。
この指定により、レンダリング時間は増加することになります。
90分くらいのプレビューレンダリングで以下のようになりました。

タイルで暗くなっている部分、鍋の映り込みやコップの透過部の改善を確認できました。
食器棚の上にある保存容器は、まだ白い箇所が強いためもう少し「視線追跡レベル」を上げたほうがよいかもしれません。
最終レンダリングでは「視線追跡レベル」を12とすることにしました。
後はノイズを緩和する調整を行います。

「レイトレーシングの画質」の調整

床や天井、キッチンシンクのステンレスの反射など、高周波ノイズが発生しています。

これは1ピクセルでのサンプリング数が足りない場合に起きる現象です。
ノイズは「レイトレーシングの画質」の値を大きくすることで緩和されます。
「レイトレーシングの画質」は1ピクセルにおけるサンプリング回数に相当します。
野外シーンの場合は、この値がそれほど大きくなくてもノイズは収束しやすいです。
ところが室内シーンの場合は光が閉じ込められる状態となるため、間接照明の影響が強くノイズもなかなか消えにくいです。
また、壁の色が白に近い場合もレイの反射による収束がされにくいです。
キッチンシーンは、レンダリングとしては負荷が高いシーンになります。
ここでは「レイトレーシングの画質」を30から60に変更しました。
プレビューレンダリングを行うとさらにレンダリング時間がかかることになります。
そのため、プレビューレンダリングで確認する作業は飛ばして最終レンダリングに入ることにしました。

レンダリングと最適化

レンダリング

無調整でのレンダリングです。
手法「パストレーシング」、大域照明「パストレーシング」(イラディアンスキャッシュを使用)、
「視線追跡レベル」を12、「レイトレーシングの画質」を60とし、
640 x 480ピクセルの解像度でレンダリングしました。

レンダリング時間は、75時間45分31秒かかりました。

品質チェック

床部分の映り込みや、天井と壁の間の廻りぶちなど、まだノイズが気になる点があります。

床部分の映り込みのノイズを解決するには「レイトレーシングの画質」をさらに上げる必要が出てきますが、
レンダリング時間がさらにかかることになります。

廻りぶちのノイズは、パストレーシングのレンダリング時の「イラディアンスキャッシュ」で周囲の輝度情報をうまく補間しきれていない、というのが原因の1つとして考えられそうです。

窓ガラスとその枠の境界部など、ジャギーが見えます。

この現象は、隣接するピクセルで輝度差が大きく異なる場合に起きます。
窓ガラスには光が直接当たる箇所になり、ここはRGB値として1.0を超える明るさになっています。
これを解決するには、レンダリングサイズを大きくしてレンダリングし、
PNGなどのダイナミックレンジを持たない画像フォーマットで保存してペイントツールで縮小する、という方法があります。
これはオーバーサンプリングすることと同じ意味になります。
輝度差が大きい窓部分の境界は分かりきっているため、ペイントツールに持っていって編集するのが手っ取り早いかもしれません。

レンダリング速度を上げるには ?

レンダリング速度は今後のShade3Dのバージョンアップにより最適化されるかもしれませんが、現状のShade3D ver.20の対策として記載します。

レンダリング時間を短縮する手段としては以下があります。

  • 「視線追跡レベル」を下げる
  • 「レイトレーシングの画質」を下げる
  • パストレーシングの「イラディアンスキャッシュ」をオフにする
  • 鏡面反射成分がない拡散反射のみのマテリアル場合、「Shade3Dマテリアル」を使用
  • 半透明の表現で、「Shade3Dマテリアル」を使用

「視線追跡レベル」「レイトレーシングの画質」を下げた場合、レンダリング速度を大きく短縮できますが、
品質の低下も招きます。
そのため、今回のキッチンシーンのように下げることができない場合もありそうです。

イラディアンスキャッシュをオフにする

レンダリング手法の選択とパストレーシングの「イラディアンスキャッシュ」について、いくつか比較してみました。
そのままのレンダリング設定では時間がかかってしまうため、200 x 150ピクセル、「視線追跡レベル」8、「レイトレーシングの画質」30としています。
以下のサイズになります。

手法 大域照明 イラディアンスキャッシュ レンダリング時間
パストレーシング パストレーシング 使用 31:20
パストレーシング パストレーシング 未使用 1:44
レイトレーシング パストレーシング 使用 37:24
レイトレーシング パストレーシング 未使用 53:57

「レイトレーシング + パストレーシング」の場合は、「パストレーシング + パストレーシング」よりも時間がかかっています。
このため、間接照明のあるレンダリングの場合は「パストレーシング + パストレーシング」を選択したほうが速度的に有利です。
また、「イラディアンスキャッシュ」をオフにすることでかなりの速度アップが確認できました。

「レイトレースの再帰」を考慮して調整

パストレーシングで大域照明を使用する場合、すべての面は何かしらの反射が発生する状態になります。
反射が起きると、レイトレーシングをベースとしたレンダリングの場合(パストレーシングも含む)、「レイトレースの再帰」が増えることになります。
そのため計算時間がかかります。
「レイトレースの再帰」は、視線から飛ばしたレイが物体にぶつかり、拡散反射面、メタリックな鏡面反射面、透過/屈折する面を経由して反射を繰り返すことを指します。

「荒さ」(ラフネス)が強い場合、ピクセルサンプリングを増やさないと収束しにくくなるため、これも計算時間に影響します。

また、Shade3Dでは旧「Shade3Dマテリアル」使用時でも「反射」と「透過/屈折」の両方が入るとレンダリング速度の低下につながります。
レンダリングとしては、「レイトレースの再帰」が分岐して増えることになります。
これは、直接照明のみのレイトレーシング手法を使ったレンダリングの場合も同じです。

この「レイトレースの再帰」を極力少なくすることが、レンダリング速度を上げるために有効な手段になります。

「PBRマテリアル」を使用している場合は、「反射」と「透過/屈折」の両方が入る状態になりやすいです。
そのため、キッチンシーンの以下の形状は「Shade3Dマテリアル」を使用するほうがレンダリング速度の短縮につながります。

  • 壁/天井 (拡散反射のみのマテリアル)
  • コップ/計量カップ (透明 + 屈折のマテリアル)
  • 窓ガラス (透明 + 屈折のマテリアル)

200 x 150ピクセル、「視線追跡レベル」8、「レイトレーシングの画質」30、
「パストレーシング + パストレーシング」、イラディアンスキャッシュをオフ、として比較しました。

手法 大域照明 イラディアンスキャッシュ PBRマテリアル レンダリング時間
パストレーシング パストレーシング 未使用 ほぼ使用 1:44
パストレーシング パストレーシング 未使用 壁と天井/窓ガラス/コップ/計量カップのマテリアルを
「Shade3Dマテリアル」に変更
00:11

レンダリング画像の大部分を占める天井と壁のマテリアルを「Shade3Dマテリアル」にしたため、速度アップが確認できました。

再レンダリング

「パストレーシング + パストレーシング」(イラディアンスキャッシュ未使用)で、
「視線追跡レベル」を12、「レイトレーシングの画質」を60とし、
640 x 480ピクセルの解像度でレンダリングしました。
また、壁と天井/窓ガラス/コップ/計量カップのマテリアルを「Shade3Dマテリアル」に変更しています。

15分05秒でレンダリングできました。
イラディアンスキャッシュ使用時は75時間かかってましたので、かなりの短縮です。
高周波ノイズが増えているため「レイトレーシングの画質」を上げていけばよさそうです。

「レイトレーシングの画質」を140としました。

1時間8分27秒でレンダリングできました。

「レイトレーシングの画質」の増加値よりレンダリング時間を予測

※ イラディアンスキャッシュを未使用の場合の計算になります。

なお、「レイトレーシングの画質」の値を上げると比例してレンダリング時間がかかる、というわけではありません。
この「レイトレーシングの画質」の値はピクセルの1辺に相当し、
「レイトレーシングの画質」値の増加により、レンダリングは2乗の時間程度かかることになります。
「レイトレーシングの画質」が60で905秒(15分05秒)、140で4107秒(1時間8分27秒)であるので、
「レイトレーシングの画質」の値をRaySamplingとした場合、
2組の「レイトレーシングの画質」とレンダリング時間の組み合わせがある場合に、以下の式でレンダリング時間を予測できます。

レンダリング推定時間(秒) = ((4107 - 905)/(140^2 - 60^2)) * (RaySampling^2 - 60^2) + 905

※ ^2 は、二乗の計算です。

「レイトレーシングの画質」を200とした場合は上記の式に代入し、8189秒(2時間16分29秒)と計算できました。
これがレンダリング時間の目安になります。

以下は「レイトレーシングの画質」を200として、実際にレンダリングした結果です。

2時間18分08秒でレンダリングできました。推定通りの時間になりました。
まだノイズがありますが、これをShade3Dでの最終レンダリングとします。

ペイントツールで加工する

レンダリングを行ったシーンをファイル保存しておきます。
レンダリングとしてはこれで完了ですが、もう一歩進めます。
Shade3Dからのレンダリングでは、ポストプロセス(もしくはポストエフェクトと呼ばれる)の工程は含んでいません。
ポストプロセスは、レンダリング画像に対してフィルムとしての色校正を行ったり、
ビネット効果、露出調整、ホワイトバランス調整などを行う作業になります。
Shade3Dではこれに相当するのは色補正ウィンドウの調整になりますが、あまり複雑なことはできません。
そのため、Shade3Dのレンダリング結果をいったんHDRIであるEXR形式でファイル出力し、
ペイントツール側で加工していきます。

なお、ここでは例としてSerif Europe Ltdの「Affinity Photo」( https://affinity.serif.com/ja-jp/photo/ ) というペイントツールを使って説明しております。
ツールの使い方については省いています。

EXR形式でレンダリング画像をファイル保存

イメージウィンドウを表示し、レンダリング画像をEXR形式で保存します。
EXR(OpenEXR)形式は各ピクセル値として1.0を超えるダイナミックレンジ情報を持ちます。
ただし、保存前に色補正ウィンドウでゲインを1.0にしておいてください。

ゲインは、ピクセルの輝度(RGB)に対して指定の値を乗算する効果になります。
例えばペイントツール側でノイズ除去をする場合、このゲインがかかっていると輝度値が離れてしまうことになります。

注意点として、ここでLDRであるjpegやpngでは出力しないようにしてください。
EXR形式ではダイナミックレンジ情報として、細かい階調で保持されます。
jpegやpngの場合は256階調になり、これは露出などをかけると飽和してしまいます。

ペイントツール側で行う作業

以下の処理を行うことにしました。

  • ノイズ除去 (Denoise)
  • 露出調整
  • ホワイトバランス調整
  • ビネット

露出は、画像全体の輝度を調整します。
ホワイトバランスは、光の色の調整です。
オリジナルは若干赤みがかっているため、少し白に近づけるようにします。
ビネットは画像の周囲を若干暗くして安定感を与えます。


1つめがオリジナルです。
2つめは露出を調整。
3つめはノイズ除去。ノイズ除去は、露出調整より前にオリジナルの画像に対して行っています。
4つめはホワイトバランス調整。
5つめはビネット調整です。

最終的に以下のようになりました。

このように、ポストプロセスで印象をガラッと変えることができます。

以上でキッチンシーンは終着点まで来ました。
これで「キッチンを作る」のテーマは完了になります。
比較的規模のあるシーンを作品として仕上げていく流れでした。

次回は別のテーマとなり、このキッチンのシーンをリアルタイム(例としてUnity)に渡していく流れを説明する予定です。

カテゴリー: キッチンを作る