2018年12月29日土曜日

レンダーレイヤー活用とファイル出力の話

先日 CyclesとBlenderレンダーでの法線レンダリングした時の結果が違う
という話があり、そこからレンダーレイヤーの使い方を話す機会があったのですが
検索してもレンダーレイヤーに関係する解説が少ないようだったのでまとめてみます

今回はCyclesレンダーを扱いますがBlenderレンダーでもほぼ同じ機能になります
(これを書いている2018年12月末時点ではBlender2.8Betaにはレンダーレイヤーが搭載されていないため今後のバージョンでは変更になる可能性があります)

レンダーレイヤーについて

Blenderはオブジェクトを20個のレイヤーに振り分けて表示を切り替えたりする機能があります
レンダーレイヤーでは レンダリングの時にどのレイヤーをレンダリング対象にするかといった設定を切り替えられます

レンダーレイヤーの設定に並んでいる20個チェックボックスが3Dビュー上でのそれぞれのレイヤーに対応してます

シーン:」の方がレンダーレイヤーに関係なくシーン全体でオンオフが切り替えになり
右側の「レイヤー:」の方がレンダーレイヤー毎に切り替わる設定になっています
因みに3Dビューの赤丸をしたアイコンはがオンになっていると「シーン:」の方の設定と同期しますが
レンダーレイヤーを使用する場合には本来使いたいレイヤがレンダリング対象から外れてしまうことがあるので個人的にオフにしています

レンダリング結果はUV画像エディッタのプルダウンを切り替えて確認することができます
 
また、レンダーレイヤーの「パス」の設定で色の情報の他に レンダリングに使われた情報を個別に出力することもできます

参考までにレンダーレイヤーのレンダリング結果を疑似的に切り替える画像を作るとこうなります
レイヤーの切り替えでのレンダリングは比較的イメージしやすいかと思いますが
他の機能もみておきます

マスクレイヤーは そのレイヤー内のオブジェクトより奥にあるものを背景に透過させます
図では通常だと球体が描画される部分が背景になっています
背景を透明にしたい場合にはレンダー設定のフィルムにある透過のチェックボックスをオンにします

マテリアル:」にマテリアルを設定するとその設定が強制的に適応された状態になります
例えばシーン内で使っていた緑色のマテリアルを指定するとこうなります

あくまでも レンダーレイヤの「マテリアル:」にマテリアルを割り当てたレンダーレイヤのみ影響して、他のレイヤではオブジェクトに設定したマテリアル通りになります


ここで冒頭の法線レンダリングの話しになります
まずは BlenderレンダーとCyclesレンダーでの法線(ノーマル)のレンダリング結果を比較してみます
どうやらBlenderレンダーではカメラ基準でデータが出るのに対して Cyclesレンダーではシーンの座標軸で出ているようです
そこでまずカメラ基準の方向で色が出るマテリアルノードを作成してみます
オブジェクトを選択していない状態でマテリアルを操作できないようなのでスザンヌで確認しながらマテリアルを設定しています
これをマイナス方向も画像として出るように調整したものがこうなります
背景部分の色は不要のため「ワールドを使用」のチェックボックスを外しています

この話題の元になった 劇団ネコ@gekidan_nekoさん はAfterEffectsのフィルターでこういった光源効果をつけているようです
面白いですね

素材ごとのファイル出力

さて、レンダーレイヤーを使って色々な素材をレンダリングする例をみてきましたが
他のソフトに持っていく場合、素材を書き出す必要があります。

そこでコンポジッティングモードを使用します
初期状態の「コンポジット」の出力はレンダー設定の出力で設定したファイルパスに保存されます

ノードエディッタのコンポジッティングモードでは背景のチェックボックスをオンにして 出力ビューアーのノードに画像のデータを接続するとビューの背景で出力画像をプレビューでき
出力ファイル出力ノードでは入力した画像をファイルとして出力します
ファイル出力ノードは画像を基本パスで指定したフォルダの下に 「ファイルサブパス」で指定した名前で保存します
(図の状態だと tmpのフォルダに image0001.pngといった具合に画像が保存されます)

このファイルパスには色々書き方があって
基本パスに「//」で始まるファイルパスを手入力すると 開いている.blendファイルのあるフォルダが基準になる相対パスで指定できます
例えば「//render/」と入力すると ファイルのある場所にrenderフォルダが作成されて その中に画像が保存されます

入力に追加」を押すことで同じ基本パスを使用するノードの入力を増やすことができて
また、ファイルサブパスの方もスラッシュ”/”区切りでフォルダを作成することができます

図はファイルの保存されたのと同じ場所にranderフォルダを作成して
その中にimageで始まるpngファイルと さらにそこにAOフォルダを作成して別の画像が保存されている例です

imageの後ろについている数字は レンダリングしたフレーム番号です
デフォルトでは4桁ですが image#####abc と#を並べると#と同じ桁数に揃えたり 後ろに文字を挿入することもできます

駆け足で機能のレンダーレイヤーとファイル出力を使った素材の書き出しについてまとめてみました
このノードの使い方関連の話しはもう少しあるのでまたの機会に

2018年12月25日火曜日

モデリング不要な立体視マテリアルのお話(後編)

前回は奥行きをつけるシェーダーの基本的な考え方を解説しました
今回はノードを再利用して活用する手法を紹介したいと思います
因みに数学的な正しさよりも手軽に使える手法をとっているのを最初にお断りしておきます

Boothにサンプルファイルを置いておきますのでそちらを落としてください
ファイルを開いた状態はこうなります
ビューを回転させると テクスチャが普通と違った動きをするのが分かるでしょうか

Blenderはノードの組み合わせをグループとして登録して他で再利用できる仕組みがありますParallaxShiftという名前のノードがそれです。
ノードを選択してTabキーを押すと中身が見れます
今回はこのノードの中身は触らずに利用します

さて、元の表示に戻って説明します。
ParallaxShiftノードでの強さ深度はそれぞれ移動の大きさを指定するためのもので
出力のUVソケットは移動させたUVの値になります
(ベクトルのソケットは移動の大きさを出力していますが今回は使いません)
移動量の大きさの調整は強さの値を変更してください


別の使用例を挙げたいとおもいます
サンプルのマテリアル一覧からWall1を選択してください
青色の格子の奥に角度によって動くカラーグリッドのようになるかと思います
これは新しく追加したミックスのノードで付けた効果になります

ミックスのノードは 効果>ミックスRGBで追加できるノードで、
画像をつなげるとPhotoshop等のレイヤーで合成したように重ねることができます
今回使用した画像ではアルファでの透過を使用していますが
これは係数にアルファをつなげることでアルファの濃さによって合成させています

さて、このサンプルを動かしてみるとよく分かりますが、
実はこの立体視手法は簡易的な計算な カメラからの角度がつきすぎると動いて見えません
そこでその対策となるノードの一例を入れてみました
出力のつながってないミックスノードを次のミックスにつなぎかえると角度が大きくなった時に薄い色で目立たなくなります

さらにもう一つの使用例を
ParallaxShiftノードに用意した深度入力を使ってみます
こちらに画像を入力することで 画像の凹凸で歪み方を変化させます
一番シンプルな状態のノードにテクスチャを接続しても凹凸効果が出ますが
サンプルでは奥行きをつけたものに さらに凹みをつけるものを作ってみました

奥付きで移動した位置にテクスチャを移動させて さらにそのテクスチャ情報を元に凹凸を足しています


最後に今回のノードを作業中のシーンにノード等を読み込む方法を紹介しておきます

ファイルを開いてコピペでも他のファイルにノードを読み込めますが
他のファイルの中のデータを今のシーンに読み込むアペンドという方法があります

ファイルメニューのアペンドを選択するとファイル選択画面が出るので
読み込みたいデータがある.blendファイルを選択します。
するとさらにフォルダ一覧のようなものがでてきたかと思います
これがBlenderのファイルの中の種類毎のデータ一覧と思ってください
今回はノードの情報なのでNodeTreeの中にあるParallaxShiftを開いてください
画面の見た目では変化しませんが ノードエディッタの追加メニューのグループに"ParallaxShift"が増えています
さて、2回に分けてノードを使って立体的に見えるマテリアルの設定を取り上げました
何かの一助になればと思います

モデリング不要な立体視マテリアルのお話(前編)

※ この記事は Blender Advent Calendar 2018 に合わせて作成しました

ゲームでビル等の建物を表現する時に 建物の中をポリゴンで作りこむのではなく
壁面の見え方を計算で作りだしてそれっぽく見せてしまう「インテリアマッピング」
という手法があります。

ゲームエンジンでゲーム作る人にはある程度知られた手法ですが
アニメ等の他の界隈の人の話題にも出ることも多くなったのと
Blenderでもできるのを確認したかったので試してみていました

やってみた後 街中の景色を見ていて作ってみたのがこれ
こちらのバルコニーのようにマッピングする簡易版がリツイートが伸びたこともあり記事にしてみます
この解説ではアニメの背景のような陰影付けをテクスチャに描いてしまう
作画主体の作業のものを扱います

2回に分ける予定で今回は 基本的な考え方を取り扱うので、使い方だけ知りたい方は後編へどうぞ

まず 複数の物が奥行きを持って見えるというのはどういうことでしょうか?

  1. 奥まっているところは陰った感じになっている
  2. 視線を動かした時には手前のものと動く幅が違う
  3. 遠くのものほど小さく見える
  4. 空気遠近法

といったものが考えられると思います
1に関しては初めからテクスチャの陰影で表現することに 4は無視します
2と3に関しては視界の中の変化と見る角度の変化の違いで実際には同じものです
奥まったものが見えることを図にして考えてみて見ます

平行な面F1 F2があった時に
F1のある点Aから見通した場合 目線の先のA’では少しだけずれた位置のものが見えることになります
つまりF1の面上で見る角度に応じて、ちょっとだけずらしたテクスチャを表示すると奥まって見えないでしょうか
どう計算すればいいでしょうか?



ここでベクトルというものでてきます
調べると「ベクトルとは大きさだけでなく、向きももった量」 と出てきます
三次元の座標も「位置ベクトル」と言いますし、画像のピクセルの座標(x,y)もベクトルです
3Dで面がどちらの方向を向いているのかという表すものを「法線ベクトル」と言ってXYZ軸それぞれの大きさで表現されます
細かいことは抜きにして、数字の組み合わせで向きや位置が表現されていると考えてください
そしてコンピューターの計算では ベクトルの向きや大きさを使う色々な便利な計算が用意されています

因みにBlenderでは画像の座標を
左下を基準の0に 画像の端を1.0になるものとしています
一般に画像の縦横の大きさを1.0として(0.0~1.0)の間で画像内の座標を表すものをUV座標(UVベクトル)と言います



3Dのデータの見た目を設定する仕組みをシェーダーと言いますが
ここからBlenderでそれを設定するための「ノードエディッタ」の使い方を順を追ってみていきたいと思います
Cyclesレンダー利用していきますので レンダーエンジンをCyclesに変更してください
(Blender2.8以降ではShaderEditorで Eeveeレンダーでも同じ操作でできるようになっています)

下準備に 平面を作成してUVを作成しておいてください
また、効果を確認するためにカラーグリッド画像を作成しておきます
平面を選択した状態で
ノードエディッタに移ってマテリアルタブを選択して「新規」ボタンを押します

四角いものが2つが 曲線でつながれた状態になっているかと思います
四角いもの一つ一つがノードと言って、掛け算割り算といった感じの処理をしたりしてくれるもので,
ノードの左右に付いた丸がソケットと言って 左側のソケットから入った情報を処理して右側のソケットに出力します
ノードによってシーンから直接情報を取得するので入力のないものもあって
「マテリアル出力」に入った情報が3Dの形状の見た目を設定します

ソケット部分からドラッグ操作をすると 曲線が出るので 別のソケットまで引っ張るってつなげると情報が伝わる状態になります

まずは テクスチャを表示してみます
最初に設定されてる設定は使用しないので左側のノードは消去して
追加メニュー(Shift+A)から  シェーダー>放射テクスチャ>画像テクスチャを選んで図のように並べてつなげます

画像テクスチャノードの写真アイコンを押して 先に作ったテクスチャのグリッドを選んで
3Dビューのシェーディングマテリアルレンダーにするとカラーグリッドが表示されるかと思います


さて、画像テクスチャノードの左側に「ベクトル」のソケットがありますがこれは何に使うものでしょう?
これは画像のどの座標を3Dの面上にどう対応させるかを決める "UVベクトル"を指定するものになります
今は何も指定していないので アクティブなUVが自動的に設定されています
Blenderは複数のUVマップを持つことができますが
テクスチャのベクトルに入力>UVマップのノードを追加することで利用するUVを指定することができます


さて 見る角度によって画像をずらすノードの簡単なのを作ってみます
先にノードは掛け算割り算といった感じの処理をしたりしてくれるものだと言いましたが
UVに角度によって変わる値を加えることができればできそうです

入力>ジオメトリ ベクトル>ベクトル変換 コンバーター>ベクトル演算のノードを追加して図のようにつないでみてください
(図中で"追加"となっているノードはベクトル演算を選択した時に作られるもので ノード内のプルダウンで名前が変わります)
ジオメトリ"ノーマル"は面がどの方向を向いているかの情報で "ベクトル演算"の下のプルダウンを"カメラ"にすることで
ビューの方向から見て面がどういった方向を向いているのかといって情報が出力されます

3Dビューの表示を回転させてみてください テクスチャが移動しているでしょうか

長くなったしまったので今回の記事はここまで
次回後編は グループ化したノードを使って 実用に即したものを解説したいと思います