Blender ウォッチング

無料のモデリングツール「Blender 3.6」で改良されたライトツリーを検証!

複数のユースケースでの速度を比較してみたら……

 本連載では、無料の高機能3Dモデリングツール「Blender」の使い方や関連情報を幅広くお伝えします。

今回はやたらピカピカしています

 6月27日(GMT)、「Blender 3.6」が公式リリースされました。

 今回は「Blender」の「Cycles」レンダー用の「ライトツリー」機能の改善についてご紹介します。

ライトツリーのインスタンス対応

 ライトツリーとは、照明の分布をツリー形状で記録し、光のサンプリングを効率よく行う機能です。時間が少しかかる代わりに、同じサンプル数でより多くの光を取り込むことができ、その結果ノイズを減らすことができます。

 v3.6では、そのライトツリーの構築がライトのインスタンスに対応し、さらにマルチスレッド化により高速化しました。

 インスタンスとは、実体のないコピーのことで、同じ形状のモデルを大量配置する時に使用することで、メモリと速度の効率が向上します。

 v3.6では「メッシュライト」(発光するマテリアルを使用したメッシュ形状)のインスタンスのライトツリー化に対応し、例えば「クリスマスツリー」の電球のような、多数のライトのあるシーンでの速度の向上が期待できます。

実際の比較

 それではどれくらいの効果があるのか、実際に確認してみたいと思います。

テスト環境
  • OS:Windows 10 x64
  • メモリ:16GB
  • CPU:Intel Core i7-2600
  • GPU:GeForce RTX 2060 12GB

パーティクルインスタンスによるテスト

 まずは、「Blender」のパーティクル(粒子)機能で発生させた、光を放射する大量のインスタンスによるテストを行ってみます。

 上述の通り、クリスマスツリーにつけたワイヤー上に、メッシュライトで作成した装飾用ライトを大量に配置したシーンを使用します。このメッシュライトは合計64個あります。

クリスマスツリーシーンのセットアップ。季節外れとかいわない

 なお、クリスマスツリー自体はアセットプラットフォーム系アドオン「BlenderKit」上で公開されている、Nik Kottmann氏によるジオメトリノードアセットを使用しています。レンダリング時間の比較のみがしたいため、レンダリング前にモディファイアーを適用しています。

 まずは「v3.5」によるレンダリング。1分03秒かかりました。

v3.5によるレンダリング。1分03秒

 次に「v3.6」によるレンダリング。1分11秒と、下がるどころか、秒数が増えてしまっています……若干影が濃いなど完全に同じではないため、単純比較はできません。

v3.6によるレンダリング。1分03秒

 その後、もっと数を増やさないと効果がわからないのかもしれないと、インスタンスを「512個」まで増やして再実行してみましたが、結果はやはり「v3.6」の方が10秒ほど遅い結果に。もちろん、双方で違うAPIを使用するなどのケアレスミスはチェック済みで、比較方法に問題はありません……このままでは記事が書けない! どうすれば!

ジオメトリノードのインスタンスによるテスト

 そういうわけで、別のインスタンスタイプなら有効になるのでは? と、新たにメッシュライトをばらまく簡単なジオメトリノードを作成し、それでテストを行うことにしました。インスタンスの数は「546個」です。

ジオメトリノードのセットアップ

 再び「v3.5」でレンダリング。42秒93かかっています。

v3.5によるレンダリング。42秒93

 そして「v3.6」でレンダリング。36秒69。ようやく高速化の効果が確認できました! 画像にはありませんが、メモリ消費量も約53MB程度削減されていました。

v3.6によるレンダリング。36秒69

 しかし、上記のクリスマスツリーのシーンで効果が確認できなかったのは、インスタンスのタイプの問題ではなく、テストしたインスタンスの数がもっと必要だった可能性もあります。

 そのため、今度はインスタンスの数を106まで減らして再実行してみました。すると、今度は両方とも29秒台になり、僅差になったものの「v3.6」の方が速いままでした。

インスタンス数を106に減らした時の比較。僅差だがv3.6の勝利に

オブジェクトのインスタンス化機能によるテスト

 最後に、メッシュオブジェクトの頂点などに子オブジェクトを複製する「インスタンス化」機能を使用してみました([オブジェクトプロパティ]-[インスタンス化]-[頂点])。これは「Dupli-Verts」などの名前で昔からある機能で、残念ながらv4.0での削除が予定されています

 インスタンス数はどーんと増えて「7,956個」です。果たしてどうなるのやら。

プロパティエディターの[オブジェクトプロパティ]-[インスタンス化]-[頂点]によるセットアップ。子の「球」が親の「モンキー」の頂点に複製される

 v3.5の3分15秒に対し、v3.6では3分07秒と、先ほどのジオメトリノードのテストに比べると差は小さいものの、高速化の効果が出ているようです。一方でメモリ消費量は約58MBと、ジオメトリノードでの結果と同等程度に改善されています。

v3.5の3分15秒に対し、v3.6は3分7秒とわずかながら改善。一方でメモリ消費量はそこそこ節約されている

結論

 今回のライトツリーのインスタンス対応・高速化は、ある程度まとまった数でないと恩恵がないという、割と当たり前の結果になりました。

 また、ジオメトリノードで作成したインスタンスでのみ大幅に時間が短縮されたことについては、単に「v3.5でのCyclesによるジオメトリノードのインスタンスの(メッシュライトの)レンダリングは、元々他のインスタンスタイプに比べて遅かった」だけの可能性があります。

 ただ、今後パーティクル機能とオブジェクトのインスタンス化機能は両方とも、ジオメトリノードで置き換えられることを考えると、遅かった部分が高速化するのは喜ばしいことであることは間違いありません。

おまけ:v3.6のバンプマッピングについて

 この記事の執筆中、v3.6でレンダリングしてみると画像が暗くなったファイルがありました。色管理やライティング、APIをチェックしてみましたが、問題なし。

 しかしある時、ノイズがよく見えるようにバンプマッピングを切ってみたところ、あっけなく同じ明るさの画像がレンダリングされました。

 v3.6でレンダリングして同様に困っている方がいれば、[バンプ]ノードの[強さ]を減らすことで改善される可能性があります。

同じファイルを読み込んでみた例。右端は[バンプ]ノードの[強さ]を減らして調整してみた結果

終わりに

 今回は「Blender 3.6」で改善された「ライトツリー」機能についてご紹介しました。Cyclesには他にも巨大なメッシュデータの読み込み時間の短縮など、様々な最適化が行われており、今も「v4.0」に向けた開発が続いています。

 またご紹介できることを楽しみにしています。