【Blender】境界部分のテクスチャーを簡単に馴染ませる
オブジェクトの境界のテクスチャーを簡単に馴染ませる方法を検証してみたので、結果をメモ。一度設定しておけば、オブジェクト配置は後から決めらる。調整が比較的自由になるので便利。(非破壊)
※境界部分のテクスチャーを手書きしてしまうと、
あとから、オブジェクトを位置調整した時、変更に手間がかかるので。
<Blender 2.93.5>
■概要
ブロックと地面のシェーダーをミックスしてテクスチャーを合成。
アンビエントオクルージョン(AO)をマスクとして利用する仕組み。
■やり方
事前準備として、ブロックと地面のオブジェクトを作成する。
それと、変な影響がでないようにオブジェクトそれぞれの位置回転スケール値をフリーズしておく。オブジェクト>適用>全トランスフォームを適用。(Ctrl+A)
まず、ブロックと地面にシェーダーを設定する。
それぞれのシェーダーをグループ化して1つのノードにまとめる。(ノードを整理して編集しやくすくするため)
ブロックのシェーダーに地面のシェーダーをコピーする。
次にブロックと地面オブジェクトの境界部分の馴染ませる設定を行う。
シェーダーミックスの係数には、マスク情報を接続する前提。
ブロックのマテリアル設定を選択し、下図のノード構成にする。
(※ブロックのマテリアルに地面のノード構成をコピペする時は予めテクスチャーとシェーダーの組み合わせをグループ化しておくとやりやすい。ノードが展開している状態でコピペしてもよいが、煩雑な見栄えになるので)
それからマスクに利用するアンビエントオクルージョン(AO)ノードのサンプル数の値を大きめにしておくと精度が増す。AOの幅を大きくしたい場合は、カラー>距離の値を調整。グラデーションの幅は、カラーランプノードで調整する。
あと、シェーダーのかかり具合が逆転する場合は、シェーダーミックスノードに接続された各シェーダの接続位置を逆に付けなおすと解決するはず。
レンダープロパティで、アンビエントオクルージョン(AO)を有効にしておく。(3Dビューポートやレンダリング時の全体的な表示設定)
<Tips>
ノード構成にグループを追加したい場合は、追加>グループ> から選択する。(※グループ化したノードは、シェーダーが異なっても表示される)
◇トラブルシューティング
ブロックの馴染ませた上階テクスチャーは、地面のテクスチャーを拡大縮小した場合は、連動しているのであまり問題ない。
しかし、ブロック自体を拡大縮小した場合は、境界テクスチャーとのテクスチャーサイズが合わなくなってしまう。理想は、馴染ませた境界部分のテクスチャーサイズが変わらないことなのだが・・・。
<解決方法>
原因は、UVマップに即したシェーダーを作成するときのお作法が抜けていただけだった。
グループ化するテクスチャーのノード構成で、下記2つのノードを接続しておくだけで、オブジェクトをスケールしてもサイズを固定化できた。
・テクスチャー座標ノード(UV)
・マッピングノード
■テクスチャーのベイク方法
馴染ませた境界部分をテクスチャーにベイクする。
位置を確定して動かさないオブジェクトについては、ベイクしておくと処理負荷が減る。
追加>テクスチャ>画像テクスチャ を追加して、どこにも接続させず、キャンバスに配置しておく。
次にレンダープロパティで、レンダーエンジンをCyclesに切り替えて、テクスチャーをベイクする。(ベイクボタンをクリックして開始)
なお、ベイク対象が、ベースカラーだけでよいならば、ベイクタイプをディフューズに設定してからベイクする。
※レンダープロパティ>ベイク>影響>寄与 で、カラーのみ有効にしておく。(ベイクテクスチャにライトの影響で陰影がつかないように)
※新規テクスチャーを作成しておくと作業がスムースに進む(ベイクボタンをクリックする前に)
■トラブルシューティング
◇グループ化されたノードの連携
現在開いているマテリアルに存在する各ノードグループは、リンクさせることができる。なので、以前作成したノード群をグループ化しておけば、新しいノード編集で流用することができる。
やり方は、NodeGroupノードの「リンクするノードを閲覧」ボタンをクリックするとNodeGroupのリストが表示され、選択すると切り替えることができる。(※ただし、他のマテリアルにNodeGroupがある、または、現在のマテリアルでNodeGroupがある状態が前提)
◇英語表記のノード構成
英語表記が知りたい時の参考に。
◇親子ノードツリーへの行き来
下図は、グループ化された状態。
グループ内から抜ける時は、ツールバーの「↑」親ノードツリーへ移動ボタンをクリックする。また、親子ノードツリーへの行き来は、TABを押すことでも可能。(トグル操作)
■関連動画
今回説明したやり方と似ているが、こちらは、オブジェクトと地面の境界部分を検出するのではなく、Texture Coordinateノードで、割り当てたオブジェクトの位置で、白黒グラデーション(マスク)を発生させ、マテリアルブレンドに利用している。
なので、オブジェクトと地面の境界部分の検出をして、その部分をマスクに割り当てることが重要。他のやり方としては、Z深度で、境界部分の検出ができれば、同じようなことができそう。
以上。
この記事が気に入ったらサポートをしてみませんか?