【Blender】【Cycles】Cyclesでノイズを防ぐ方法の総まとめ

BlenderのCyclesでノイズを削減する方法をまとめてみました。

Blender 2.79

はじめに

本記事は基本的に下記のマニュアルの内容を自分なりにまとめたものとなります。

docs.blender.org

また、Cyclesでノイズが生まれる理由については下記の記事にまとめています。
こちらを一読してから本記事を読むことをお勧めします。

light11.hatenadiary.com

またそもそもパストレーシングとは?という話は下記にまとめています。

light11.hatenadiary.com

サンプリング数

基本的にサンプリング数を上げれば、ノイズは減ります。

f:id:halya_11:20190114180502p:plain

しかしサンプリング数を上げるとレンダリング時間が跳ね上がり、効率的ではありません。

さらに、ノイズが発生しやすい状況下ではサンプリング数を上げてもなかなかノイズが消えません。
そこで次節から説明するように、いろんな状況に応じて設定を行いノイズを減らしていきます。

レイが跳ね返る回数

パストレーシングでは、物体にレイが当たるたびにそこからさらにレイを飛ばします。

f:id:halya_11:20190114132159p:plain

このレイは毎回ランダムな方向に飛ばされるので、飛ばす回数が多いほど結果がバラつく確率が高くなります。
つまりレイが跳ね返る回数が多いほどノイズが発生しやすくなります。

Cyclesではこの跳ね返る回数の最小値と最大値を設定できます。

f:id:halya_11:20190114145849p:plain

この値を変えてみると次のような違いが現れます。

f:id:halya_11:20190114150149p:plain

MinとMaxを0にするとノイズは大幅に減ります。
しかし、間接光の影響がかなり不正確なものになっています。

このようにBouncesの設定は結果の正確さとノイズの少なさのトレードオフとなります。
そのため結果の正確さを失わない範囲でできるだけBouncesを低く設定する必要があります。

また、正確な結果を得るのに必要な跳ね返り回数は材質により異なります。
例えば反射率の高い物体の場合、光が吸収されないので跳ね返り回数が多くないと正確な結果が得られません。
これに対して反射率の低い物体の場合は光が多く吸収されるので、跳ね返り回数が小さくても正確な結果が得られます。

そのためCyclesでは材質ごとに跳ね返りの数を設定できるようになっています。

f:id:halya_11:20190114151152p:plain

ちなみに、マテリアルのColorを設定する際にはRGBに0.8以上の値を設定しないことも重要です。
この値が低いほど光の波長を吸収し、高いほど吸収せず反射するという意味になります。
反射するということはすなわち跳ね返り回数が多くないと正確な結果が得られないということになります。

また、RGBが1、すなわち波長を全く吸収しない物質はあまり現実的ではありません。
明るく見える物質を作りたければライトの強さを大きく設定するべきです。

コースティクス

反射や屈折の結果として光が集まるとコースティクスと呼ばれる模様が現れます。
このように光が集まると、レンダリングしたい地点からは半球状の一部だけが非常に明るい状況が生まれます。

f:id:halya_11:20190113152020p:plain

このような状況下では下記の記事で説明したようにノイズが生まれやすくなります。

light11.hatenadiary.com

そのため、CyclesにはコースティクスのON/OFFを切り替えられる設定項目があります。

f:id:halya_11:20190114160530p:plain

これをOFFにするとコースティクスによるノイズは消えます。

f:id:halya_11:20190114160717p:plain

しかしながらOFFにしている分結果は不正確なものとなり、状況によっては違和感が生じます。
どうしてもコースティクスをONにしたままノイズを和らげたい場合には、Filter Glossyを使います。

f:id:halya_11:20190114160921p:plain

この値を大きくすると、半球状の非常に明るい一部分をぼかしてなじませます。

f:id:halya_11:20190114161120p:plain

この結果として、サンプリング結果のブレがなくなりノイズが軽減されます。

f:id:halya_11:20190114161312p:plain

ライトの減衰計算

ライトの減衰は1/(distance^2)という式で計算されています。
物体にライトが非常に近い場合には、この計算結果が無限大に近づいていくのでライトが非常に強くなってしまいます。
その結果、半球状の一部だけが明るい状態が現れてノイズを引き起こします。

f:id:halya_11:20190113152020p:plain

これはLight Falloffというノードを使うことで制御できます。
下記はライトとして使っているEmissionマテリアルに接続した図です。

f:id:halya_11:20190114162731p:plain

このノードのSmoothの値を上げていくと、ライトが物体の付近にある場合の最大強度を丸めることができます。
これにより計算結果のブレがなくなりノイズが軽減されます。

f:id:halya_11:20190114162955p:plain

多重重点的サンプリング

Emission系のマテリアルにはMultiple Importanceというオプションがあります。

f:id:halya_11:20190114163730p:plain

これを有効(デフォルト)にすると、このマテリアルをアサインしたオブジェクトに
直接的に届く光の軌道が、間接的に届くものよりもパストレーシング時に選択されやすくなります。

Emissionが強い場合にはこれをONにしておいたほうがノイズは少なくなります。

f:id:halya_11:20190114164227p:plain

しかしこのEmissionが弱くて他にもっとEmissionの強いオブジェクトがあるようなケースには、
このオプションによりEmissionが強いオブジェクトがサンプリングされづらくなるため、OFFにしておくべきです。

またこの設定項目はWorldの設定にもあります。

f:id:halya_11:20190114165059p:plain

これは太陽のような一部分だけ明るいテクスチャをIBLのために使うときにONにするとのことです。

ライトポータル

晴れの日の窓のある部屋のように、一部だけから外の光が差し込む箱を考えます。

f:id:halya_11:20190114171823p:plain

このような箱の中をレンダリングするときには、パストレーシングで光の入り口が見つかりづらく、
その結果ノイズが発生するという問題があります。

f:id:halya_11:20190114172053p:plain

このようなケースでは窓を穴として作るのではなく、窓と同じ大きさのエリアライトを作ります。
さらにPortalオプションにチェックを入れます。

f:id:halya_11:20190114172221p:plain

これで光の入り口が見つかりやすくなり、ノイズが軽減されます。

f:id:halya_11:20190114172346p:plain

ポストプロセスによるノイズ除去

上記の設定をいろいろ試しても残るノイズに関してはポストプロセスでごまかします。
有効にするにはRender LayerのDenoisingにチェックを入れます。

f:id:halya_11:20190114173848p:plain

下図ではかなり強めにDenoisingを掛けてみました。

f:id:halya_11:20190114173931p:plain

確かにノイズは除去されますが、全体的に詳細がぼけてしまうためあくまで最後の調整として使うべきかと思います。

Clamp設定

さらに最終手段的なノイズ除去の方法として、Sampling設定のClampがあります。

f:id:halya_11:20190114175146p:plain

これは各光線がピクセルに寄与する際の強さを丸めこみます。
ただしこの設定をきつくしすぎるとハイライトが消えるので、
Clamp Indirectのほうだけ設定するなどの工夫が必要そうです。

f:id:halya_11:20190114175409p:plain

参考サイト

docs.blender.org

関連

light11.hatenadiary.com

light11.hatenadiary.com