ガラスのコップの底にできる光の模様、水面越しに差し込む光の揺らぎ…、きらめく光のパターンが美しく、CGをやるなら一度は表現してみたい現象ですよね。これらは「コースティクス(caustics)」と呼ばれる現象で、現実の光のふるまいを再現するうえでも欠かせない要素です。
Blenderでもこのコースティクスを美しく表現することは可能ですが、Cyclesレンダーで正確に出すにはいくつかのポイントを押さえる必要があります。(※デフォルトのBlenderの機能、レンダーエンジンはCyclesで再現します。)
本記事では、コースティクスの現象そのものの簡単な解説から、Blenderでリアルに再現するための具体的な設定手順・注意点まで、丁寧に解説していきます。
この記事は、Blenderのコースティクス設定について解説した初心者~中級者向けの記事です。
難易度
※記事内で使用しているのはBlenderのバージョン4.4です。古いものだと設定項目がなかったり、出力結果が同様に出ないことがありますので注意してください。
コースティクスとは?集光によって生まれる光の模様
コースティクスとは?
私たちが日常でよく目にするコースティクスとは、光が集まることでできる明るい模様のことです。
たとえば、晴れた日にガラスのコップをテーブルに置くと、底の周りにキラキラした輪のような光が現れることがあります。これがコースティクス(caustics)と呼ばれる現象です。
この現象の鍵となるのが、集光(しゅうこう)です。

コースティクスは「光が集まる」ことで生まれる
光は、物体に当たったときにさまざまなふるまいをします。特に、透明なガラスや水のような屈折性のある素材や、曲面を持つ反射面では、光が一点や一部に集中するように曲げられることがあります。
思い浮かべやすい例としては、虫眼鏡で太陽光を集めて焦点を作り、紙を焦がす現象があります。
このように、光が一点に集まる現象を集光と呼びます。
この集まった光が、床や壁などの他の面に投影されることで、明るい模様が浮かび上がるのです。
つまり、コースティクスとは集光が可視化されたものとも言えます。
例えば、右の画像の川底の揺れる光の帯は、水面の波がレンズのように働き、太陽光を動的に集光することで、模様が常に揺らめいて見えます。


CGでは「コースティクス=見える集光」
CGやBlenderのレンダリングにおいてコースティクスと言うと、単に光を集めるだけでなく、その光が作る模様をリアルに描画する技術や表現を指します。
つまり、Blenderでコースティクスを再現するということは、集光による光の模様を、物理的に正確に、かつ美しく表現することになります。
Blenderでコースティクス表現をすることについて
Cyclesでコースティクスは難しい?
Cyclesは、光の経路をシミュレートするパストレーシングという方式でレンダリングしていますが、実はコースティクス(集光による明るい模様)の再現は少し苦手です。
その理由は、コースティクスのように特定の場所に光が集中する現象は、非常に限られた光の経路でしか発生しないため、通常のランダムサンプリングではなかなか正確に捉えられないからです。結果として、ノイズが多くなったり、模様がぼやけたりします。
さらにBlenderのデフォルト設定では、Filter Glossyなどのノイズ軽減機能が有効になっており、これが極端に明るい部分をあえてぼかして滑らかにするため、コースティクスのようなシャープな光模様が表れにくくなっています。
完全にノイズ除去の効果をなくすことはできませんが、Filter Glossyを無効化したり、Denoiseの設定を見直すことで、よりリアルなコースティクスを得ることができます。
ちなみに完璧なコースティクスを得ようとすると難しいため、アドオンを使ったりLuxCoreRenderなどのレンダーエンジンを導入してコースティクス表現をする方法もあります。また、ライトパスノードで影部分をほぼ自分で作ってしまうような表現手法もありますが、それらについては今回は触れません。
パストレーシング、ノイズについて書いている記事もありますので興味ある方は読んでみてください↓
次のセクションでは、具体的な設定手順を紹介していきます。
コースティクス表現の準備
レンダーエンジンはCyclesでGPUを使います。※コースティクスのレンダリングはかなり時間がかかります。
オブジェクト
コースティクスを表現するため、いろんなオブジェクトを用意しました。
コースティクスは、オブジェクトの形も重要です。複雑な光のパターンを出したい場合は、オブジェクトにも凹凸を入れることが重要だし、色をつけたり、厚みを変えてみたりすると、様々なコースティクスを見ることができます。
真ん中の透明なコップと、オレンジ色の台形の容器には水のオブジェクトが入っています。

形を作るポイント
- コップは口の方にループカットを入れておく
- 水とコップの間に隙間ができないようにする
- Shade SmoothかShade Auto Smoothを必ずかける
マテリアル
基本的にGlass BSDFを使い、ラフネスを0近くまで下げてIORを1.45にしています。1.45〜1.52が基本的なガラスのIORです。あとは色を自由につけます。
ガラスマテリアルについては以下の記事で詳しく解説しています。↓
水の場合はIORを1.33にしています。

床はデフォルトのPrincipled BSDFのラフネスを1近くまであげています。
ライト
ワールド設定で、Sky Textureを使います。(これでないとダメということはなく、他のライトでもコースティクスは出ます)
ポイントはSun Sizeを3.24°と小さめにしていることです。他のライトを使うときにも、SpreadやAngleを小さくすることが重要です。

例えば上の図はライト(Sun)のAngleを1°、5°、30°と変化させたものですが、値が小さすぎるとコースティクスの光も広がらず、大きすぎると影も光も分散しすぎてしまいます。

上図のパラメータなどを参考にしてやってみてください。
コースティクスを表現するための設定
デフォルト状態
若干影の上にオブジェクトの色や、光が落ちていますが、ぼやけすぎています。これはノイズ除去の設定が効いている状態です。

ノイズ除去の設定をOFFにしていく
レンダープロパティ > Light Paths の中の設定を変更します。
Clamping(クランピング)
レンダリング中に、極端に明るい光を制限する機能です。
これによって、ノイズ(特にファイアフライと呼ばれる白い点)を減らすことができますが、明るい光もカットされてしまいます。
Indirect Light(間接光)の上限を1000に上げます。
(0にすると∞まで明るい光を許容しますが、ファイアフライ(白点)やアーティファクトが出てくるのである程度で止めた方がいいです)
Filter Glossy
ノイズ除去のための一つの機能で、極端に明るい点をぼかしていきます。デフォルトでは1.0という強さでかかっているため0にします。

サンプル数4096、ノイズ閾値0.01
この二つのノイズ除去機能をオフにしただけで右図のようにコースティクスが出てきました。これはパストレーシングによってできた模様ですが、コースティクスを作るには、サンプル数が少なすぎて(右図はサンプル数4096)ぼやけたような表現になっています。

サンプル数10000、ノイズ閾値0.001
サンプル数を上げてノイズ閾値を0.001に下げるとと若干ですがはっきりしてきます。


サンプル数4096、ノイズ閾値0.01
ちなみにCPUでのレンダリングもやってみました。昔はCPUレンダリングの方が正確にパストレーシングできると言われたこともあったようですが、現在GPUも高性能になっており、あまり変わらないようです…。

Shadow Caustics(影の中のコースティクス)の設定
Blenderのバージョン3.2でShadow Causticsというコースティクス表現を補強する機能ができました。
これはMNEE(Manifold Next Event Estimation)という技術を使用して、屈折オブジェクトを通した影の中にできるコースティクスを効率よく再現します。※その他の、反射、影の外のコースティクスはレンダリングされません
この機能を使いコースティクスをレンダリングしてみます。
設定の仕方
❶ライトやワールドシェーダーでShadow Causticsを有効にします
Sky TextureやHDRI背景画像を光源として使いたい場合はSettings メニューの中にShadow Causticsがあるのでチェックします。

ライトを光源として使う場合もShadow Causticsという項目があるのでチェックします。(どのライトにもあります)

❷オブジェクトにShadow Causticsの設定をつけます
コップや透過する水などのオブジェクト
オブジェクトを選択し、オブジェクトプロパティ > Shading > Caustics の Cast Shadow Causticsにチェックをします。
このオブジェクトが光を曲げてコースティクスを作り出す(Caster)ものだとマークします。

床などのオブジェクト
その下のReceive Shadow Causticsにチェックします。
このオブジェクトがコースティクスの光を受け取る(Receiver)面だとマークします。

Shadow Caustics レンダリング結果
左:Clamping, Filter Glossyのノイズ除去機能をオフにしたパストレーシングでできたコースティクス
右:Clamping, Filter Glossyのノイズ除去機能をオフ+Shadow Causticsで作った影の中のコースティクス
※下はどちらもサンプル数4096です。

結構コースティクスの模様が違ってきます。Shadow Causticsが機能している方がコントラストも高く鮮明ですが、他の間接光や反射光の結果がなくなるので影の形がはっきりしすぎている気がします。
また、真ん中上側の水が入ったコップは、Shadow Causticsがオフになってた方がコースティクスが見えていていい感じです。(真ん中のコップと水だけShadow Causticsをオフにすることで、そこだけパストレーシングでのコースティクス(左側の画像)が得られます。)
せっかくだから、この二つの画像を合成することで、よりリアルでキレイなコースティクスを作りましょう。少し上級者向けなので、難しくてわからん、と言う方はとりあえずここまでやって、綺麗な方のレンダリング結果を選ぶようにしましょう。
コンポジットで2つのコースティクスを合成する
準備
まずは現在のScene(シーン)をFull Copy(フルコピー)したものをあと2つ作り、全部で3つシーンを作成します
❶Shadow Causticsをオンにして影の中のコースティクスを出力したシーン

❷Shadow Causticsをオフにしてパストレーシングでのコースティクスのみにしたシーン
床のReceive Shadow CausticsをオフにするとShadow Causticsが消えます。

❸コースティクス機能をオフにして全くコースティクスがない画像
レンダープロパティのLight Paths > CausticsのReflectiveとRefractiveのチェックを外すとコースティクスが全てなくなります。


シーンの使い方については詳しく記事を書いてますので参考にしてみてください↓
コンポジット作業
Render Layersノードで3つのシーンそれぞれ出力します。
❷のパストレーシングで出たコースティクスと❸の何も出てない画像の差分をMixノードのDifferenceで出力してみます。

これを、❶の影の中のコースティクスに加算すればいいだけです。
ほんの少しFilter ノードでシャープにしたり、他にもいろいろ好きに効果をかけたり色調整もできます。
あとはMix ノードのAddで❶と加算して、好きな濃さに調整します。

完成‼

影も濃すぎず、コースティクスもぼやけすぎず、綺麗に出ていると思います。3枚レンダリングしなければならず、結構手間で時間はかかりますが、アドオンを使ったり他のレンダーエンジンを使わなくてもBlenderのデフォルト機能でここまで綺麗にコースティクスが表現できるのはすごく進化していると思います。
あとはコンポジットで自分の好きなように調整してみてください。
※サンプル数について、基本的にコースティクスはサンプル数が高いほど綺麗に出ますが、2つのコースティクスを合成するならサンプル数4096でも上の画像くらい綺麗に出ます。
水面コースティクス
水面を作り、その水底にコースティクスを作ることができます。
右図はSky Textureを光源とし、Shadow Causticsのみを使ってコースティクスをレンダリングしています。
水面がゆらめくアニメも作れますが、サンプル数を下げるなど工夫しないとかなり時間がかかります。(右図はサンプル数512)

おまけ注釈(Notes)
自分用のメモなので別に読まなくていいです。Shadow Causticsは様々な制限があるのでそれを書いておきます。
MNEEには以下のような制限があります
- 「影の中の屈折コースティクス」のみが対象
- 反射によるコースティクスや、影の外に落ちるコースティクス
→ MNEEではレンダリングされません。
- 反射によるコースティクスや、影の外に落ちるコースティクス
- MNEEはあくまで近似なので「物理的に正確ではない」
- 明るさがおかしい、曲面やラフな材質によるコースティクスが正しく出ない
- 複雑なマテリアルでは制限あり
- 複数の「屈折BSDF(Glass, Transmissionなど)」がある場合、MNEEはそのうち1つだけに対してしか動作しません
- Filter Glossy 設定は無視される
- コースティクスに関しては、Filter Glossy の影響を受けません。
- MNEEレイは最大6つのCaster表面を通過可能
- 光線が「Casterとしてマークされた面」を6回まで通過できますが、それを超えるとコースティクスは計算されなくなります。
- 以下のノードは使えない/正しく動作しない
- Ambient Occlusion(AO)
- Bevel
→ コースティクスを使うシーンでは、これらのノードの結果は正しくならない。
- 滑らかな法線が必須
- Casterはスムーズシェーディング(Smooth Normals)になっている必要があります。
- ボリュームマテリアルは考慮されない
- たとえば煙や霧などの「ボリューム」を通るコースティクスはMNEEでは無視される。
- バンプ・ノーマルマップも無視される
- コースティクス計算時には、ノーマルマップの凹凸は考慮されません。