Blender で線画抽出:「Edge Node」を利用する

これはBlenderにおいて「Edge Node」というノードグループを使い、コンポジットで行う輪郭線描画手法についてのメモ。ここではBlender v2.83を日本語化して使用している。

Edge Node v1.2.4

前準備

上記の配布元から「EdgeNodesV1.2.4.blend」をダウンロードしておく。

あらかじめ[ビューレイヤープロパティ]タブ>[パス]>[データ]>[Z]および[ノーマル]を有効化しておく。

そして最上部のタブでワークスペースを「Compositing」に切り替える。上部の「ノードを使用」を有効化。画面に[レンダーレイヤー]ノードと[コンポジット]ノードが出てくる。

[ファイル]>[アベンド]から、ダウンロードしておいた「EdgeNodesV1.2.4.blend」を選択し、その中の「NodeTree」フォルダにある[Edge Node v1.2.4]を選択。画面は何も変わらないが、ヘッダーの[追加]>[グループ]に[Edge Node v1.2.4]が出てくるのでそれを選択すると画面上に[Edge Node]が出る。

ノード編集作業

ここから、[レンダーレイヤー]ノードと[コンポジット]ノードの間にこの[Edge Node]を挟んで繋げてゆく。

[レンダーレイヤー]ノードの[深度]出力から[Edge Node]の[Z in]入力に繋ぎ、同様に[ノーマル]出力から[Normal In]入力へと繋ぐ。

さらに[追加]>[カラー]>[ミックス]で[ミックス]ノードを出す。[Edge Node]の[Edges Out]出力から[ミックス]ノードの[係数]入力へと繋ぐ。

[レンダーレイヤー]ノードの[画像]出力から[ミックス]ノードの2つある[画像]入力のうち上のものに繋ぐ。下の方の[画像]入力の色部分をクリックして、線で使いたい黒など任意の色にする。[ミックス]ノードの[画像]出力から[コンポジット]ノードの[画像]入力へと繋ぐ。

[追加]>[出力]>[ビューアー]で出力確認用の[ビューアー]ノードを出す。[ミックス]ノードの[画像]出力からもう1本、[ビューアー]ノードの[画像]入力へと繋ぐ。

そしてヘッダーの[背景]ボタンを有効にすると、アクティブな[ビューアー]ノードのプレビュー画像が背景に表示される。これはサイドバー(ショートカット【N】)>[ビュー]>[背景]の有効化でもよい。表示されなければ【F12】で一度レンダリングしてみると表示されるはず。[レンダープロパティ]タブ>[レンダーエンジン]は[Cycles]か[Eevee]を選択。なお、同タブにある[Freestyle]は無効にしておくこと。

[Edge Node]の[Distance Check]出力を[ビューアー]ノードの[画像]入力に繋いでみると、深度に色がついたものが表示される。

背景に見えているプレビュー画像が極彩色(虹色)になっていればよいが、色数が少なければ距離が近すぎるか遠すぎるので、[Edge Node]の[距離]の値を調整する。[Detected Edges [Zdepth]]出力から[ビューアー]ノードの[画像]入力に繋ぐと、Z深度によるエッジ検出結果が確認できるので、これを見ながら調整しても良い。

モノクロが見にくいなら[Detected Edges [Zdepth]]出力から[ミックス]ノードの[係数]入力へと繋いでもよい(その場合、調整後は最終的に[Edges Out]出力から[ミックス]ノードの[係数]入力へと繋ぐのを忘れずに)。ドキュメントによると、適切な値を入れたければカメラから対象の中心までの距離を調べて、その値(単位はメートル)を入れるとよいらしい(測るならワークスペースを「Layout」等にして[メジャー]ツール)。

なお、[Detected Edges [Normal]]出力から[ビューアー]ノードの[画像]入力に繋ぐと、ノーマル(法線)によるエッジ検出結果が確認できる。この[Edge Node]では、Z深度(視点からの距離)によるものとノーマル(法線)によるもの、2種のエッジ検出結果を合成したものが[Edges Out]から出力されている。

調整後は[ミックス]ノードの[画像]出力からふたたび[ビューアー]ノードの[画像]入力へと繋いで、出力画像の最終確認をした後、[レンダー]>[画像をレンダリング](ショートカット【F12】)でレンダリング

また、[Edge Node]の[Normal Enhance]値を調整することで線質を変えられる。この値を上げると線が粗くなる。

この[Edge Node]はいくつものノードをまとめて1つのノードにした「ノードグループ」というものなので、選択して右上のアイコンをクリックするか【Tab】キーを押すことで展開させて中身を覗くことができる。再度【Tab】キーを押せば閉じる。輪郭線を太くしたい場合は、[Edge Node]をそのように展開し、右側にある[Condition Edges]の[Thickness]>[距離]の値を上げればよい。そして、余計な線(ノイズ)が混じる場合は、同じく[Condition Edges]の[NoiseRemove + EdgeBoost]の白黒帯部分にある2つのキーを右に動かすことで減らすことができる(が、細い線が飛ぶので注意)。2つのキーを近づけすぎるとアンチエイリアスが消えてしまうらしい。

以下は余計な線を消そうとしたものだが、あまりうまくいってない。このへんが限界か。レタッチ前提なら使える。

背景色

ついでに背景色についてもメモ。「ワールド」プロパティタブ>[サーフェス]>[サーフェス]を[背景]で[カラー]を白にすれば背景は白になる。黒にしたい場合、ここで単純に背景色を黒にすると、その影響を受けてオブジェクトも暗くレンダリングされてしまうため、これを防ぐにはシェーダーノードの作業が必要になる。

最上部のタブでワークスペースを「Shading」に切り替える。その画面下半分にあるシェーダーエディターにて、ヘッダーにある「オブジェクト」を「ワールド」に切り替える。すると[背景]ノードとそれが繋がった[ワールド出力]ノードが出るはずである。

ここに[追加]>[入力]>[ライトパス]ノードと、[追加]>[シェーダー]>[シェーダーミックス]ノードを出す。[ライトパス]ノードの[カメラレイか?]出力から、[シェーダーミックス]ノードの[係数]入力へと繋ぐ。[シェーダーミックス]ノードの[シェーダー]出力から、[ワールド出力]の[サーフェス]入力へと繋ぐ。[追加]>[シェーダー]>[背景]で[背景]ノードをもうひとつ出す。両[背景]ノードの出力をそれぞれ[シェーダーミックス]ノードの[シェーダー]入力へと繋ぐ。下の[シェーダー]入力へ繋がった[背景]ノードの[強さ]の値をいじれば背景のみを暗くできる。

以下は背景を黒くしたもの。