Blender でレンダリング時間を短縮する方法まとめ
Blender レンダー以外の項目はバージョン 2.93 以降を前提としている。
目次
- ノイズ対策
- 外部リンク
概要
バージョン 3.0 以降は高速な GPU(nVidia のものが推奨される)を使うのが早い。高速な GPU を使えば、Cycles X でも Eevee でもレンダリングが速くなる。レンダリングを速くしたいなら CPU より GPU を強化したほうがいい。
バージョン 2.93 以前
レンダリングを高速化する方法は大きく分けて2種類ある。Eevee を使う方法と Cycles でデノイザノードを使う方法だ。バージョン2.90 からは Maxwell 以降(GeForce 700, 800, 900, 1000)の GeForce でも Optix によるビューポートデノイズやレンダリング高速化の恩恵が受けられる。
Cycles ならライトパスの最適化を行う方法もある。
スチル・ルックデブ(ルック開発)
スチル・ルックデブならEevee、デノイザノード、OptiX Viewport Denoising、ビューポートデノイズ、高速 GI 近似、E-Cycles アドオンが候補になる。
Eevee はヘアー、ボリューメトリックス、透過などの品質はよくないが、リアルタイムでレンダリングできる。
デノイザノードは画質は悪化するがレンダリング速度は劇的に速くなる。OptiX Viewport Denoising、ビューポートデノイズを使えば Cycles でもビューポートのレンダリングに数秒しかかからない。
アニメーション
デノイザノードや Cycles のデノイズはアニメーションさせると時間方向のノイズやちらつきが発生するため、アニメーションでは使用されない傾向にある。ヘアー、ボリューメトリックス、透過などの品質が許容できるなら Eevee が選択肢に入る。Cycles なら Adaptive Sampling を使い、ハードウェアに投資する。
Eevee を使う
Eevee はゲームエンジンで使われているラスタライズ法でレンダリングするリアルタイムレンダラーだ。透過や反射の表現に制限はあるが、それが許容できるならば最終的なレンダリングにも使える。
Eevee は基本的に物理ベースの表現しかできないが、Shader to RGB ノードを使えばセルルックも可能だ。
レンダラーを変える
セルルックならば Cycles より Blender レンダーや Eevee の方がレンダリングが速い。
フリーの物理ベースレンダラーは Cycles 以外にも選択肢がある。クオリティーやレンダリング時間の比較はRender Engine Comparison: Cycles vs The Restを参照。
- LuxCoreRender(解説記事)
- Mitsuba
- appleseed
- Radeon ProRender
- OctaneRender™ 2019 for Blender® 2.8
- RenderMan for Blender
その他にも POV-Ray、Kerkythea やモンテカルロレイトレーサーの Y・A・F・A・R・A・Y がある。
有料のレンダラー
V-Ray for Blender(1年ライセンス¥80,000~)
Redshift 3.0 & Blender 2.82 Plug-in Alpha Testing Preview($500~)
コンポジターの計算に GPU を使う(4.2)
場所はプロパティパネルの「レンダータブ > パフォーマンス > コンポジター > デバイス」。
マルチ GPU
Eevee はマルチ GPU をサポートしてない。アニメーションをレンダリングする際に複数インスタンスを作成して、複数の GPU を利用する方法はある。
Cycles におけるマルチ GPU
GPU Rendering - NVIDIA GeForce RTX 30 Series Multi-GPU Scaling
上記のリンクは Redshift, Octane, V-Ray のベンチだが、2枚挿しで 1.9 倍以上のパフォーマンスが出ている。マルチ GPU は Cycles のレンダリングを高速化したい場合には有力な選択肢だが、メモリ容量の問題がある。
GPU のメモリ容量問題
レンダリングの際に GPU 間でデータを共有できないため、それぞれの GPU のメモリにデータが複製される。なのでメモリの少ない GPU を追加すると巨大なシーンがレンダリングできくなる可能性がある。
Distribute Memory Across Devices(NVLink)を使えば、GPU 間でメモリを共有できる。ただし NVLink に対応する GPU は Quadro もしくはハイエンドの GeForce になる。
そのためマルチ GPU を利用する場合は、同じメモリ容量の GPU を使うことが推奨される。ただし NVLink が利用できるならば、GPU の選択は自由だ。
NVLink BridgeでGPUを繋いでも1GPUにはなりません。
Cycles X(3.0)
Cycles X は Cycles の後継のレンダラーだ。GPU を使ったレンダリング速度は最大で7倍(Quadro RTX 6000(OptiX) でbarbershop をレンダリングした場合)になる。平均では2~3倍速くなる。CPU を使ったレンダリング速度はほとんど変わらない。ただし CPU レンダリングであってもビューポートの応答性がよくなっている。
nVidia の GPU は OptiX に対応している必要がある。AMD の GPU は RDNA(RX5000番台)と RDNA2(RX6000番台)が対応している。
サンプリング
バージョン 2.93 以前の Cycles はサンプル数を指定していたが、Cycles X ではノイズしきい値を指定する。これはバージョン 2.93 以前の適応サンプリングが既定の動作になったようなものだ。ノイズしきい値のチェックを外せば、従来どおりのサンプル数を指定したレンダリングもできる。レンダリング時にはタイルサイズごとの制限時間を指定することもできる。
スクランブリングディスタンス(Scrambling Distance)
光源を探索する際に光線をランダムに反射させるのは、キャッシュのヒット率が悪い。ここで隣接するピクセルは似たような特性(マテリアルや法線など)をもつ、という仮定を置くと、隣接するピクセルと似た方向に光線を反射させれば、キャッシュのヒット率をあげられる。
スクランブリングディスタンスの Multiplier はこの光線の反射の相関(correlation)を制御する。Multiplier を0にするとレンダリング時間は短くなるが、不自然な結果が多くみられるようになる。Multiplier を1にするとスクランブリングディスタンスを無効にしたのと同じ結果になる。
注意点
スクランブリングディスタンスを使うにはノイズしきい値のチェックを外す必要がある。
スクランブリングディスタンスは GPU のレンダリングは速くなるが、CPU のレンダリングはあまり変わらない。
外部リンク
スクランブリングディスタンスの Multiplier を 0.1 にすると GPU のレンダリングが約2倍速くなる。
Distance Scrambling for for Cycles X - Sobol version
Cache-friendly micro-jittered sampling(pdf)
タイルとメモリ使用量
高解像度のレンダリングはメモリ使用量が多くなるので、タイルごとにストレージに保存することで、メモリ使用量を節約している。
バージョン 2.93 以前の Cycles は速くレンダリングするためにタイルサイズを手動で最適化する必要があった。Cycles X ではそれが自動化されている。しかし以下の状況では手動でタイルサイズを小さくするのが有効だ。
- 解像度が巨大なのでメモリが足りない
- 透過のある髪などの GPU 負荷の高いオブジェクトが存在する
削除された機能
OpenCL
Cycles X では OpenCL はメンテナンスコストが高いのでサポートされない。Cycles X の最初のリリースでは Intel の内蔵 GPU を使ったレンダリングはできない。
分岐パストレーシング
適応サンプリングと Light Importance の改善により、分岐パストレーシングは不要になる。
NLM デノイザ
OpenImageDenoise が高性能なので NLM デノイザは削除される。
Cycles X・Cycles 共通
GPU を使う
CPU と GPU と両方を同時に利用してレンダリングする
User Preference のシステムタブで Cycles 演算デバイスを選択し、プロパティパネルのレンダータブで「パフォーマンス > デバイス」を GPU 演算にする。
バージョン 2.92
バージョン 2.92 以降では CPU と OptiX 対応 GPU と両方を同時に利用してレンダリングできる。
タイルサイズ
Boost Clock によると Blender 2.80 で nVidia の GPU を使って Cycles のレンダリングをする場合、タイルサイズでレンダリング時間はほとんど変化しない。
GeForce(Optix)を使う
バージョン 2.90 からは Maxwell 以降(GeForce 700, 800, 900, 1000)の GeForce でも Optix(Cycles のハードウェアアクセラレーションと Viewport Denoising)が使える。
GeForce RTX を使う
GeForce RTX を使うと Cycles のレンダリング速度が最大で 110 %高速になる。「プリファレンス > システム > Cycles レンダーデバイス」で Optix を選択するとハードウェアアクセラレーションが有効になる。
OptiX Viewport Denoising
GeForce RTX を使用している場合は、Cycles で AI によるビューポートデノイズが使える。「プリファレンス > システム > Cycles レンダーデバイス」で Viewport Denoising ドロップダウンの OptiX AI-Accelerated を選択すると使えるようになる。
OptiX を使ってデノイズする場合、CPU 等のほかのレンダーデバイスにレンダリングさせられる。その場合、選択したレンダーデバイスのレンダリングと OptiX 互換 GPU のデノイズとが同時に行われる。
高速 GI 近似
高速 GI 近似は背景色の AO でディフューズ色の間接光を近似する。画質が悪化するため、ビューポートや間接光の影響力が小さいシーンでの使用が推奨される。
場所は「レンダータブ > ライトパス > 高速 GI 近似」。
外部リンク
Fast Global Illumination Approximations on Deep G-Buffers(pdf)
永続データを使う
これはアニメーションを高速化するオプションだ。これが有効な場合、フレーム間で更新が不要なオブジェクトのモディフィア適用・ BVH 構築・OpenGL 頂点バッファの更新などを省略できる。
「レンダータブ > パフォーマンス > 最終レンダー > 永続データを使う」にチェックを入れると、データをメモリにキャッシュすることでレンダリングが速くなる。
ただし GPU でレンダリングする場合に VRAM が不足するとレンダリングに失敗する。また一部のオブジェクトがレンダリングされなかったりする。
古いバージョンでは「データ保持」という名前だった。
外部リンク
Render: faster animation and re-rendering with Persistent Data
プリンシプルシェーダを速くするテクニック
下記の動画ではカメラから見える部分にプリンシプルシェーダを使い、見えない部分はディフューズと光沢(Glossy)とを組み合わせたノードを使っている。
ライトパスの最適化
各ライトパスの説明は【Blender】【Cycles】Cyclesでノイズを防ぐ方法の総まとめを参照。
全パスを有効にしてチェックすれば、ノイズが乗っているライトパスを特定できる。あとはノイズの多いライトパスのサンプル数を増やし、ノイズの少ないライトパスのサンプル数を減らす。
インテグレータを分岐パストレーシングにすると、AO や SSS のサンプル数を直接設定できる。
ベイクする
ノイズになりやすい AO、間接光、レンダリングに時間がかかるベベルノードの法線をベイクする。ただし AO、間接光はアニメーションしない場合に使える。
ノイズ対策
デノイザノードを使う
場所は Shift + A > フィルター > Denoise。
間接光の影響力が小さく、オブジェクトのマテリアルに透過が含まれていない場合、サンプル数1でも高い性能を発揮する。面積を持つ光源やガラス、暗所、SSS、モーションブラーは苦手で、サンプル数は 16 以上が必要になる。
使い方
イメージを渡すだけでも機能するが、法線やアルベドを渡すとより高性能になる。パスのデノイズデータにチェックを入れるか、法線とディフューズのカラーとにチェックを入れるかすると必要なパスを取得できる。derek barker 氏の検証ノードのように光沢や透過パスごとにデノイズする方法もある。
細部がつぶれてしまう場合は、サンプル数を上げるよりレンダリング解像度を上げて縮小するとよい。
パスの保存
OpenEXR を使えばパスを保存できる。
外部リンク
@attila_afra Any reason when I absolutely destroy an albedo (and sometimes normal) with a sharpen filter before sending it to OIDN it results in a much nicer denoise? Are some sharpened albedos in the training data? #blender3d #cycles #cyclesx #b3d pic.twitter.com/oZsWsfxYeP
— Derek Barker (@LawdOdin) June 17, 2021
デノイザアドオンを使う
Super Image Denoiser(€0+)
D-NOISE
ディープラーニングを使ったデノイザアドオン。GeForce 600 系以降かつ Windows でしか実行できないが、高速で高品質な結果が得られる。
E-Cycles($111.75~$749.25)
ディープラーニングを使ったデノイザアドオン。最新のバージョンではビューポートデノイズに対応している。D-NOISE に比べて以下の利点がある。
K-Cycles($49)
GeForce 10 以降に最適化された Blender。
デノイズ
シーンに存在しない属性のデノイズを無効にするとデノイズを高速化できる。
ビューポートデノイズ
デノイズ中はビューポートがロックされるので、極端に少ないサンプル数を設定すると使いづらい。
Path Guiding(3.4)
Path Guiding は光源が窓から入ってくる太陽光のみのような、なかなかノイズがなくならない状況で効果がある。バージョン 3.4 の時点では CPU レンダリングの時にしか使えない。将来的には GPU レンダリングもサポートする予定だ。
Path Guiding はディフューズ BSDF(Diffuse BSDF)と異方性(Anisotropy)や等方性(Isotropy)をもつボリュームとのみサポートしている。
異方性と等方性
ある対象の性質や分布が方向に依存しないときそれは等方的(とうほうてき、isotropic)であるといい、一方で、方向に依存するときは異方的(いほうてき、anisotropic)であるという。
つまり等方性=ボリュームノードの異方性が0、異方性=ボリュームノードの異方性が0以外。
外部リンク
Follow the light: Introducing path guiding in Cycles
Scattering and anisotropy usage
Light Sampling(3.5)
Light Sampling はサンプル単位の処理時間は少し長くなるがノイズを劇的に減少させる。light tree を使うことでライトが大量にあるシーンでも効率的にサンプリングできる。
バージョン 3.5 で新規にシーンを作成した場合は Light Sampling がデフォルトでオンになっている。「プロパティパネルのサンプリング > ライト(Lights)」で無効にできる。
Light Sampling を有効にした場合にレンダリング結果が異なる場合は、ライトクランピング(light clamping)が原因の可能性が高い。クランピングの結果はサンプリングのアルゴリズムによって変わる。light tree がうまく機能している場合は小さいクランピングでバイアスなしの結果に近くなる。
light tree は物理的に正しいライティングの時に効率的に機能する。なのでカスタムフォールオフやレイの可視性を変更するトリックは避けた方がいい。これらの物理的に正しくないライティングは light tree が使うヒューリスティックなアルゴリズムとの相性が良くない。
発光(emission)マテリアルの Multiple Importance Sampling は新しいサンプリング設定に置き換えられた。Auto がデフォルトで、ヒューリスティックなアルゴリズムを使う。このアルゴリズムは、メッシュをサンプリングのための光源とみなすかどうかを決定するために、放出された光源の強さを推定する。閉じたメッシュや片面のみ発光する場合は、表面にのみこの設定にしておくとノイズを減らせる。
SSS のノイズ対策
サンプル数を増やす。インテグレータを分岐パストレーシングにすると、SSS のサンプル数を直接設定できる。
外部リンク
What value should I increase to reduce noise for subsurface scattering, volume scatter, etc.?
輝点ノイズの除去
7 Ways to Get Rid of Fireflies Once and For All
1. 光源を大きくする
2. 光源のシャドウサイズを大きくする
3. 多重重点(Multiple Importance)を有効にする(デフォルトで有効になっている)
光源と環境とで設定できる。
外部リンク
多重重点的サンプリング (Multiple Importance Sampling)
4. 光沢フィルターの数字を増やす
光沢フィルターはぼかすことで光沢を消す。
5. コースティックスを無効にする
6. 制限(Clamping)を使う
制限(Clamping)はシーンの明るさが変化するため、他の方法で問題が解決できなかった場合に使う。
7. サンプル数を増やす
外部リンク
4 Easy Ways to Speed Up Cycles
【Blender】【Cycles】Cyclesでノイズを防ぐ方法の総まとめ
Introduction to Bidirectional Path Tracing (BDPT) & Implementation using OpenCL追加資料 (CEDEC 2015)
Cycles
適応サンプリング
Cycles で適応サンプリングが有効な場合、ノイズが少ない場所でサンプル数を自動的に減らす。「プロパティパネル > レンダータブ > サンプリング」で設定できる。
サンプル数の閾値はデフォルトではアンチエイリアスのサンプル数と同じに設定されている。この設定で画質を悪化させずに、テストシーンでのレンダリング時間が 10~30 %減少した。
最小サンプル数(Min Samples)
適応サンプリングが実行される前に行うサンプル数。デフォルトは0で、その場合は合計サンプル数の平方根が設定される。
ノイズしきい値(Noise Threshold)
サンプリングの継続を判断するエラーの閾値。一般的には 0.1~0.001 の間の値を設定する。数値が少ないほどノイズが少なく、レンダリング時間が長くなる。0の場合は合計サンプル数に基づいて適切な値が設定される。
外部リンク
RenderMan: An Advanced Path Tracing Architecture for Movie Rendering(pdf)
レンダラー非依存
13 Ways to Reduce Your Render Times
Rendering » Cycles » Render Settings » Performance
レンダーファーム
Google Colaboratory--非力なPCでもBlenderで高速にレンダリングする方法
Amazon EC2を使って、3Dレンダリングをしてみたメモ
Blender Farm
レンダーファームを管理するアドオン。
BlendFarm, A free, cross-platform, stand-alone, open-source Network Renderer(Blender Artist)
SHEEPIT
[Blender] Sheep it Render Farm がすごい
SHEEPIT はレンダリング画像が不特定多数の人に見られてしまう欠点がある。そのためポルノコンテンツのような 18 才未満が閲覧するのに適さない画像はレンダリングしてはならない。
Google Colab
ハードウェア
- RAM の容量を追加する
- CPU のコアを追加する
- CPU のクロックを上げる
- 別の OpenGL のドライバを試す
- 速い RAM 使う
OS
- プロセスの優先度を上げる
- スワップ/ページファイルの容量を上げる
- 64bit にする
- 不要なアプリ/バックグラウンドサービスを終了させる
- ネットワークを遮断する
- Linux を使う
Linux は WDDM がないため Windows より数%レンダリングが速い。
Blender レンダー
Blender 自体の設定
Memory Cache Limit を上げる。
最適化されたビルドを使う
レンダーウインドウを小さくする
シーンとオブジェクト
不要なライトを削除するかレンダリングしない
影を生成しない。影のみが必要な時は「影のみ(shadow only)」を使う。
バッファシャドウを使う
動かないものはライティング情報をテクスチャにベイクする
メッシュを単純にする
重複頂点を削除する・距離でマージ(Remove Doubles, Merge by Distance)。ポリゴン数削減(Decimate)モディフィアを使う
細分割曲面(Subsurf)モディフィアや多重解像度(Multiresolution)モディフィアの分割数を少なくする
不透明オブジェクトの見えない部分のポリゴンを削除する
分割してレンダリングする。
背景と動くものとを別々にレンダリングし、動くものは背景を透明にしてレンダリングする。後でコンポジットで合成する。
カメラを動かさない。背景とキャラとを別々にレンダリングする際に特に有効
エリアライトの使用を避ける
マテリアルを陰影なし(Shadeless)にする
マテリアルを陰影なし(Shadeless)にして、AO をベイクする
スポットライトにクリップを設定して、ライトが照らす範囲を狭くする
カメラのクリッピング(clipping):を小さくする
ワールドのアンビエントオクルージョン(AO)、環境照明(Environment Lighting)、間接照明(Indirect Lighting)を無効にする
マテリアルの SSS(Subsurface Scattering)を無効にする
テクスチャサイズを小さくする
背景をビルボード(板ポリにテクスチャを張り付けたもの)にする
モデリングの時に面複製(DupliFace)や頂点複製(DupliVert)を利用する
Adaptive Subdivisionを利用する
Render タブ
- レンダリングの解像度を下げる
- アンチエイリアス(AA)を無効にする
- モーションブラー(Motion Blur)を無効にする
- レイトレーシング(Ray Tracing)を無効にする
- 影(Shadows)を無効にする
- SSS(Subsurface Scattering)を無効にする
- バッファを保存する
- タイルサイズを最適化する
- 辺(Edge)を描画しない
タイルサイズ(Tile Size)を最適化する
最適なタイルサイズはハードウェアによって異なる。いくつかのタイルサイズでレンダリングしてみて、最適なものを採用する。2012 年ごろのハードウェアでは、CPU を使う場合 16~32、GPU を使う場合では 256 あたりが最適だ。2016 年の GPU では 512 や 1024 のほうが速いことも多い。
標準アドオンの Auto Tile Size を使えば余りの出ないサイズを計算してくれる。