dskjal
広告
広告

Blender の輪郭抽出技法まとめ

カテゴリ:blender

目次

概要

有料ならPencil+ 4がある。Pencil+ 4 Bridge for Blender を使えば、3ds Max、Maya、Unity 間で Pencil+ 4 ラインの設定の受け渡しができる。

【Pencil+ 4 Line for Blender】配布開始記念!スタジオカラーデジタル部テクニカルトーク

「Pencil+ 4 Line for Blender」 リリース記念! 開発協力・スタジオカラーデジタル部が語る、BlenderとPencil+で広がるアニメ制作の可能性

Pencil+ 4 Line for BlenderをはじめとするBlender環境で制作された、スタジオカラーの新作短篇映像『EVANGELION:3.0(-46h)』

Blender で輪郭抽出する方法は大きく分けて4つある。背面法・コンポジター・フリースタイル・ラインアートだ。ラインアートはバージョン 2.93 から使える。BEER レンダラーを使って GLSL シェーダを書く方法もある。最終手段としてグリースペンシルがある。

リアルタイム交差線線の装飾線の出せる場所
フレネル××カメラから見て法線が横方向に向いている場所
背面法××任意の場所・深度差・辺・マテリアル境界
ジオメトリノード××任意の場所・辺の角度差がある場所
BEER×アウトライン・深度差のある場所・オブジェクト間で交差線が出せる
コンポジター×任意の場所。バージョン 3.5 からはリアルタイム表示可能
フリースタイル×任意の場所・任意の辺(深度差・マテリアル境界・マークを付けた場所など)・クリース
ラインアート任意の場所・任意の辺(深度差・マテリアル境界・マークを付けた場所など)・面が交差している箇所・クリース・任意の場所(ベイクした場合)
グリースペンシル任意の場所に線を描けるが、更新は手動。最終調整用

フレネル

マテリアルのフレネルノードを使う方法。リアルタイムだが、ラインの幅が一定ではなく、出る場所のコントロールが困難。

背面法

背面法はモディフィアでメッシュの法線を反転させたポリゴンを生成し、裏面を描画しないマテリアルをそのポリゴンに設定することで、輪郭を描画する。背面法の利点は以下の3つ。

  1. リアルタイムで表示できる
  2. 入り抜きを調整できる
  3. オブジェクト単位で輪郭の色を塗りわけられる

欠点は以下の2つ。

  1. 線の位置が法線方向にずれる
  2. メッシュのセットアップが必要なので使い回しができない

細長いキューブ状のメッシュを配置することで任意の場所に線が出せる。消したいときはシェイプキー等でメッシュ内に隠す。

ソリッド化モディフィアのほかにベベルモディフィアも使える。こちらはリアルタイムで任意の辺に線を描画できる。

ソリッド化モディフィアを適用すると単純にポリゴンになるので、線の編集の自由度が上がる。

BEER(Blender Extended Expressive Render)

BEER の情報は bnpr で確認できる。BEER は線の描画をシェーダで行っている。

Freestyle がサポートされたカスタム Blender はこちら。BEER レンダラーを追加するアドオンはこちら

advanced_line.glsl の線画抽出アルゴリズム

advanced_line はポストエフェクトで線画抽出を行っている。上下左右もしくはクロス方向にGバッファをサンプルして法線・深度・オブジェクトID を取得する。そしてシェーディング位置の法線・深度・ID とをそれぞれ比較して線を出すかどうかを判定している。

オブジェクトID が取得できるのでオブジェクト間の交差線が出せる。

外部リンク

外部リンク

The Quest for Very Wide Outlines An Exploration of GPU Silhouette Rendering


Add Line material node

シェーダ・GLSL で線画抽出を行うノードを追加する。アルゴリズムが BEER と似ている。

パッチを適用したビルド(€1+)

コンポジター

コンポジターで輪郭を抽出するにはフィルターノードのラプラス・ソーベル・キルシュ・プルウィットを使う。これらのノードは色の差がある場所に線を引く。線のコントロールには法線・深度・UV・頂点色・テクスチャ等が使える。

コンポジターで行う輪郭抽出はリアルタイムで表示できず入り抜きも入れられない。加えて線の塗りわけも手間がかかる。しかし任意の場所に線を出せる、ノードの使い回しができる利点がある。ただし不要な線を除去するためのマスクを作成する作業は再利用できない。

コンポジターの一番の強みは、計算負荷がポリゴン数ではなくレンダリング解像度に比例することだ。巨大なシーンで線画を抽出する場合、コンポジターが一番レンダリングが速くなる。

深度と法線とを使う方法はメッシュのセットアップが不要で手軽だ。しかし線のコントロールが難しく、法線を使って線を出すとノイズが乗る。UV を使う方法は追加の UV のセットアップが必要だが、法線や深度を使う方法よりコントロールが効き、ノイズも比較的少ない。

セットアップの手間をかけずにコンポジターで輪郭抽出を行うには、Cryptomatte・深度・法線・UV・AOV を利用して、ソーベルで輪郭抽出する。

バージョン 2.93 からはアンチエイリアスノードが使える。

バージョン 3.5 からはビューポートでコンポジターの結果を確認できる。ただし 3.5 では深度や法線情報が利用できない。

フリースタイル

フリースタイルは破線や深度を使った入り抜きなど他の方法では実現できない機能を持つ。しかしフリースタイルには最大の欠点がある。入り抜きを入れると視点によっては途中で線が途切れる問題だ。これは動画では線のちらつきとして問題になる。現状(Blender 2.79)では避ける方法がないが、動画で使うときは入り抜きを使わないことで避けられる。スチルならばフリースタイルは有力な選択肢になる。

線の途中に入った切れ目

線の途中に入った切れ目

線を出したい場所に辺のみのポリゴンを配置すると任意の場所に線が置ける。

ラインアート

バージョン 2.93 からはラインアートが使える。ラインアートは CPU でエッジ検出のみを行い、描画にはグリースペンシルを使う。

ラインアートは任意の辺やマテリアル境界、交差線、クリースなどを、負荷が軽いシーン(二万ポリゴン以下)ならばリアルタイムに描画できる。線を出したい場所に辺のみのポリゴンを配置すると任意の場所に線が置ける。

さらに ラインアートはグリースペンシルオブジェクトに線画をベイクできる。そのため ラインアートは線画編集の容易さで他を圧倒している。加えてバージョン 2.93 ではグリースペンシルオブジェクトを SVG にエクスポートできる。

直接テクスチャや頂点に描く方法

テクスチャに描く

線の色を変更する必要がない場合、直接テクスチャに描く方法が簡単だ。線画用テクスチャとアルベドテクスチャが分離している場合は、シェーダで色を決めたり、視線によって線を非表示にすることもできる。

頂点色を使う

シェーダで頂点色を取得するには属性(Attribute)ノードを使う。

頂点色の取得

頂点色の取得

バージョン 2.81 からは頂点カラーノードが使える。

頂点カラーノード

頂点カラーノード

マテリアルのフレネルノードを使う方法

フレネルノード

フレネルノード

ラインアート

ラインアートの使い方

画像をグリースペンシルオブジェクトへ変換(2.91)

ドラッグアンドドロップで画像をシーンに配置し、「オブジェクト > 変換 > 画像をグリースペンシルにトレース」でできる。アルファがあるとうまく機能しない

画像をグリースペンシルに変換

画像をグリースペンシルに変換

背面法(Inverted Hull)

背面法はモディフィアでメッシュの法線を反転させたポリゴンを生成し、裏面を描画しないマテリアルをそのポリゴンに設定することで、輪郭を描画する。メッシュの生成にソリッド化モディフィアとディスプレイスモディフィアとが使える。ソリッド化モディフィアを使う方が単純だが、線の入り抜きは頂点グループで行うことになる。それに対してディスプレイスモディフィアを使う利点は、線の入り抜きにテクスチャが使えることだ。

背面法はソリッド化モディフィアをつけたままでは、頂点グループを利用した線の入り抜き程度の装飾しかできない。しかしソリッド化モディフィアを適用してポリゴン化してしまえば、シェイプキーやラティス等を使って自由に線を変形でき、ポリゴン単位でマテリアルを変更できる。メッシュ内にポリゴンを縮小しておいて、シェイプキーを使って必要な部分に線を出すこともできる。

ソリッド化モディフィア

EEVEE

バージョン 4.1 以前
EEVEE で反転ポリゴンの設定

EEVEE で反転ポリゴンの設定

バージョン 4.2 以降

ソリッド化モディフィアの設定は 4.1 以前と同じ。

バージョン 4.2 以降

バージョン 4.2 以降

Inverted-Hull-Setup-Tool

EEVEE の背面法をセットアップするアドオン。

Cycles

Solidify modifier Contour/Outline(英語)

Cycles で背面法を使うときのノード設定

Cycles で背面法を使うときのノード設定

Blender Render

設定まとめ

設定まとめ

任意の場所に線を置く

細長いキューブ状のメッシュを配置することで任意の場所に線が出せる。線出し用のキューブは透明のマテリアルを適用する。消したいときはシェイプキー等でメッシュ内に隠す。

ただしこの方法で出した線は太さが2倍になる。線幅をコントロールするには、追加のソリッド化モディフィアを頂点グループで制御する。

透過マテリアルが適用されているので線出し用のキューブは見えない

透過マテリアルが適用されているので線出し用のキューブは見えない

ソリッド化モディフィアの線の太さを調整する

【Blender2.9】アウトラインを作成し、線の強弱をつける方法

線幅の均一化

線幅が均一化されていないと、パースがついた背景などでは3D感が強調されてしまう。

背面法で 線幅を統一するにはジオメトリノードを使う。ジオメトリノードで頂点グループにカメラからの距離を書き込んで、ソリッド化モディフィアでその頂点グループを指定するだけだ。

ノード

ノード

.blend ファイルダウンロード

板ポリゴンで背面法を使う

ソリッド化モディフィアは板ポリゴンではうまく機能しない。これは前髪などで問題になることがある。

板ポリゴンでは機能しない

板ポリゴンでは機能しない

板ポリゴンで背面法の輪郭検出をする場合は追加のソリッド化(Solidify)モディフィアをつけることで輪郭を表示させられる。このとき輪郭抽出用のソリッド化が下になるようにする。

輪郭抽出用のソリッド化が下

輪郭抽出用のソリッド化が下

毛先の頂点を結合しない場合

髪をポリゴンでモデリングする場合、毛先を結合しないことがある。毛先を結合しない場合、四角形ポリゴンを維持できたり、格子状の UV 展開ができる利点がある。

毛先を結合しない状態で背面法を使う場合は、毛先の頂点の位置をそろえて、ソリッド化モディフィアを以下のように設定する。

毛先の頂点を結合しない場合の設定

毛先の頂点を結合しない場合の設定

ソリッド化モディフィアのバグについて

バージョン 2.90 以前の複雑モードは法線が反転しないバグがある。バージョン 2.90 以前の複雑モードで背面法を使うには以下の3つの方法がある。

1. 法線反転用ソリッド化モディフィアを追加する

元のメッシュを編集する必要はないが、ソリッド化モディフィアが2つ必要になる。ポリゴン数が増えるため、アニメーションやレンダリングが遅くなる。

法線反転用ソリッド化モディフィア

法線反転用ソリッド化モディフィア

2. 元のメッシュの法線を反転させる

ソリッド化モディフィアが一つだけになる利点があるが、元のメッシュの法線が反転する。

3. ソリッド化とメッシュとのマテリアルを逆に設定する

ソリッド化モディフィアが一つだけになる利点があるが、元のメッシュのマテリアルが線画用マテリアルになる。

板ポリゴンでとがった輪郭線をつくる

板ポリゴンをソリッド化で立体化(こちらはモード:シンプルでも可)するときに、頂点グループで厚みをつけない部分を指定する。その後に「モード:複雑」のソリッド化モディフィアを追加すれば、板ポリゴンでもシャープな輪郭線が作れる。


色トレス

背面法のマテリアルにテクスチャまたは色を指定することで線に色を付けられる。

テクスチャを使って色トレス

テクスチャを使って色トレス

頂点を法線方向に動かす

ディスプレイスモディフィアを使えば、ソリッド化モディフィアを適用した状態でも線用ポリゴンを法線方向に移動できる。それには線用ポリゴンの頂点グループを作成し、ディスプレイスモディフィアの方向をノーマルにする。ディスプレイスモディフィアの強さはマイナスになる。

ディスプレイスモディフィアで法線方向に頂点を移動させる

ディスプレイスモディフィアで法線方向に頂点を移動させる

ベベルモディフィアで任意の辺に線を出す

ベベルモディフィアは頂点グループや辺ベベルでベベルをかける場所を選択でき、ベベル部分のマテリアルを指定できる。辺にベベルを設定するにはエディットモードのプロパティパネルで平均ベベルウェイトを設定する。ベベルモディフィアの線描画はリアルタイムに表示できる利点がある。

ベベルで線を描く

ベベルで線を描く

ディスプレイスモディフィアを使う

背面法でディスプレイスモディフィアを使う場合の設定手順は以下のようになる。

  1. オブジェクトをリンク複製(Alt + D)する
  2. リンク複製したオブジェクトにディスプレイスモディフィアをつける
  3. リンク複製したオブジェクトに裏を描画しないマテリアルを設定する
  4. ディスプレイスモディフィアの強さで線の厚みを設定する

設定するマテリアルは基本的にはソリッド化モディフィアと同じだが、放射ノードと透過ノードとの位置が違っている。

Eevee のマテリアル。ソリッド化の場合とはノードの位置が違っている

Eevee のマテリアル。ソリッド化の場合とはノードの位置が違っている

マテリアルはデフォルトではメッシュに適用される。同一メッシュに別マテリアルを設定するには、マテリアルのリンクをオブジェクトに変更する必要がある。

マテリアルのリンクをオブジェクトにする

マテリアルのリンクをオブジェクトにする

アーマチュアで変形する場合は、ディスプレイスモディフィアの上にアーマチュアを配置する必要がある。

辺分離モディフィアで角度を使って線を出す

辺分離モディフィアを使えば角度をしきい値として線が出せる。ただし、辺分離モディフィアは板ポリを生成するので、追加のソリッド化モディフィアが必要になる

辺分離モディフィアで板ポリ化した辺をキューブ化するため、ソリッド化が2つついている。<br/>この例では線出し用のソリッド化と含めて3つソリッド化がついている。

辺分離モディフィアで板ポリ化した辺をキューブ化するため、ソリッド化が2つついている。
この例では線出し用のソリッド化と含めて3つソリッド化がついている。

ジオメトリノードで背面法

ジオメトリノードで背面法

シンプルな実装だと線にパースがついてしまう。

シンプルな背面法

シンプルな背面法

線幅の均一化

解説は線幅の均一化を参照。

線幅の均一化ノード

線幅の均一化ノード

パースのテスト

パースのテスト

.blend ファイルダウンロード

カメラの FOV の変化に対応する

画面上での線幅は、「カメラと頂点との距離 * tan(FOV/2) 」を掛けるとカメラに依存しない一貫した線幅が計算できる。FOV = 2 * tan-1(センサーサイズ[mm] / 2*焦点距離[mm]) なので、最終的には以下の式になる。

カメラと頂点との距離 * センサーサイズ[mm] / (2*焦点距離[mm])

FOV 対応

FOV 対応

.blend ファイルダウンロード

外部リンク

「ギルティギア」シリーズ、輪郭線を自在に操る「背面法」実装テクニック【CEDEC2024】

焦点距離と実視野の理解

中途半端な線を消す

背面ポリゴンをカメラの向いている方向へ移動させることで、アウトラインのみを表示させられる。

オフセットの比較

オフセットの比較

ノード

ノード

.blend ファイルダウンロード

「ギルティギア」シリーズ、輪郭線を自在に操る「背面法」実装テクニック【CEDEC2024】では頂点カラーにオフセット量を入力することで消したい頂点を指定している。ジオメトリノードでは名前付き属性(Named Attributes)で頂点色を取得できる。

頂点色を使う場合のノード

頂点色を使う場合のノード

.blend ファイルダウンロード

外部リンク

「ギルティギア」シリーズ、輪郭線を自在に操る「背面法」実装テクニック【CEDEC2024】

外部リンク

ジオメトリノード(3.1)

オリジナル版は重いので私が編集したノードのアルゴリズムを解説する。

バージョン 3.1 のジオメトリノードで辺の角度が取得できるようになった。そこでメッシュをカメラ方向に圧縮して辺の角度を強調し、圧縮後の辺の角度を閾値として抽出する辺を判定する。

カメラ方向へ圧縮するイメージ

カメラ方向へ圧縮するイメージ

ジオメトリノードの情報をシェーダに渡す

シェーダの属性(Attribute)ノードを使えばジオメトリノードの情報をシェーダに渡せる。

辺の角度をシェーダに渡す

辺の角度をシェーダに渡す

ただし辺の角度はある程度のポリゴン数が必要で、上の画像ではベベルを付けている。

他の手法との比較

背面法

背面法よりポリゴン数は少ない。ジオメトリノードを使う方法は必要な辺にのみカーブを実体化するからだ。ただしこのジオメトリノードの実装はカメラやメッシュが動くたびに再計算が発生するため、背面法の方が動作が軽い。

ラインアート

ラインアートより動作が軽い。ただしジオメトリノードを使う方法は交差線が出せない。

アルゴリズム

ノード

ノード

  1. 属性キャプチャノードで元の頂点位置を保存しておく
  2. カメラ方向へメッシュを圧縮する。これにより辺の角度が強調される
  3. 辺の角度ノード等を使い輪郭抽出
  4. 抽出した辺をカーブへ変換
  5. 保存しておいた頂点位置へ戻す
  6. カーブの太さを設定
  7. メッシュに再変換
  8. 線にマテリアルを設定
  9. ジオメトリ結合

.blend ファイルダウンロード

辺の角度による線検出を追加したバージョン

.blend ファイルダウンロード

コンポジター

コンポジターで行う輪郭抽出はフィルターノードのラプラス・ソーベル・キルシュ・プルウィットを使う。これらのノードは色に差があればそこに線を出せるので、設定を工夫すれば任意の場所に線を出せる。おすすめはソーベルとラプラス+ガウスぼかしだ。

ソーベルはプルウィットの中央に重みをつけ、ノイズを抑えるために平均化を行ったものだ。そのためプルウィットはあまり使われない。

キルシュはピクセルの八方向に輪郭抽出を実行し、差が最大のものを採用する。検出力が強い分ノイズも出やすい。

ピクセルの濃度差の一次微分をとる、プルウィット・ソーベル・キルシュはグラデーションでも輪郭を抽出できるが、ノイズが出やすい。ラプラスは二次微分をとり、より高性能だが前処理が必要になる。ラプラスは画像内にあるノイズに弱いので、前処理としてガウスぼかしがよく使われる。

バージョン 2.93 からはアンチエイリアスノードが使える。

Canny 輪郭抽出ノードを追加するパッチがある。

拡張/浸食(Dilate/Erode)ノードとミックスの差分ノードとを組み合わせる方法もある。

一般的な構成

輪郭線・オブジェクト交差線・マテリアル境界が欲しいなら Cryptomatte を使う。

交差線・クリースが欲しいなら法線Cycles でクリース検出を使う。

深度差が欲しいなら深度UVワールド位置が使える。

バージョン 2.93 以降ならアンチエイリアスノードが使える。

鉄板構成(バージョン 2.93)

鉄板構成(バージョン 2.93)

ビューポートコンポジター(3.5)

バージョン3.5 からはビューポートでコンポジターの結果が確認できる。しかし 3.5 の時点では以下のソケットが非対応なので、線出しには使えない。

ビューポートコンポジターを有効にする

ビューポートシェディングでマテリアルプレビューかレンダーを選択して、コンポジターを「常時」にする。

ビューポートコンポジターを有効にする

ビューポートコンポジターを有効にする

アドオン

FreePencil

頂点カラーに線画用情報を書き出すアドオン。使い方は FreePencil を参照。

外部リンク

AOVとアンチエイリアスノードを使用した塗り分け法の解説

エッジ検出@MathWorks

微分フィルタで画像のエッジ抽出

What are the differences in first order derivative edge detection algorithms and second order edge detection algorithms?

アンチエイリアス

コンポジターでアンチエイリアスをかけるならば、バージョン 2.93 以降で追加されたアンチエイリアスノードを使う。

アンチエイリアスノード(2.93)

バージョン 2.93 でコンポジターにアンチエイリアスノード(場所は「フィルター > アンチエイリアス」)が追加された。

アンチエイリアスノード

アンチエイリアスノード

しきい値(Threshold)と Contrast Limit はソーベルの結果に適用する場合にはほとんど影響がない。これらのパラメーターは画像のアンチエイリアスで意味がある。Corner Rounding を上げるとシャープネスがあがる。

ブラーを使った AA

カラーランプをつなぐ前にブラーをかける方法もある。ブラーの量が大きいと輪郭が太くなる。

ブラーを使った AA のノード

ブラーを使った AA のノード

ブラーを使った AA の結果

ブラーを使った AA の結果

デノイズノード(2.81)

バージョン 2.81 で追加されたデノイズノードを使うことでもアンチエイリアスがかけられる。

法線/深度を使う

法線のみを使う

法線とラプラスとを使って輪郭抽出するノード

法線とラプラスとを使って輪郭抽出するノード

法線とラプラスとを使った輪郭抽出の結果

法線とラプラスとを使った輪郭抽出の結果

以下のように 3 つの直交するベクトルとの内積をそれぞれ RGB として解釈させると、法線の検出力を調整できる。

法線の検出力を調整して輪郭抽出するノード

法線の検出力を調整して輪郭抽出するノード

単純な深度を使った輪郭抽出

深度は値が 0, 1] の範囲に収まらないので正規化が必要になる。正規化によって深度を [0, 1] の範囲に変換することで深度を色として解釈できるようになる。[エッジノードでは深度を対数に変換することで、カメラから見て手前にある深度の精度を上げている。

深度を使った輪郭抽出

深度を使った輪郭抽出

結果

結果

深度に色をつける

エッジノードは深度に色を付けることで深度の検出力をあげている。深度を正規化した後にカラーランプで色を付けると深度差が微妙な部分にも線が出せる。カラーランプのカラーモードを HSL にして、補間モードを時計回りにすると簡単に深度に虹色をマップできる。

カラーランプで虹色を作る

カラーランプで虹色を作る

ワールド位置を使う

AOV でワールド位置を出力すると役に立つことがある。深度と同じで正規化が必要になる。

ワールド位置で輪郭抽出

ワールド位置で輪郭抽出

ふたつを合成

手軽な方法

手軽な方法

個別に調整可能なノード

個別に調整可能なノード

深度と法線の合成

深度と法線の合成

NormalノードでNormal抽出エッジを調整

エッジノード

Cycles・Eevee でクリース・交差線検出

AO

AO マテリアルを使ってクリース・交差線を検出できる。これを AOV でコンポジターに持ち込む。

マテリアルノード

マテリアルノード

Eevee ならビューポートでプレビューできる。

Eevee で AO を使ったクリース・交差線検出

Eevee で AO を使ったクリース・交差線検出

ベベルノード(Cycles のみ)

ベベルノードの法線とリアル法線との内積でクリースを検出する。

線を細くするにはベベルの半径を小さくする。ベベルのサンプル数は 50~100 ぐらいは必要になる。

ノード例

ノード例

レンダリング結果

レンダリング結果

拡張/浸食(Dilate/Erode)ノードとミックスの差分ノードとを組み合わせる方法

入力としては正規化した深度とミストが使える。

拡張/浸食(Dilate/Erode)ノードとミックスの差分ノードとを組み合わせる方法

拡張/浸食(Dilate/Erode)ノードとミックスの差分ノードとを組み合わせる方法

明度差/色を使う

明度差

カラーランプで線の出る範囲を調節できる。

明度差を検出する

明度差を検出する

上のカラーランプは明度差をコントロールし、下の方は他の色を引き算する強さを調整する。

赤を検出する

赤を検出する

結果

結果

Object/Material ID を使う

輪郭抽出したいオブジェクトに Object > Pass Index を設定。 マテリアルの場合 Material > Options > Pass Index。

オブジェクト ID の設定

オブジェクト ID の設定

マテリアル ID の設定

マテリアル ID の設定

オブジェクトのみを表示したいので、Render > Shading > Alpha を Transparent にする。Render Layer > Passes > Object Index にチェックを入れる。マテリアルの場合は Material Index。

オブジェクト ID の入力

オブジェクト ID の入力

アルファでオブジェクトのみを表示

アルファでオブジェクトのみを表示

以下のようにノードをつなぐ。ID Mask の Index に設定した ID を指定する。

ID 検出ノード

ID 検出ノード

マテリアルの場合

マテリアルの場合

レンダリング結果

レンダリング結果

blender - 鏡音リン(4)

覆い焼きを使う方法

覆い焼きでは明暗差のある場所に線を出せる。ソーベルやラプラスの代わりに使うこともできる。

覆い焼きのノード

覆い焼きのノード

ソース画像

ソース画像

輪郭抽出

輪郭抽出

頂点色を使ってソーベルの輪郭抽出をコントロールする

頂点色を使ってレンダリングしてフィルタで輪郭抽出する。頂点色を変更することで輪郭をコントロールできる。

Blender レンダーで頂点色を使ってレンダリングするには、マテリアルの「陰影なし」と「頂点カラーペイント」にチェックを入れて頂点色を使ってレンダリングする。Eevee では放射(Emission)ノードを使う。

頂点色をレンダリングするときのマテリアルの設定

頂点色をレンダリングするときのマテリアルの設定

.blend ファイルダウンロード

輪郭の太さを変更する

拡張/浸食(Dilate/Erode)を使えば輪郭の太さを変更できる。

拡張/浸食(Dilate/Erode)で輪郭の太さを変更するノード

拡張/浸食(Dilate/Erode)で輪郭の太さを変更するノード

結果

結果

ブラーをかけることで、輪郭を太くできる。

インペイント(Inpaint)

線でない部分をカラーキー(Color Key)ノードでアルファ抜きすると、インペイントノードで輪郭線を太くできる。

カラーキー+インペイントノードで輪郭線を太くする

カラーキー+インペイントノードで輪郭線を太くする

頂点ペイント tips

頂点ペイント作業を効率化する Vertex Color Master for Blender アドオンがある。

マスクして塗るとエッジの効かせて色を塗れる。マスクする面は左クリックモードでは Shift + 左クリックで選択できる。

マスク

マスク

現状(バージョン 2.80)では頂点ペイントでテクスチャペイントのようにグラデーションをかけられない。グラデーションをかけたいときはステンシルテクスチャを作る。ステンシルテクスチャはマウス右ドラッグで平行移動。Shift + マウス右ドラッグで拡大縮小できる。

頂点ペイントでグラデーション

頂点ペイントでグラデーション

レンダリング設定

頂点ペイント用のレンダーレイヤーを作成し、マテリアルオーバーライドを使ってレンダリングする。マテリアルオーバーライドを使うとレンダリングするオブジェクトすべてに、指定したマテリアルを適用してレンダリングされる。マテリアルオーバーライドを使わない場合はオブジェクトを複製しなければならず、管理が面倒になる。

レンダーレイヤーの設定

レンダーレイヤーの設定

ノード設定

フィルタを使って輪郭を抽出する。

ノード例

ノード例

ノードで余計な線を消す方法

ノードで作成した輪郭の一部を消す方法

オブジェクトの交差する部分に線を出す

フィルタのキルシュを使う方法はセルアニメ風輪郭線の生成方法を参照。

そのほか ID法線も使える。

レンダーレイヤーのマスクを適用してレンダリングすれば、ソーベルなどのフィルターで輪郭抽出できる。

マスクレイヤーで交差する部分を除去してレンダリング

マスクレイヤーで交差する部分を除去してレンダリング

UV を直接使う方法

UV 座標を使って線を出すこともできる。この方法は以下の利点がある。

  1. セットアップの手間が小さい
  2. 同時に深度も検出できる
  3. 辺のある場所ならば自由に線が描ける

バージョン 2.82 以降の Cycles とバージョン 2.92 以降の Eevee では AOV が使えるので、輪郭抽出用の UV をそのままコンポジターに持ち込める。

テクスチャ座標ノードの生成を使って輪郭抽出

テクスチャ座標ノードの生成を使って輪郭抽出

UV を使う方法では深度によっても線を抽出する。深度が異なる場所は UV 座標も異なる可能性が高いからだ。深度を使う方法で精度が不足する場合は UV を使うことで疑似的に深度を使った線を抽出できる。

手順

手順は簡単で線画抽出用UVを作成し「UVマッピング(U)> プロジェクション」でUV展開するだけだ。後は線が出てほしい部分のUVを縮小するか、移動するかする。

UV 例

UV 例

UV から線画を抽出するノード

UV から線画を抽出するノード

レンダリング結果

レンダリング結果

超簡単!blender 3d 輪郭線を抽出方法の『node』アニメ調に最適

三次元 UV を出力する

正面と横とから線画出力用のUVを作成し、色として出力する。3次元UVはマテリアルオーバーライドを使って色として出力する。

UV 例

UV 例

線画用UV

線画用UV

オーバーライド用マテリアル

オーバーライド用マテリアル

Cycles・Eevee

Cryptomatte(Cycles 2.80,Eevee 2.92)

Cycles ではバージョン 2.80 以降、Eevee ではバージョン 2.92 以降で Cryptomatte が使えるので、オブジェクトやマテリアルに ID を設定する必要はない。

バージョン 2.93 以降はレンダーレイヤーの Crypto* ソケットを Cryptomatte ノードにつなぐ必要はない。ただし「プロパティパネル > ビューレイヤー > パス」にチェックを入れる必要がある。マット ID にオブジェクト名が使えるようになった。

バージョン 2.93 の Cryptomatte

バージョン 2.93 の Cryptomatte

Cryptomatte を使うには、「プロパティパネル > ビューレイヤー > パス」にあるオブジェクトまたはマテリアルにチェックを入れ、コンポジターで Cryptomatte ノードにつなぐ。特定の色だけ取得したい場合は、オブジェクト名を入力するか、スポイトで色を取得する。

Cryptomatte のデモ

Cryptomatte のデモ

特定の色だけ取得する

特定の色だけ取得する

AOV を使う(Cycles 2.82,Eevee 2.92)

Cycles ではバージョン 2.82 以降、Eevee では 2.92 以降で AOV が使える。AOV を使えばコンポジターに必要なデータをレンダリングするのにマテリアルオーバーライドを使って何度もレンダリングする必要がなくなる。頂点色使えば頂点に任意のデータを格納できる。テクスチャにデータを格納しその UV 座標を出力する方法もある。

AOV を使うには、パスに Shader AOV を追加し、AOV Output ノードを使う。

AOV の設定

AOV の設定

Eevee は3Dビューのシェーディングのレンダーパスで AOV をビューポートでプレビューできる。Cycles はマテリアルプレビューの時のみプレビューできる。

AOV のプレビュー

AOV のプレビュー

レンダラー依存

Blender レンダー

ポストプロセスの辺

ポストプロセスの辺

ポストプロセスの辺

Blender レンダーでアンチエイリアスをかける

Blender Render では Render > Anti-Aliasing > Full Sample にチェックを入れる。ただしレンダリング時間は長くなる。

AA の設定

AA の設定

穴にできた線を消す方法

深度や法線で線を出す場合、眼窩に線が出やすい。このような穴にできる線は透明なポリゴンを張ることで防ぐことができる。

透明なポリゴンはレイトレース透過にし、影を生成しないよう設定する。Z値透過は精度の問題でフリンジが発生することがある。

穴のふた用マテリアル

穴のふた用マテリアル

マテリアル表示では透過して表示される

マテリアル表示では透過して表示される

Cycles

マテリアルの Ambient Occlusion・凸部分を使う

マテリアルの AO で輪郭抽出

マテリアルの AO で輪郭抽出

アンビエントオクルージョンの代わりにジオメトリノードの凸部分が使える。凸部分はローポリではうまく抽出できないが、ハイポリならば AO より高速でノイズも少ない。

ポリゴンが少ない場合は再分割曲面が使える

ポリゴンが少ない場合は再分割曲面が使える

ベベルノードを使う

ベベルノードと法線との差分を計算する。ミックスノードの差分をとる方法や、内積とアークコサインでベクトルの角度を計算する方法がある。

ノード

ノード

OSL で輪郭抽出

OSL で getmessage("trace", "geom:uv",...) や getattribute("geom:uv", uv) で UV 座標を取得する際に、Image Texture ノードを配置しておく必要がある。そうしないと OSL 上で UV 座標を取得できない。

フリースタイル

フリースタイルの線のみ取得する

バージョン 2.83 からは Eevee と Cycles でフリースタイルの線を取得できるようになった。「プロパティパネル > ビューレイヤー > Freestyle」でレンダーパスに出力にチェックを入れる。

フリースタイルの線をレンダーパスに出力

フリースタイルの線をレンダーパスに出力

ワークベンチレンダラーと組み合わせて交差線を出す

オブジェクトの交差する部分に線を出す

どちらかのオブジェクトを複製し、ブーリアンモディフィアを「交差(Intersect)」で追加する。

任意の場所の線を消す方法

  1. 「Ctrl + F > FreeStyle面をマーク」で輪郭線が出てほしくない面をマークする
  2. FreeStyleラインセット > 面マーク にチェックを入れ、面マークの設定を「排他」にする

外部リンク

基本編 06: FreeStyleの使い方とおすすめ設定

トゥーンシェードにおける Freestyle の使用例

FreeStyle 101: Edge Types(英語)



アドオン

Lineworks($20)

グリースペンシルの線にリグをつけるアドオン。メッシュに沿った線が描ける。


CHALK STYLE Wireframe

ワイヤーフレームとAOを合成した画像をレンダリングするアドオン。

「ギルティギア」シリーズ、輪郭線を自在に操る「背面法」実装テクニック【CEDEC2024】

線画抽出技法比較

LEARNING RESOURCES

モデリング・シェーディング・輪郭抽出等の NPR に関する情報のリンク集(英語)。

AI を使った輪郭抽出

SengaChan - 線画抽出

informative drawings で、ラフスケッチを描く

ノードベースの輪郭抽出


漫画用の線画をレンダリングする

漫画制作のためのblender解説まとめ

3DCGで背景を効率的に描こう!  漫画制作で使える3DCGの便利TIPS

ALGEBRAIC SMOOTH OCCLUDING CONTOURS

ALGEBRAIC SMOOTH OCCLUDING CONTOURS

Occluding Contour Breakthroughs, Part 1: A Surprisingly Hard Problem

Occluding Contour Breakthroughs, Part 2: Getting It Right

Occluding Contour Breakthroughs Part 3: Which Algorithm Should I Use (or Research)?

そのほか

GPU-Driven Real-Time Mesh Contour Vectorization

関連記事

セルルックを作る方法まとめ

Blender 記事の目次


広告
広告

カテゴリ