広告
広告

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

カテゴリ:blender

目次

概要

アンチエイリアス

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

ブラーを使った AA

アンチエイリアスノード

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

背面法(Inverted Hull)

厚みつけモディフィア

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

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

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

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

色トレス

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

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

ベベルモディフィア

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

フリースタイル

フリースタイル

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

コンポジット

法線/深度を使う

明度差/色を使う

Cryptomatte を使う

Object/Material ID を使う

覆い焼き(Dodge)を使う

UV

UV を直接使う

三次元 UV を出力する

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

レンダラー依存

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

Eevee

Eevee でビューレイヤーを使う

SSS の法線と色とに任意のデータを出力する

Cycles

コンポジットの SSS に任意のデータを出力する

マテリアルの Ambient Occlusion・凸部分を使う(Cycles のみ)

OSL で輪郭抽出(Cycles のみ)

応用編

輪郭の太さを変更する

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

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

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

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

外部リンク

概要

Blender で輪郭抽出する方法は大きく分けて3つある。背面法・コンポジット・フリースタイルだ。まだアルファ版だが、リアルタイムフリースタイルと呼べる LANPR も使える。最終手段としてグリースペンシルがある。

リアルタイム線の装飾線の出せる場所
背面法×深度差・辺・マテリアル境界
コンポジット ××任意の場所
フリースタイル×深度差・辺・マテリアル境界・マークを付けた場所など
LANPR深度差・辺・マテリアル境界・マークを付けた場所など
グリースペンシル任意の場所に線を描けるが、更新は手動。最終調整用

背面法

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

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

欠点は以下の2つ。

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

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

コンポジット

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

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

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

フリースタイル

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

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

LANPR

LANPR は Blender にリアルタイムフリースタイルと言える線画抽出機能を追加するプロジェクトだ。2019 年 8 月の時点ではまだアルファバージョンだが、GraphicAll で NPR で検索するとビルドをダウンロードできる。ブランチは soc-2019-npr。

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

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

外部リンク

LANPR Document Draft

LANPR 2019

Yiming's Blender Wiki Content Index


WYSIWYG NPR: Drawing Strokes Directly on 3D Models

Two Fast Methods for High-Quality Line Visibility

A modified ZS thinning algorithm by a hybrid approach

アンチエイリアス

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

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

AA の設定
AA の設定

ブラーを使った AA

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

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

アンチエイリアスノード

コンポジットにアンチエイリアスノードを追加するパッチ(Compositor: Add Anti-Aliasing node)がある。

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

テクスチャに描く

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

頂点色を使う

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

get vertex color
頂点色の取得

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

vertex color node
頂点カラーノード

背面法(Inverted Hull)で輪郭抽出

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

厚みつけモディフィア

Eevee

new method
Eevee で反転ポリゴンの設定
古い方法

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

eevee solidify
Eevee で反転ポリゴンの設定(古い方法)

Cycles

Solidify modifier Contour/Outline(英語)

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

Blender Render

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

設定まとめ

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

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

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

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

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

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

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

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

色トレス

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

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

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

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

bevel
ベベルで線を描く

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

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

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

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

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

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

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

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

コンポジット

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

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

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

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

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

外部リンク

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

OpenCVとVisual C++による画像処理と認識(7)

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

法線/深度を使う

法線のみを使う

フィルターのラプラス(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
ポストプロセスの辺

Eevee

ビューレイヤー

Eevee のビューレイヤーは 2.80 では使いづらい。2.80 は Eevee にはマテリアルオーバーライドが実装されていないので、以下の手順でレンダーレイヤーを作る必要がある。

  1. オブジェクトを独立したコレクションに移動させる
  2. そのコレクションをリンク複製
  3. マテリアルをメッシュではなくオブジェクトに適用するように変更
  4. オブジェクトにマテリアルを設定
  5. ビューレイヤーを作成し、設定
  6. レンダリング

SSS の法線と色とに任意のデータを出力する

SSS の色や法線に任意のデータを出力することで、レンダリング回数を減らせる。レンダリングの高速な Eevee でも、ビューレイヤーとコレクションの数を減らして管理を容易にする効果がある。

ただし法線が正規化されることに注意する必要がある。法線として出力されるデータは変化するので、変化してほしくないデータは色として出力する。以下の例では UV を法線として出力している。しかしコンポジットで UV マッピングノードを使うつもりなら、UV を色として出力する必要がある。その場合は正確な頂点色は取得できなくなる。

レンダータブの SSS にチェックを入れると同時に、アルベドを分離にチェックを入れる。バージョン 2.81 からは常に「アルベドを分離」オプションが有効になるため、チェックボックスは削除された。

eevee sss hack
ノード例と設定

Cycles

コンポジットの SSS に任意のデータを出力する

サブサーフェスのカラー(SubsurfaceCol)パスはサブサーフェスの色を直接取得できる。そこでサブサーフェスの色に任意のデータを出力して、コンポジットで取得し、コンポジットでシェーディングを行うといったことが可能になる。この方法の利点はレンダリング回数を1回削減できることだ。

ディフューズのカラー(DiffCol)パスで生のディフューズ色を取得でき、ディフューズの直接照明(DiffDir)でグレーのライティング結果を取得できる。コンポジットでシェーディングを行う際はこれらを利用する。

sss hack
コンポジットの SSS に頂点色を出力するノード

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

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

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

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

OSL で輪郭抽出

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

フリースタイル

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

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

CyclesでFreeStyleを使う

FreeStyle 101: Edge Types(英語)

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

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

Blender Render

背景を透過して、レンダーレイヤー > レイヤー > Freestyle にのみチェックを入れる。

blender render freestyle
Blender レンダーでフリースタイルの線のみをレンダリング

Cycles

背景を透過して、ビューレイヤー > フィルター > Freestyle にのみチェックを入れる。

cycles freestyle
Cycles でフリースタイルの線のみをレンダリング

Eevee

背景を透過して、すべてのオブジェクトに透過マテリアルを設定すれば取得できる。しかし 2.80 にはマテリアルオーバーライドがないので手間がかかる。フリースタイルのラインセットを削除すれば、フリースタイルの不要なビューレイヤーでフリースタイルのレンダリングを防止できる。

輪郭の太さを変更する

拡張/浸食(Dilate/Erode)

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

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

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

インペイント(Inpaint)

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

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

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

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

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

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

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

頂点ペイント tips

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

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

mask
マスク

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

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

レンダリング設定

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

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

ノード設定

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

ノード例

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

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

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

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

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

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

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

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

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

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

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

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


関連記事

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

Blender 記事の目次


広告
広告