前回の BlenderのEEVEEとCyclesを同じシーンで比べてみた で、eightはCyclesの見方が変わりました。ノイズ除去を入れれば8サンプルで足りる、という話です。

そうなると次に気になるのは「ほかの高速化設定はどうなのか」でした。Blenderには速くするための設定がいくつもありますが、どれがどのくらい効くのかは、使ってみるまで分かりません。

そこで今回は、11の設定を1つずつ足して、前後で測りました。ただし測ったのは時間だけではありません。その設定で絵がどれだけ変わったかも、同時に数値にしています

結果を先に言うと、絵をほとんど変えずに速くなったのは、11のうち2つだけでした。そしてその2つを足すだけで、屋内1.71倍・屋外2.85倍になります😳

ただし「ほとんど変えずに」と書いたからには、変わっている分がどこかにあるはずです。そこも画素単位で調べたので、記事の後半で書きます。

「速くなった」だけでは、良い設定か判断できない

スポンサーリンク

「この設定をオンにすると速くなります」という情報はたくさんあります。でも、そこで止まってしまうと困ったことになります。

速くする設定の多くは、計算を省くことで速くしているからです。省けば当然、絵は変わります。つまり「速くなった」という報告だけでは、それが得な設定なのか、単に品質を落としただけなのかが分かりません

この回で答えたいこと
それぞれの設定について、何倍速くなったか絵が何を失ったかを並べる。そのうえで「ただ得な設定」だけを選び出す。

幸い、前回作った仕組みがそのまま使えます。Cyclesを長時間かけて焼いた絵を「正解」と決めて、そこからのズレを数値にするやり方です。これがあると、設定を変えたときに絵がどれだけ動いたかを距離で言えます。

用語集

今回いじる設定の名前を先に整理しておきます。どれもBlenderのレンダー設定の中にあります。

用語意味
サンプル数1画素あたり何本の光線を撃つか。多いほど正確でザラつきが減るが時間がかかる
ノイズ除去(デノイズ)光線が足りずザラついた絵を、あとから均して整える機能。CyclesにはOpenImageDenoise(Intel製)とOptiXデノイザ(NVIDIA製)が入っている
アダプティブサンプリング綺麗になった画素から順に光線を撃つのをやめる仕組み。「どのくらい綺麗になったら止めるか」をしきい値で決める。数字が大きいほど早く打ち切る
バウンス光線が何回まで跳ね返るか。既定は12回
コースティクスガラスや水を通った光が集まってできる明るい模様。計算が重い部類
Fast GI何回か跳ね返った先を、まじめに追わず近似で済ませる設定
ライトツリー光源がたくさんあるとき、その場所の明るさに関係ない光源を切り捨てて計算を減らす仕組み
Persistent Data連番を焼くとき、フレームごとに作り直している下ごしらえを使い回す設定
タイル画面を小さく区切って順番に焼く仕組み。メモリが足りないときに使う
OptiX / CUDA / HIPGPUの使い方の種類。OptiXはNVIDIAのレイトレーシング専用回路(RTコア)を使い、CUDAは汎用の演算として使う。HIPはAMD向け
RMSE2枚の絵の食い違いを1つの数字にしたもの。0なら完全一致で、大きいほど離れている

測り方:速さと絵の変化を同時に出す

測り方はこうしました。

  1. Cyclesの高サンプル(ノイズ除去なし)で焼いた絵を「正解」とする
  2. 前回と同じ設定(128サンプル+ノイズ除去)を出発点にする
  3. そこから設定を1つだけ変えて焼く。これを11通り
  4. それぞれについて「何秒だったか」と「正解からのズレがどれだけ増えたか」を記録する

シーンは3つ使いました。前回の2つに、今回1つ足しています。

シーン中身足した理由
屋内窓・赤い壁・鏡の球・ガラス球・開いた箱(前回と同じ)コースティクスを評価できる
約2万インスタンス(前回と同じ)物量の多い側
光源60個の部屋同じ部屋に点光源を60個足した版★前回の部屋は太陽1灯なので、ライトツリーの効果が原理的にゼロになる
光源を60個置いた部屋のBlenderビューポート
今回足した「光源60個の部屋」。同じ部屋・同じカメラのまま、光の条件だけを変えている

条件を揃えたところ

解像度1280×720/カラーマネジメントAgX/最大バウンス12/128サンプル。前回とまったく同じ土台にしてあるので、前回の数字とそのまま地続きで読めます。レンダリングはWindows機(RTX 3060)で計測し、記事を書くのはMacという分担です。

もうひとつ、測る前に必ず小さい絵を1枚焼いて捨てるようにしました。前回、そのマシンで最初にGPUのシェーダを要求した処理だけが15秒ほど余計にかかると分かったからです。速さを測る今回、これが混ざると全部が台無しになります。実際、今回は余計な時間が乗った回はゼロ件でした(最長でも1.65秒)。

★結論:タダで効くのは11のうち2つだけ

まず全体を1枚で。横が速さ、縦が絵の変化です。右にいくほど速く、下にいるほど絵が変わっていません

速くなった分、絵は何を失ったか(屋内シーン)右にいくほど速い/上にいくほど絵が変わる。★左下から右下の帯にいるものが「タダで速い」1.0倍1.2倍1.4倍1.6倍1.8倍2.0倍2.2倍015153060絵のズレの増加この帯=絵がほぼ変わらないタイル512・Persistent Data・ライトツリーOFF = ほぼ変わらないしきい値を緩める(1.21倍)ノイズ除去をGPUで/OptiXデノイザ(1.32倍)バウンス12→4コースティクスOFFFast GI屋内シーン・Blender 5.2.0 LTS / RTX 3060(OptiX) / 1280×720 / 128サンプル。縦軸は0付近を見せるため圧縮しています。

きれいに分かれました。右下(速くて絵が変わらない)にいるのは2つだけです。

設定屋内光源60個
ノイズ除去をGPUで走らせる1.32倍 / ズレ+0.0011.65倍 / ズレ+0.0021.22倍 / ズレ+0.003
しきい値を0.01→0.051.21倍 / ズレ+0.0581.42倍 / ズレ+0.1671.47倍 / ズレ+0.057

「ノイズ除去をGPUで走らせる」は、チェックボックス1つです。それだけで街が1.65倍になり、しかも絵はほぼそのままです(ズレ+0.002)。これがどのくらい「そのまま」なのかは、後の章で画素単位まで確かめます。

Blenderのノイズ除去設定パネル
ノイズ除去の設定。ここに「GPUで実行するか」のチェックがある

なぜここまで効くのか。前回の記事で「ノイズ除去は固定費で約2.6秒」と書きました。今回その内訳を測ったところ、こうなっていました。

設定屋内の時間ノイズ除去なしからの上乗せ
ノイズ除去なし5.62秒
OptiXデノイザ5.92秒+0.30秒
OpenImageDenoise(GPU)5.94秒+0.32秒
OpenImageDenoise(前処理を速い方に)6.15秒+0.53秒
OpenImageDenoise(前処理なし)6.50秒+0.88秒
OpenImageDenoise(既定・CPU)7.88秒+2.26秒

★前回の結論を更新します
「ノイズ除去の固定費は約2.6秒」と書きましたが、正確には「既定のままだと2.6秒」でした。GPUで走らせるチェックを入れると +0.32秒=7分の1になります。デノイザ自体は同じものなので、絵の傾向も変わりません。

ついでに面白かったのが、「前処理なし」が「前処理・速い方」より遅いことです(6.50秒 対 6.15秒)。前処理を省くとノイズ除去に渡す絵が汚くなり、本体側が長引くようです。省けば速い、が成り立たない例でした。

★その2つを積むと1.71〜2.85倍になる

では、この2つだけを足すとどうなるか。

絵を変えない設定を2つ足すだけで「ノイズ除去をGPUで」+「アダプティブのしきい値を0.01→0.05」屋内 そのまま7.848秒屋内 2つ足した4.599秒1.71倍街 そのまま4.961秒街 2つ足した1.741秒2.85倍光源60個 そのまま10.914秒光源60個 2つ足した5.549秒1.97倍絵のズレの増加は +0.06〜+0.17(見て分かる差ではありません)。
設定2つを足す前後の屋内シーンの比較
左=そのまま7.85秒/右=設定2つを足して4.60秒。1.71倍速いが、絵の違いは見て分からない(差がどこにあるかは後述)

並べてみて、違いが分かるでしょうか。eightには分かりませんでした😅 数値でもズレの増加は+0.058です。

街シーンで設定2つを足す前後の比較
街では4.96秒→1.74秒=2.85倍。こちらも見た目はほぼ同じ

街ではさらに効いて2.85倍です。1枚あたり5秒が1.7秒になるので、100枚焼けば8分半が3分弱になります。

★「全部乗せ」より「タダのものだけ」のほうが良い
ためしに絵が変わる設定も混ぜて積み上げたところ、屋内で2.38倍まで行きました。ただし絵のズレは+15.96です。いっぽう街では、タダの2つだけのほう(1.741秒)が全部乗せ(1.753秒)より絶対時間でも速く、しかも絵の変化はずっと小さいままです。欲張らないほうが速いという結果でした。

なぜ掛け算より得になるのか

ところで、1.32倍と1.21倍を足すと1.71倍になりました。掛け算だと1.60倍のはずなので、期待より得です。街でも2.34倍の見込みに対して2.85倍でした。

これは偶然ではなく、理由がありました。時間の内訳を分解するとはっきりします。

2つの設定は、別の場所から時間を削っているだから倍率の掛け算より得になる(屋内シーン・実測を分解)そのままレンダー 5.62秒除去 2.23秒7.85秒+ノイズ除去をGPUでレンダー 5.62秒5.93秒+しきい値も緩めるレンダー 4.23秒4.60秒光線を飛ばす時間(しきい値で削る)ノイズ除去の時間(GPUに載せて削る)

2つの設定は、削っている場所が違います。

  • ノイズ除去をGPUで … 後処理の時間を 2.23秒 → 0.31秒に削る
  • しきい値を緩める … 光線を飛ばす時間を 5.62秒 → 4.23秒に削る

足すと 4.23 + 0.31 = 4.54秒。実測は4.60秒なので、ほぼ計算どおりです。別々の場所から固定の時間を削るので、倍率としては掛け算より得になるわけです。

逆に、絵が変わる設定を重ねたときは街で頭打ちになりました。あちらはどれも同じ場所(光線を飛ばす時間)を取り合っているので、2つ目からは削る余地が残っていません。設定を組み合わせるときは「同じ場所を削っていないか」を見ると読みやすいと思います。

⚠では、本当に何も失っていないのか

ここまで「絵は変わらない」と書いてきましたが、これは画面全体で平均した数値の話です。平均が小さくても、どこか一部に差が集中している可能性は残ります。そこを調べました。

まず、画素ごとにどれだけ違うかを数えます。値は0〜255の階調です。

比べたもの差が1以上の画素差が4以上の画素いちばん大きい差
ノイズ除去をGPUにしただけ0.00%0.00%1
2つとも足した(屋内)6.71%0.08%20
2つとも足した(街)5.08%0.19%14
2つとも足した(光源60個)4.25%0.19%57

★ノイズ除去のGPU化は、本当に何も失っていませんでした
いちばん大きく違う画素でも255階調のうち1です。これは実質的に同じ絵と言い切れます。計算のやり方を変えているだけで、間引いていないので当然といえば当然でした。

問題はしきい値を緩めたほうです。こちらは画素の4〜7%で差が出ていて、いちばん大きいところは20〜57ありました。では、それはどこに出ているのか。

屋内シーンで差が出ている場所を可視化した図
右=差が出ている場所(明るいほど差が大きい)。球の輪郭・接地部・窓枠に集中している
光源60個の部屋で差が出ている場所を可視化した図
光源60個の部屋。差はさらにはっきり球の上に集まる

ひと目で分かります。差は反射する球・ガラス球・物の輪郭に集中しています。数値でも同じでした。

場所屋内光源60個の部屋
鏡の球全体の1.3倍(最大20)全体の1.6倍(最大57)
ガラス球と集光1.1倍(最大15)1.3倍(最大41)
開いた箱の中1.2倍1.1倍
天井・上の壁0.7倍0.8倍
窓(明るく単純な面)0.6倍

理由は、アダプティブサンプリングの仕組みを考えると納得できます。この機能は「もう十分きれいになった画素から光線を撃つのをやめる」ものです。しきい値を緩めると、「まだきれいになりきっていない画素」も早めに切り上げてしまいます

そしていちばんきれいになりにくいのが、反射や屈折の面です。光線が跳ね返るたびに行き先がばらけるので、収束に時間がかかります。だから切り上げの影響がそこに集中するわけです。

光源60個の部屋で最大57まで出たのも同じ理由でした。鏡の球には60個の光源が小さな輝点として映り込んでいます。ここは収束がいちばん遅い場所なので、真っ先に切り上げの影響を受けます。

もうひとつ、わずかな明るさの偏りも見つかりました。差を符号つきで平均すると、屋内は−0.31(255階調中)、光源60個の部屋は−0.12でした。ほんのわずかに暗くなっています。収束の遅い明るい部分=ハイライトが早めに切り上げられるので、そのぶんの光が乗り切らないのだと思います。街では±0.01で、こちらは偏りのない純粋なノイズでした。

そして当然ながら、「正解」からの距離も少しだけ遠くなります

シーンそのまま2つとも足した
屋内2.1972.255(+0.058)
0.6890.858(+0.169
光源60個の部屋1.6491.707(+0.059)

街の+0.169は、もとの値が0.689なので4分の1ほど悪化していることになります。絶対値としては小さいのですが、「まったくのタダ」ではありませんでした。

⚠今回測れていないこと
ここで見ているのは静止画1枚の差です。切り上げによって残ったノイズがフレームごとに違う場所に出ると、静止画では分からなくても動画ではチラつきとして見えることがあります。今回は連番でこの2つの設定を測っていないので、そこは分かりません。連番を焼くときは、まず数フレームだけ試して確かめるのが安全だと思います。

まとめると、2つの設定は「同じ性格のタダ」ではありませんでした

  • ノイズ除去のGPU化… 最大でも1階調差。本当にタダで、いつでも入れてよい
  • しきい値を緩める… 見た目では分からないが、反射・屈折の面にノイズが残り、わずかに暗くなる。下書きやプレビューなら気にしなくてよく、最終品質やアニメでは戻す判断もある

絵を犠牲にする側:Fast GIとコースティクス

ここからは「速いけれど絵が変わる」側です。単体でいちばん速いのはFast GIで、屋内1.89倍・光源60個の部屋では2.11倍でした。ただ——

Fast GIを有効にしたときの屋内シーンの変化
左=そのまま/右=Fast GI。1.89倍速いが、部屋の雰囲気がまるごと変わってしまう

ズレは+52.20。もはや別の絵です。跳ね返った先を近似で済ませるので、間接光で成り立っている屋内では成立しません。街では+5.09と比較的おとなしいので、屋外の遠景なら選択肢になるという切り分けになりそうです。

コースティクスを切る設定も見てみます。こちらは屋内で1.16倍・ズレ+15.31でした。

ガラス球まわりの拡大比較
ガラス球の足元。中央=コースティクスを切ると、集光の模様がきれいに消える

ガラス球の下にできていた明るい模様が消えています。ガラスや水が主役のシーンでは切れませんが、逆にガラスが1つも無いシーンなら切っても何も起きません(街ではズレ+0.63でした)。

⚠効くと思ったのに効かなかったもの

今回いちばん意外だったのは、効くと思っていたのに効かなかったものが多かったことです。

設定屋内絵の変化結論
バウンス 12→41.05倍+1.24ほぼ速くならないのに劣化する
Persistent Data1.02倍±0静止画では効かない
スクランブル距離の自動調整1.01倍±0効かない
ぼかしの上限を上げる1.01倍+0.06効かない
タイルを2048→5120.96倍±0むしろ遅い

バウンスを減らすのは、いちばん有名な高速化だと思います。ところが12回を4回にしても1.05倍にしかなりません。それでいて絵は変わります(ズレ+1.24)。この規模のシーンでは、やる意味が薄いという結果でした。

Blenderのライトパス設定パネル
バウンス数やコースティクスはこのあたりにある。触りたくなる設定が並んでいるが、効き方は測ってみないと分からない

そしてタイル分割は3つのシーンすべてで一貫して遅くなりました(0.96〜0.98倍)。タイルは本来メモリが足りないときの機能なので、1280×720程度では区切るだけ損、ということだと思います。

★ライトツリーは何灯から得になるのか

ライトツリーは、今回いちばん粘って調べたところです。

光源が多いときに効く仕組みなので、そのために光源60個の部屋を用意しました。ところが結果は逆で、切ったほうが1.10倍速いのです。

ライトツリーのオンオフ比較と差分の強調
左=ON/中=OFF/右=2枚の差を10倍に強調したもの。OFFのほうが速いが、ノイズが増えている

ただし同じサンプル数での比較なので、これは「速い」というより「その分だけ品質を落としている」と読むほうが正確です。差を10倍に強調した右の絵を見ると、ノイズが増えているのが分かります。

では何灯なら得になるのか。灯数を増やして測っていきました。

ライトツリーは何灯から得になるのか縦軸=ツリーON ÷ ツリーOFF の時間比。1.0を割れば「ONのほうが速い」0.981.001.051.101.13ここを割ればONが得61灯301灯1201灯5001灯1.1001.1001.0331.013差は縮むものの、5000灯でも1.0を割りませんでした(同じサンプル数での比較)。

5000灯まで測っても、一度も逆転しませんでした。差は確実に縮んでいるので(1.100→1.013)方向は合っているのですが、1.0を割りません。

★効かない理由の見立て
ライトツリーは「その場所の明るさに関係ない光源を捨てる」ための仕組みです。ところが今回のシーンは、6m×5m×3mの部屋の天井付近に光源を詰め込んでいます。つまり部屋のどこから見ても、ほぼ全部の光源が「関係あり」になり、捨てられるものがありません。それでいてツリーを作って辿るコストだけは乗るので、常に少し損をする、という理屈です。
→ ★効き目を決めるのは灯数ではなく「光源が散らばっていて、大半が無関係になるか」。広い街に街灯を撒いたようなシーンなら、少ない灯数でも逆転する可能性があります。

5000灯を測るのに11分かかりましたが、「何灯からか」を追いかけたら「灯数の問題ではなかった」に行き着いたのは、測ってみないと分からないことでした。

装置の話:RTコアは思ったほど効かなかった

設定の話から少し離れて、装置そのものも比べました。今回の検証機は、ミニPC本体(Ryzen 7840HS+内蔵Radeon 780M)にRTX 3060を外付けした構成なので、1台で4通り試せます

同じ1台で装置だけを変えると(屋内シーン)ミニPC本体(Ryzen 7840HS+内蔵780M)に RTX 3060 をOCuLinkで外付けした構成OptiX(RTX 3060)7.78秒1.00CUDA(RTX 3060)9.24秒1.19倍CPU(7840HS・16スレッド)36.09秒4.6倍HIP(内蔵 Radeon 780M)45.17秒5.8倍★内蔵GPUとCPUがほぼ互角。OptiXとCUDAの差は1.19倍で「桁が違う」ではありませんでした。
BlenderのプリファレンスでOptiXを選んだ画面
どの装置を使うかはプリファレンスで切り替える。同じ1台にOptiX・CUDA・HIPの3つが並ぶ

ここでもeightの予想は外れました。

  • OptiXとCUDAの差は1.19倍。ノイズ除去の固定費を引いても1.27倍で、「RTコアで桁が違う」ではありませんでした
  • CPUとの差も4.6倍どまり。16スレッドのCPUは思ったより健闘します
  • 内蔵GPUとCPUがほぼ互角。屋内ではCPUのほうが速いくらいでした

「GPUで焼けば劇的に速い」というイメージがありましたが、少なくともこの規模では数倍のオーダーです。そして内蔵GPUはCPUの代わりにはなるが、それ以上ではないという位置づけが見えました。

Persistent Dataは連番でも2.6〜5.2%

Persistent Dataは、連番を焼くときにフレームごとの下ごしらえを使い回す設定です。静止画では効かないはず、と見込んでいました。

実際、静止画では±0でした。では連番ではどうか。24フレーム焼いて比べます。

シーンOFFON短縮
屋内186.97秒182.20秒2.6%
117.88秒111.76秒5.2%

方向としては見込みどおりですが、効き幅は小さいという結果でした。「1枚目だけ遅くて2枚目から速くなる」という挙動も見えません。

理由は分かりやすくて、今回のシーンはジオメトリが軽く、フレーム間で作り直すものが少ないからです。重いモディファイアやパーティクルを積んだシーンなら差が開くはずなので、Persistent Dataが効くのは「下ごしらえが重いシーン」という条件付きの結論になります。

★結局どうすればいいか

11個を測り終えて、eightの中では手順が決まりました。

順番やること効果
1ノイズ除去をGPUで走らせる(チェック1つ)1.22〜1.65倍・最大1階調差=本当にタダ
2アダプティブのしきい値を0.01→0.05合わせて1.71〜2.85倍。ただし反射・屈折の面にノイズが残る
3ガラスや水が無いならコースティクスを切る1.05〜1.16倍(絵に影響が無いことを確認してから)
4屋外の遠景ならFast GIも検討1.21倍。屋内では使えない
触らなくてよい:バウンス数・タイル・スクランブル・ぼかし上限効かないか、むしろ遅い

1は無条件に入れてよい設定です(最大でも1階調しか変わりません)。2は下書き・プレビュー・確認用の連番なら迷わず入れてよく、最終品質では戻すかどうかを絵で判断する——という使い分けになりました。3以降はシーンによって効き方が変わるので、絵を見ながら判断することになります。

そして今回いちばん実感したのは、「速くなった」と「品質を落とした」を分けて見ないと、設定の良し悪しは判断できないということでした。Fast GIは確かに1.89倍速いのですが、あの絵を受け入れられるかは別の話です。両方を並べて初めて、選べるようになります😊

まとめ

今回わかったことをまとめます。

  • 絵をほとんど変えずに速くなったのは11のうち2つだけ:「ノイズ除去をGPUで」と「アダプティブのしきい値を緩める」
  • その2つだけで屋内1.71倍・街2.85倍・光源60個の部屋1.97倍。絵のズレの増加は+0.06〜+0.17で見て分からない程度
  • 掛け算より得になる(1.32×1.21=1.60の見込みに対し1.71倍)。2つが別の場所から時間を削っているため
  • ノイズ除去の固定費は設定1つで7分の1になる(+2.26秒→+0.32秒)。前回「約2.6秒の固定費」と書いたが、正確には「既定のままなら」だった
  • Fast GIは単体最速(1.89倍)だが屋内では絵が壊れる(ズレ+52.20)。街なら+5.09で選択肢になる
  • バウンス12→4はほとんど効かない(1.05倍)のに劣化する。タイル分割は3シーンとも一貫して遅い
  • ライトツリーは5000灯まで測っても逆転しなかった。効き目を決めるのは灯数ではなく光源の散らばり方らしい
  • OptiXとCUDAの差は1.19倍、CPUとも4.6倍どまり。内蔵GPUとCPUはほぼ互角
  • Persistent Dataは連番で2.6〜5.2%。効くのは下ごしらえが重いシーン
  • 「絵は変わらない」も画素単位で見ると2種類あった。ノイズ除去のGPU化は最大1階調差=本当にタダだが、しきい値を緩めるほうは反射・屈折の面にノイズが残り、屋内でわずかに暗くなる(−0.31階調)
  • 残ったノイズが動画でチラつくかは今回測っていない。連番を焼くときは数フレーム試してから
  • 「速くなった」と「品質を落とした」を分けて見ないと、良い設定かどうかは判断できない

調べる前は「速くする設定がたくさんあって、どれから手を付ければいいか分からない」と思っていました。測ってみたらほとんどは効かないか、品質と引き換えで、残ったのは2つだけ。選択肢が減ったことがいちばんの収穫でした😊

そしてもうひとつ。平均の数字が小さいことと、どこも変わっていないことは別でした。今回いちばん勉強になったのは、差がどこに出ているかを見に行くと、その設定が何をしているのかが分かるということです。反射する球にノイズが残っていたおかげで、アダプティブサンプリングが何を切り上げているのかが腑に落ちました。

今回使ったシーンと計測スクリプトはBlenderのPython APIだけで書いてあります。設定を1つずつ切り替えて時間と絵を記録する仕組みなので、手元のシーンに差し替えれば同じ表が作れると思います。

それでは、今回はここまで。最後までありがとうございました😊