-Blenderその他-

x. 半透明風味マテリアル

Eevee レンダラーにはレンダリング品質を決める samples というパラメータがあります。
これが何をしているのかというと、少しづつ状態の違うレンダリングを繰り返して、平均を取ることで画質を高めるということをしています。
この性質を利用した少し変わった表現の仕方を解説します。

■ サンプリング

Eeveeの設定で、サンプリング数を1にしてみ見ます。
効果をはっきり見るために、ビューポートデノイズも切って見ましょう。
補助線にはアンチエイリアスがかかって滑らかに見えているのに、レンダリング画面はジャギーがのっていることがわかります。 実は、これが本来の Eeveeによる1回のレンダリング品質です。
サンプル数を上げると、ほんの少しだけ条件の違うレンダリングを行って、平均化が行われます。
2〜4程度にすると、少しずつジャギーが減って品質がよくなることがわかります。

デフォルトでは、プレビューで8、レンダリングで64になっていますが、これぐらいにするとたいていの場合は充分にきれいになります。
もっともこのサンプリングの効果が分かりやすいのは、半透明なマテリアルのアルファハッシュ表示です。

Eeveeのようなリアルタイム表示は、半透明の描画を苦手とします。
奥の物体の色がわからないと、その手前に半透明の物を置いたときの混ざった色がわからないためです。
前後関係をいちいち確認しながら描画していては、せっかくの高速描画の意味がなくなってしまいます。
そこで、アルファハッシュでは、1ピクセルごとに、透明か、不透明かのどちらかであるとします。

サンプル数が1のときは、ディザが乗ったような表示になります。
ところが、サンプル数を増やして、このディザの表示の仕方の違う画面を平均化していくと…
いつの間にか滑らかに半透明が表示されるようになって行きます。

ただ、半透明は、Eeveeが苦手な分野なので、128〜512ぐらいのサンプル数が必要なときがあります。
(透明度や色のコントラストで適切な値は変わってきます)

■ テクスチャのぼかし

ここで、チェッカー模様に変形をかけたマテリアルを作成してみましょう。
このぼかしの理屈は、かぴばらさんの、blender2.81 eeveeのシェーダノードでぼかしシェーダをつくるに(ノードも日本語で解説が)のっています。

前準備として、似たようなぼかしノードを作ってみます。
(ちょっと違うところもあるかも知れません)

ここで作ったノードは次のようになります。


マッピングによって、変形させた位置を、チェッカーのテクスチャに与えています。
変形はノイズテクスチャの色を使っていますが、色なので範囲が0-1になってしまうところを、-0.5を足して [-0.5 : +0.5] の範囲になるようにしています。
その後さらに 0.5 をかけて、揺らぎの程度を制御しています。

ゆらゆらとゆれたチェッカー模様になりました。
ここで、闇雲にノイズテクスチャのスケールの値を大きくしてみます。
本当はあるパターンで変形されるのですが、スケール値が大きいので、ほとんどランダムな変形に近くなります。
サンプル数1で表示をすると、このようにディザになるわけですが…
サンプル数を上げれば、滑らかになります。
実質的にノード上でテクスチャにノイズをかけたような効果になりました!

実は、このテクニックは、Cyclesでレンダリングするときにノードでテクスチャにぼかしをかける方法として、
「まぁそんな方法もあるよねー」
程度には知られていたのですが、大きなサンプル数が必要ということで、かなり使用できる状況の限定されたテクニックでした。
表示速度の速いEevee上で似たことを行うことで、現実的なぼかし手段になっています。

■ 視線方向のぼかし

上のぼかしの方法は、ノイズテクスチャの情報を使って、チェッカーテクスチャを全方向にぼかしていました。
ここで、カメラからの視線方向に対してぼかしを入れることを考えて見ます。
カメラからの視線方向は、Incomingというソケットから得ることができます。



先ほどは、xyz方向のランダムな値を得るために、ノイズの色情報を使いました。
同様の理屈を今度はノイズの色ではなくてFacの値で行ってみます。

ノイズテクスチャで得た[-0.5 : +0.5]の範囲のノイズの値を、さらに絶対値を取ることで 0:0.5 の範囲にします。
これを、Incoming に対して掛け合わせます。
(Incomingは、物からカメラの方向なので、カメラから物の方向にするためにマイナスをかけています)

すると、表面から視線方向にめり込んだ位置の色情報が混ざってくることになります。
そのため、表面が少しだけ半透明で、奥の色の影響を受けているような表現ができます。
このとき、コピーしたチェッカーテクスチャと、Greater Than や Lesser Than を使って、ぼけが発生するかしないか変えられるようにしてみます。
場所によって、0 か 1 の値になるようにして、ぼかしの量に掛け合わせます。
この場合は、タイルの黒い部分ではぼかしが入らず、白いところだけは表面より奥の色情報が見えるようになるので、まるで黒と半透明の白いタイルのような表現になりました。
ぼかすかどうかの判定は、表面だけで行っています。 そのため、タイルの四隅は少しおかしなことになるのですが、床のドアップなどではなく、さりげなく使っているマテリアルであればなおそらく大丈夫でしょう。

この表現は、レイトレースをノード上で行なう、ということと少し似ています。
本来のレイトレースは、表面からさらに奥の情報を、手前から奥にむけて順番に探っていくのですが、Eeveeのノード上ではそれはできません。
そこで、代わりランダムに奥の色情報を得て、平均化することで、なんちゃってレイトレースをしていることになります。

(本来のレイトレースであれば、「障害物があるのでここでレイトレースを終了する」という判定ができるのですが、
それができないので、タイルの4すみで少し無理がでていることになっているわけです)

この記事は、Advent Calender 2019用に、急遽書きました^ ^);

追記:注意点やそのほかの例など

今回は3次元のテクスチャの例としてチェッカー模様を使いましたが、
チェッカーの区切りと、オブジェクトの面が重なると、ぼかしても黒と白が混じってただの灰色になってしまいす。
原点に置いた板とか、デフォルトキューブとかは、ちょうどチェッカー模様の区切りになります。
(左の例は上の面を少しずらしています)
もっと大きくぼかしを入れることで、もっと奥の方まで中の見えるようなマテリアルにすることも一応は可能です。
ただ、本当の内部でどのように光が進むか計算するレイトレースと違って、ただぼかしているだけなので、なかなかちょうどよく見える感じにするのは難しいです。
この例は、ボロノイをもとに作った星模様ですが、黒と混ざってもちょうどよく見えるように、星の明るさを大きく調整しています。

※回転している動画のように、オブジェクトの回転に対応するには、オブジェクトと一緒に回る系で計算するための Vector Transform ノードを組み込必要があります。

inserted by FC2 system