background

続・Superflyで大気効果。

2016年12月18日(Sun)

前回の続き。せっかくだから、反射物のあるシーンでもなんちゃって大気効果を使えるようにする。まずは適当にシーンを作ってレンダリング比較。

161218-01

さすがに水面のマテリアルはそのままだと厳しいね。

Superfly(というか元々のCyclesレンダラ)の残念な点として、ディスプレイスメントを頂点単位でしかかけられないという制約が挙げられる。メッシュの粗い板ポリゴンに解像度の高いテクスチャを適用しても、ざっくりカクカクとした形状にしかならない。サブディビジョンをかければ多少は細かくなるものの、マシンパワー的に限度がある。ポリゴンをシェーディングレート単位でマイクロポリゴンに分割して変位をかけるという、Fireflyは結構優秀だったのだ。

まあ、ないものは仕方ないので、ここは素直にノーマルマップにでもしてしまおう。

161218-02

さくっとノードを足して、高さの情報を引っ張ってくる。こういう時、ルートノードを複数持てるのがいいよね。

161218-03

強度にいい加減な値を入れたままだから揺らぎ具合が合ってないけど、まあぐっと水面っぽくなったかな。そんなわけで前回作った大気レイヤーを近景と遠景のマテリアルに追加する。

161218-04

反射像を見やすくするために、一旦ノーマルマップを切断している。水面に反射している遠景の山が見た目よりハッキリ映ってしまっているのがわかる。

では、その条件分岐を行っている部分にノードをちょこっと足す。

161218-05

全体のノードの配置を変えちゃったからわかりにくいけど、実際に繋ぎ直したのはこの部分。

161218-06

今まで端折ってたのでざっくり書くと、LightPathノードは今計算しているレイについての情報を取得するノードだ。例えばIs Camera Rayなら、今計算しているレイがカメラから発せられたレイであれば1を出力し、そうでなければ0を出力する。つまりカメラに直接映っている時だけ1となる。反射像や屈折、間接光の計算をしている時は0になる。Is Reflection Rayなら、反射像の計算をしている時だけ1になる。これを数値演算ノードで他のノードと掛け合わせると、カメラに直接映るっている時だけあるマテリアルを適用し、それ以外の時は0のまま、というような計算ができるわけだ。

細かい説明はたぶん「Blender Cycles LightPath」あたりで検索すると見つかると思う。

数値演算ノードのMaxは、値1と値2に接続された値を比較して、どちらか高い方の値を採用する。1と0の組み合わせなら、どちらかもしくは両方が1の時1を出力し、両方とも0の時だけ0を出力する。つまり論理演算でいうAND回路の計算をするわけだ。一度に3つ以上の値を比較することはできないから、そういう時はノードを階段状に組み合わせる。これで「カメラに直接写っている時、または反射時か屈折率を持つ透過体の計算をしている時」だけ、効果を適用することができる。

なんでこんな手間をかけて条件分岐をつけるのかというと、二次反射光の計算など、大気の散乱の影響を受けてはいけないような時まで距離の計算を行うのを防ぐためだ。

161218-07

というわけでレンダリング。水面に映った反射像にも効果が適用されていることがわかる。

161218-08

水面のノーマルマップを再接続してこんな感じ。とりあえず満足。



Comments

Post Comment

管理者にだけ表示を許可する


Trackback

※このブログにトラックバックを送信する場合、お手数ですが本文中にブログ該当記事へのリンクを含めてください。

トラックバックURL:http://rutenshikai.blog63.fc2.com/tb.php/539-9fb33f50



Menu

Profile

Kyotaro

確定名:Kyotaro
ネタを探しているらしい。

Categories

Calendar

08 | 2017/09 | 10
- - - - - 1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30

Comments

Archives

Track back

RSS feed

Links

Search

※2011年4月6日のサーバ障害の為、エントリのアドレスが以前のものからズレています。当Blogのエントリにリンクを張っておられた方は、お手数ですがアドレスのご確認をお願い致します。

※Internet Explorer非推奨。