《こちらは2018年 Blender Advent Calender 参加記事です》
さて、気になるタイトルですね。
私にとって十数年のあいだ気になっていた疑問が、今年になって溶けたことがあったのです。
今まで様々なレンダラーを使用してきましたが、いわゆる『物理的に正確』と言われるものが持っている表現上のある死角について、ずっと気になっていました。
それは、ガラスの表現です。
コースティクスの話ではありません。コースティクスについてはもうレンダラーの作りの問題ですので、気にしても仕方がありません。
(良いフェイクの方法も各種ありますし)
もっと基本的なことです。
こんな画像、見たことがありますか?
スザンヌでしょ? それが何か?
じゃなくて、質感です。スザンヌはガラス、奥のシリンダーはグロッシーなメタルです。でも、何かがおかしいと思いませんか?
そう、スザンヌの中の黒ずみはまだガラスだから納得いきそうな部分があるとしても、シリンダーの側面にある真っ黒い部分はおかしくありませんか?
周囲は物理スカイで囲まれており、真っ黒な場所など全くありません。金属反射の中に真っ黒なものがある理由はないはずです。
この現象、CyclesだけではなくMaxwell Renderなどでも起こります。ずっと忘れていたのですが、先日たまたま困っている人がいたことで思い出して、ガラスシェーダーのことをWEBで調べていました。すると、Cyclesシェーダーの不具合じゃないかと(過去に)海外で話題になっていたものを見つけたり、「ガラスの表現がどうしても上手くいかない」と嘆いている人を見つけたりしました。
そこで言われていた解決法は、従来型のレイトレーサーにおけるガラス表現の向上法でした。
つまり、
「透過のレイを出来る限り増やせ」
「レイが届かない時の色(=エンドカラー)を設定せよ」というもの。
グリーングラスなどの場合、エンドカラーを深緑や環境色に設定することで透過の屈折が足りない部分を誤魔化すことが出来ますが、Cyclesでは少々シェーダーノードに手を入れないとエンドカラーの設定は出来ません(それを解説をしている人もいましたが、私には少々ハードルが高いものでした)。それより何より、「Lightpaths」で「Transparency」をやたらと増やしたり、「Glossy」のバウンスを増やしたりしても、この黒ずみに対する改善効果はないのです!
「Glossy」のバウンス数を100以上、150程度まで上げると黒ずみが解消されます。レンダリング時間にもさほど影響はないようです。下記の方法も有効ですが、簡単に黒ずみを解消する方法として、Glossyの値を大きく増やすのが良いでしょう。《2020年11月追記》
それに、問題が起こるのは透過だけでなく、メタルの質感も同様なのです。そこにはまた別の問題と解決方法が、あるはずなのです。
──そろそろ勿体ぶるのはやめますか(笑
15年ほど前にSubdivisionサーフェスが登場して以来、CGにおける滑らかな形状の表現は飛躍的に向上しました。ただ、それと並行して従来の法線スムージングによる疑似的な滑らかさの表現もそのまま残りました。それは当然ですよね。ゲームなどのリアルタイムCGでは様々な再生端末やネットワーク帯域上のボトルネックもあり、ポリゴン数を少なく抑える方がいいという事情に変わりはないのですから。
そこで、法線スムージングの問題が起こることになったわけだと思います。
要するに、次の画像と同じ(全く同じではありませんが)問題が、Cyclesのレンダリングでも起こるわけです。
先ほどのレンダリング画像は、シリンダーをスムージングした上で「EdgeSplit」モディファイアを掛けることでエッジを立てています。「EdgeSplit」を外すと次のような結果が待っていることは、誰でも想像が付くことですね。
シリンダー天面のエッジが消え、無理やりスムーズシェーディングを掛けた結果として、《現実世界ではあり得ない黒ずみ》が発生しています。マテリアルをガラスにしていると、
「光が屈折しあって暗くなる領域があるのだからそんなものか」と考えてしまいがちですが、この現象と同じだったのですね。
少し実験をしてみましたので、結果を報告しますね。
スザンヌやシリンダーのようなソリッド形状ではなく、ワイングラスです。
画像の中の文字は判別出来ますでしょうか。センターの手前、青い文字で説明を書いているグラスが、ほぼ理想的な見え方です。曲面に厚みがあって複雑な屈折をする部分では黒っぽい部分がわずかにあり、それ以外には不自然な要素はありません。
フラットシェーディングになっているのはもう2つ、後列のものです。左はポリゴンではなくカーブを回転体にしたもの。右はポリゴンです。どちらも面の角は目立ってしまいますが、明らかに不自然な黒ずみはありません。手前の左右にあるスムーズシェーディングの2つは、トップ部分が妙に黒ずんでいます。
2脚だけをアップでレンダリングしてみました。左右ともスムーズシェーディングを掛けた状態にしています。
どちらのグラスも見た目の曲面は十分にきれいですが、実際のポリゴン数は右の方が遥かに多いものです。もう1つ、見て下さい。次は、左右で同じポリゴン数でシェーディングのみの違いです。黒ずみはどうなるでしょう?
ね、同じ条件だと違いが顕著ですね。さすがにカットガラスでもない限りフラットシェーディングでは絵になりませんが、グラスの表現で黒ずみを抑えたかったら、嘘のシェーディングをなくす、つまり、実際の法線とシェーディングによって滑らかにされる法線の角度を出来る近づけることです。もっと簡単にいえば、法線スムージングで作られる滑らかな面と同じくらい滑らかにポリゴンを分割することです。
【改めて結論】
・ガラスの黒ずみは透過のレイが足りないのではない。ましてやエンドカラーを設定しても意味はない。原因は、実際の面法線とは異なるスムーズシェーディングによる法線にある。
+足りないのはGlossyのレイ。ただし、ちょっとばかり増やしても効果はない。形状によるが、ワイングラスのようなものなら150程度にすると劇的に改善する《2020年11月追記》
【具体的な解決方法】
・面を分割すること、これに尽きる。Subdivision Surfaceを掛けられるオブジェクトなら、レンダリング時に 独立した面法線が判別出来ない程度に細かくSubdivisionすること、です。
最後に、スザンヌ(Subdivision=4、スムーズシェーディング)とシリンダー(曲面の分割=256面、フラットシェーディング)をレンダリングしたものをどうぞ。
これでもう、
「ガラスがどうしても黒くなる!」
なんていう悩みで眠れないことはなくなりますね!
皆さまの制作に、少しでもご参考になれば幸いでございます。
あ、そうそう、これはもう偶然の賜物としか言いようがないのですが、私の著書である『Blender99 きっと絶対に挫折しない3DCG入門』のシリーズ最終巻が、ちょうど12/9発売なのですよ!
いや、もう本当に狙ってませんから。偶然の一致です。
当ブログ記事は12/9になると同時の公開ですが、Blender99は12/9の陽が暮れる頃に発売されるのではないかと思います……。
じゃ、今日はこんなところで!
!!!!! Happpppy Blending !!!!!
Blender Advent Calender 2018、次はgotz_zampachさんの『コンポジットノードは怖くない!小学校数学と実践VFXで基本から理解!』です。
(あ、これちょうどBlender99の最終巻でも少し触れている内容と近いかもしれません……。)