広告
広告

Blender で輪郭抽出する方法まとめ

カテゴリ:blender

目次

概要

アンチエイリアスをかける

背面法

厚みつけモディフィア

厚みつけモディフィアを使う

厚みつけモディフィアの線の太さを調整する

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

ポリゴン貫通時に出るアウトラインの処理

ディスプレイスモディフィア

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

ベベルモディフィア

ベベルで任意の辺に線を出す

フリースタイル

フリースタイル

ノード

法線/深度を使う

明度差/色を使う

Cryptomatte を使う

Object/Material ID を使う

覆い焼き(Dodge)を使う

UV

UV を直接使う

三次元 UV を出力する

マテリアルオーバーライドを使って透過 UV をレンダリングする

レンダラー依存

ポストプロセスの辺(Blender レンダーのみ)

マテリアルの Ambient Occlusion を使う(Cycles のみ)

OSL で輪郭抽出(Cycles のみ)

応用編

輪郭の太さを変更する

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

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

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

穴にできた線を消す方法(Blender Render)

外部リンク

概要

Blender で輪郭抽出する方法は大きく分けて3つある。厚みつけモディフィア・ノードを使う方法・フリースタイルだ。

厚みつけモディフィア(背面法)

背面法の利点は以下の3つ。

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

欠点は以下の2つ。

  1. 任意の場所に線を出すのが難しい
  2. メッシュのセットアップが必要なので使い回しができない

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

ノードを使う方法

ノードを使う方法はリアルタイムで表示できず入り抜きも入れられない。加えて線の塗りわけも手間がかかる。しかし任意の場所に線を出せる。ノードの使い回しができる利点もある。

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

フリースタイル

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

chasm
線の途中に入った切れ目

LANPR

LANPR は Blender に線画抽出機能を追加するプロジェクトだ。リアルタイムフリースタイルと言える DPIX(とその CPU 実装)と、法線と深度とを利用したリアルタイムソーベル輪郭抽出の Snake とがある。2018 年 10 月の時点ではいまだアルファバージョンですらないが、soc-2018-npr ブランチをソースからビルドすれば、その線画抽出機能はテストできる。

LANPR の DPIX は辺を構成するポリゴンを2枚取得し、視点から見て1枚が裏を向きもう1枚が表を向いているとき、その辺に線を引く。

dpix algorithm
DPIX の基本的なアルゴリズム

アンチエイリアスをかける

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

AA の設定
AA の設定

ブラーを使った AA

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

ブラーを使った AA のノード
result
ブラーを使った AA の結果

背面法で輪郭抽出

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

厚みつけモディフィア

Eevee

マテリアルの Blend Mode を Alpha Blend にしないと透過しないことに注意。

eevee solidify
Eevee で反転ポリゴンの設定

Cycles

Solidify modifier Contour/Outline(英語)

Cycles の背面法も基本的には Eevee と同じだ。厚みつけモディフィアで輪郭用ポリゴンを作り、マテリアルを割り当て、シェーダで不要な部分を透明にする。

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

Blender Render

入りと抜きがある色っぽい線を作る

設定まとめ

厚みつけモディフィアの線の太さを調整する

入りと抜きがある色っぽい線を作る その2

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

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

edge is not visible
板ポリゴンでは機能しない

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

solved
輪郭抽出用の厚み付けが下

ポリゴン貫通時に出るアウトラインの処理

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

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

bevel
ベベルで線を描く

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

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

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

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

material eevee
Eevee のマテリアル。厚みつけの場合とはノードの位置が違っている

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

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

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

ノードを使った輪郭抽出

ノードを使った輪郭抽出法はフィルターノードのラプラス・ソーベル・キルシュ・プルウィットを使って輪郭抽出する。これらのノードは色に差があればそこに線を出せるので、設定を工夫すれば任意の場所に線を出せる。

法線/深度を使う

法線のみを使う

フィルターのラプラス(Laplace)やソーベル(Sobel)を使えば法線を線画に変換できる。

法線とラプラスとを使って輪郭抽出するノード
result
法線とラプラスとを使った輪郭抽出の結果

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

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

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

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

深度を使った輪郭抽出
結果
結果

深度に色をつける

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

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

ふたつを合成

手軽な方法
個別に調整可能なノード
Depth+Normal
深度と法線の合成

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

エッジノード

明度差/色を使う

明度差

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

明度差を検出する

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

赤を検出する
結果
結果

Cryptomatte

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

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

cryptomatte
Cryptomatte のデモ
picker demo
特定の色だけ取得する

Object/Material ID を使う

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

オブジェクト ID の設定
オブジェクト ID の設定
Material ID
マテリアル ID の設定

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

オブジェクト ID の入力
オブジェクト ID の入力
アルファを有効
アルファでオブジェクトのみを表示

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

ID 検出ノード
for Material
マテリアルの場合
結果
レンダリング結果

blender - 鏡音リン(4)

UV を直接使う方法

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

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

欠点は以下の4つ。

  1. 透過マテリアルがあると使えない
  2. 任意の場所に線を出せない
  3. テクスチャを使う場合は2回レンダリングが必要

UV を直接使う方法の一番の欠点は透過マテリアルを使えない点だ。透過マテリアルがあると UV パスは何も出力しない。透過マテリアルごと UV をレンダリングする場合は、マテリアルオーバーライドを使って UV をレンダリングすることで UV を使って輪郭を抽出できる。

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

手順

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

szanne uv
UV 例
node
UV から線画を抽出するノード
result
レンダリング結果

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

三次元 UV を出力する

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

uv
UV 例
uv map
線画用UV
material
オーバーライド用マテリアル

マテリアルオーバーライドを使って透過 UV をレンダリングする

マテリアルオーバーライドを使う場合、マテリアルは透過なしか UV ごと透過するかになる。透過無しマテリアルでオーバーライドする場合は UV パスがそのまま使える。UV を色としてレンダリングする場合のマテリアルは以下のようになる。

material settings
UV をレンダリングするマテリアル
composite node
UV を色としてレンダリングした場合のコンポジットノード例

覆い焼きを使う方法

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

覆い焼きのノード
non dodge
ソース画像
dodge
輪郭抽出

レンダラー依存

ポストプロセスの辺(Blender レンダーのみ)

postprocess-edge
ポストプロセスの辺

マテリアルの Ambient Occlusion を使う

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

OSL で輪郭抽出

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

フリースタイル

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

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

CyclesでFreeStyleを使う

FreeStyle 101: Edge Types(英語)

特定の部分の線を出さないようにする方法

輪郭の太さを変更する

拡張/浸食(Dilate/Erode)

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

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

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

インペイント(Inpaint)

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

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

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

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

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

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

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

頂点ペイント tips

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

mask
マスク

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

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

レンダリング設定

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

render layer setting
レンダーレイヤーの設定

ノード設定

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

ノード例

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

フリースタイルとブーリアンを使う方法は交差した部分に線が出ないんですけど…を参照。

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

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

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

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

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

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

穴にできた線を消す方法(Blender Render)

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

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

transparent material
穴のふた用マテリアル
top
マテリアル表示では透過して表示される

関連記事

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

Blender 記事の目次


広告
広告