Blender の輪郭抽出技法まとめ
目次
- 概要
- 直接テクスチャや頂点に描く方法
- マテリアルのフレネルノードを使う方法
- ラインアート(2.93)
- 画像をグリースペンシルオブジェクトへ変換(2.91)
- 背面法(Inverted Hull)
- ソリッド化モディフィア
- ジオメトリノード
- ディスプレイスモディフィア
- ベベルモディフィア
- 辺分離モディフィア
- ジオメトリノード(3.1)
- フリースタイル
- コンポジター
- アドオン
- 一般的な構成
- ビューポートコンポジター(3.5)
- アンチエイリアス
- フィルターノードで線画抽出
- 法線/深度を使う
- ワールド位置を使う
- Cycles・Eevee でクリース・交差線検出
- 明度差/色を使う
- Object/Material ID を使う
- 覆い焼き(Dodge)を使う
- 頂点色を使ってソーベルの輪郭抽出をコントロールする
- 輪郭の太さを変更する
- 余計な線を消す方法
- オブジェクトの交差する部分に線を出す
- UV
- Cycles・Eevee
概要
有料なら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 | 〇 | △ | × | アウトライン・深度差のある場所・オブジェクト間で交差線が出せる |
StrokeGen | 〇 | × | × | アウトライン・深度差のある場所 |
コンポジター | 〇 | 〇 | × | 任意の場所。バージョン 3.5 からはリアルタイム表示可能 |
フリースタイル | × | △ | 〇 | 任意の場所・任意の辺(深度差・マテリアル境界・マークを付けた場所など)・クリース |
ラインアート | △ | 〇 | 〇 | 任意の場所・任意の辺(深度差・マテリアル境界・マークを付けた場所など)・面が交差している箇所・クリース・任意の場所(ベイクした場合) |
グリースペンシル | 〇 | ー | 〇 | 任意の場所に線を描けるが、更新は手動。最終調整用 |
フレネル
マテリアルのフレネルノードを使う方法。リアルタイムだが、ラインの幅が一定ではなく、出る場所のコントロールが困難。
背面法
背面法はモディフィアでメッシュの法線を反転させたポリゴンを生成し、裏面を描画しないマテリアルをそのポリゴンに設定することで、輪郭を描画する。背面法の利点は以下の3つ。
- リアルタイムで表示できる
- 入り抜きを調整できる
- オブジェクト単位で輪郭の色を塗りわけられる
欠点は以下の2つ。
- 線の位置が法線方向にずれる
- メッシュのセットアップが必要なので使い回しができない
細長いキューブ状のメッシュを配置することで任意の場所に線が出せる。消したいときはシェイプキー等でメッシュ内に隠す。
ソリッド化モディフィアのほかにベベルモディフィアも使える。こちらはリアルタイムで任意の辺に線を描画できる。
ソリッド化モディフィアを適用すると単純にポリゴンになるので、線の編集の自由度が上がる。
BEER(Blender Extended Expressive Render)
BEER の情報は bnpr で確認できる。BEER は線の描画をシェーダで行っている。
Freestyle がサポートされたカスタム Blender はこちら。BEER レンダラーを追加するアドオンはこちら。
advanced_line.glsl の線画抽出アルゴリズム
advanced_line はポストエフェクトで線画抽出を行っている。上下左右もしくはクロス方向にGバッファをサンプルして法線・深度・オブジェクトID を取得する。そしてシェーディング位置の法線・深度・ID とをそれぞれ比較して線を出すかどうかを判定している。
オブジェクトID が取得できるのでオブジェクト間の交差線が出せる。
外部リンク
— オリトイツキ (@MatchaChoco010) November 4, 2021
外部リンク
The Quest for Very Wide Outlines An Exploration of GPU Silhouette Rendering
1. Freestyle giving very accurate calculation, post process, super slow. XD
— Lightbwk (@Lightbwk) July 25, 2020
2. LANPR, almost realtime, GP
3. BEER outline, shader, realtime
4. Compositor outline, offline
5. Inverted hull, geometry, realtime
5 options fitting all workflows
Add Line material node
シェーダ・GLSL で線画抽出を行うノードを追加する。アルゴリズムが BEER と似ている。
StrokeGen
GPU を利用して輪郭抽出をする方法。GPU Zen 3 の "GPU-Driven Curve Generation from Mesh Contour by Wangziwei Jiang" がアルゴリズムで、その記事の著者による実装。
StrokeGen - A Realtime 3D line art renderer: Info & Feedback
コンポジター
コンポジターで輪郭を抽出するにはフィルターノードのラプラス・ソーベル・キルシュ・プルウィットを使う。これらのノードは色の差がある場所に線を引く。線のコントロールには法線・深度・UV・頂点色・テクスチャ等が使える。
コンポジターで行う輪郭抽出はリアルタイムで表示できず入り抜きも入れられない。加えて線の塗りわけも手間がかかる。しかし任意の場所に線を出せる、ノードの使い回しができる利点がある。ただし不要な線を除去するためのマスクを作成する作業は再利用できない。
コンポジターの一番の強みは、計算負荷がポリゴン数ではなくレンダリング解像度に比例することだ。巨大なシーンで線画を抽出する場合、コンポジターが一番レンダリングが速くなる。
深度と法線とを使う方法はメッシュのセットアップが不要で手軽だ。しかし線のコントロールが難しく、法線を使って線を出すとノイズが乗る。UV を使う方法は追加の UV のセットアップが必要だが、法線や深度を使う方法よりコントロールが効き、ノイズも比較的少ない。
セットアップの手間をかけずにコンポジターで輪郭抽出を行うには、Cryptomatte・深度・法線・UV・AOV を利用して、ソーベルで輪郭抽出する。
バージョン 2.93 からはアンチエイリアスノードが使える。
バージョン 3.5 からはビューポートでコンポジターの結果を確認できる。ただし 3.5 では深度や法線情報が利用できない。
バージョン 4.5 では AOV が使えるので、法線や深度情報も AOV 経由で取得できる。
フリースタイル
フリースタイルは破線や深度を使った入り抜きなど他の方法では実現できない機能を持つ。しかしフリースタイルには最大の欠点がある。入り抜きを入れると視点によっては途中で線が途切れる問題だ。これは動画では線のちらつきとして問題になる。現状(Blender 2.79)では避ける方法がないが、動画で使うときは入り抜きを使わないことで避けられる。スチルならばフリースタイルは有力な選択肢になる。
線を出したい場所に辺のみのポリゴンを配置すると任意の場所に線が置ける。
ラインアート
バージョン 2.93 からはラインアートが使える。ラインアートは CPU でエッジ検出のみを行い、描画にはグリースペンシルを使う。
ラインアートは任意の辺やマテリアル境界、交差線、クリースなどを、負荷が軽いシーン(二万ポリゴン以下)ならばリアルタイムに描画できる。線を出したい場所に辺のみのポリゴンを配置すると任意の場所に線が置ける。
さらに ラインアートはグリースペンシルオブジェクトに線画をベイクできる。そのため ラインアートは線画編集の容易さで他を圧倒している。加えてバージョン 2.93 ではグリースペンシルオブジェクトを SVG にエクスポートできる。
直接テクスチャや頂点に描く方法
テクスチャに描く
線の色を変更する必要がない場合、直接テクスチャに描く方法が簡単だ。線画用テクスチャとアルベドテクスチャが分離している場合は、シェーダで色を決めたり、視線によって線を非表示にすることもできる。
頂点色を使う
シェーダで頂点色を取得するには属性(Attribute)ノードを使う。
バージョン 2.81 からは頂点カラーノードが使える。
マテリアルのフレネルノードを使う方法
ラインアート
画像をグリースペンシルオブジェクトへ変換(2.91)
ドラッグアンドドロップで画像をシーンに配置し、「オブジェクト > 変換 > 画像をグリースペンシルにトレース」でできる。アルファがあるとうまく機能しない。
背面法(Inverted Hull)
背面法はモディフィアでメッシュの法線を反転させたポリゴンを生成し、裏面を描画しないマテリアルをそのポリゴンに設定することで、輪郭を描画する。メッシュの生成にソリッド化モディフィアとディスプレイスモディフィアとが使える。ソリッド化モディフィアを使う方が単純だが、線の入り抜きは頂点グループで行うことになる。それに対してディスプレイスモディフィアを使う利点は、線の入り抜きにテクスチャが使えることだ。
背面法はソリッド化モディフィアをつけたままでは、頂点グループを利用した線の入り抜き程度の装飾しかできない。しかしソリッド化モディフィアを適用してポリゴン化してしまえば、シェイプキーやラティス等を使って自由に線を変形でき、ポリゴン単位でマテリアルを変更できる。メッシュ内にポリゴンを縮小しておいて、シェイプキーを使って必要な部分に線を出すこともできる。
ジオメトリノードを使えば「ギルティギア」シリーズ、輪郭線を自在に操る「背面法」実装テクニック【CEDEC2024】で紹介されているようなテクニックも使える。
ソリッド化モディフィア
EEVEE
バージョン 4.1 以前
バージョン 4.2 以降
ソリッド化モディフィアの設定は 4.1 以前と同じ。
Inverted-Hull-Setup-Tool
EEVEE の背面法をセットアップするアドオン。
Cycles
Solidify modifier Contour/Outline(英語)
Blender Render
任意の場所に線を置く
細長いキューブ状のメッシュを配置することで任意の場所に線が出せる。線出し用のキューブは透明のマテリアルを適用する。消したいときはシェイプキー等でメッシュ内に隠す。
ただしこの方法で出した線は太さが2倍になる。線幅をコントロールするには、追加のソリッド化モディフィアを頂点グループで制御する。
ソリッド化モディフィアの線の太さを調整する
【Blender2.9】アウトラインを作成し、線の強弱をつける方法
線幅の均一化
線幅が均一化されていないと、パースがついた背景などでは3D感が強調されてしまう。
背面法で 線幅を統一するにはジオメトリノードを使う。ジオメトリノードで頂点グループにカメラからの距離を書き込んで、ソリッド化モディフィアでその頂点グループを指定するだけだ。
板ポリゴンで背面法を使う
ソリッド化モディフィアは板ポリゴンではうまく機能しない。これは前髪などで問題になることがある。
板ポリゴンで背面法の輪郭検出をする場合は追加のソリッド化(Solidify)モディフィアをつけることで輪郭を表示させられる。このとき輪郭抽出用のソリッド化が下になるようにする。
毛先の頂点を結合しない場合
髪をポリゴンでモデリングする場合、毛先を結合しないことがある。毛先を結合しない場合、四角形ポリゴンを維持できたり、格子状の UV 展開ができる利点がある。
毛先を結合しない状態で背面法を使う場合は、毛先の頂点の位置をそろえて、ソリッド化モディフィアを以下のように設定する。
- モード:複雑
- ソリッド化モード:コンストレイント
ソリッド化モディフィアのバグについて
バージョン 2.90 以前の複雑モードは法線が反転しないバグがある。バージョン 2.90 以前の複雑モードで背面法を使うには以下の3つの方法がある。
1. 法線反転用ソリッド化モディフィアを追加する
元のメッシュを編集する必要はないが、ソリッド化モディフィアが2つ必要になる。ポリゴン数が増えるため、アニメーションやレンダリングが遅くなる。
2. 元のメッシュの法線を反転させる
ソリッド化モディフィアが一つだけになる利点があるが、元のメッシュの法線が反転する。
3. ソリッド化とメッシュとのマテリアルを逆に設定する
ソリッド化モディフィアが一つだけになる利点があるが、元のメッシュのマテリアルが線画用マテリアルになる。
板ポリゴンでとがった輪郭線をつくる
板ポリゴンをソリッド化で立体化(こちらはモード:シンプルでも可)するときに、頂点グループで厚みをつけない部分を指定する。その後に「モード:複雑」のソリッド化モディフィアを追加すれば、板ポリゴンでもシャープな輪郭線が作れる。
髪の毛の毛先のモデリングの処理について pic.twitter.com/Ga6hdLwa1e
— つかばたー_(:3」∠)_ (@tukabutter3) December 17, 2019
色トレス
背面法のマテリアルにテクスチャまたは色を指定することで線に色を付けられる。
頂点を法線方向に動かす
ディスプレイスモディフィアを使えば、ソリッド化モディフィアを適用した状態でも線用ポリゴンを法線方向に移動できる。それには線用ポリゴンの頂点グループを作成し、ディスプレイスモディフィアの方向をノーマルにする。ディスプレイスモディフィアの強さはマイナスになる。
ベベルモディフィアで任意の辺に線を出す
ベベルモディフィアは頂点グループや辺ベベルでベベルをかける場所を選択でき、ベベル部分のマテリアルを指定できる。辺にベベルを設定するにはエディットモードのプロパティパネルで平均ベベルウェイトを設定する。ベベルモディフィアの線描画はリアルタイムに表示できる利点がある。
ディスプレイスモディフィアを使う
Line art flip normal thecnique but with more details, procedural thickness.#blender #b3d #lineart #anime #cellshading pic.twitter.com/PLiYqtwfDJ
— EriS (@Erisdraw3D) 2018年12月15日
背面法でディスプレイスモディフィアを使う場合の設定手順は以下のようになる。
- オブジェクトをリンク複製(Alt + D)する
- リンク複製したオブジェクトにディスプレイスモディフィアをつける
- リンク複製したオブジェクトに裏を描画しないマテリアルを設定する
- ディスプレイスモディフィアの強さで線の厚みを設定する
設定するマテリアルは基本的にはソリッド化モディフィアと同じだが、放射ノードと透過ノードとの位置が違っている。
マテリアルはデフォルトではメッシュに適用される。同一メッシュに別マテリアルを設定するには、マテリアルのリンクをオブジェクトに変更する必要がある。
アーマチュアで変形する場合は、ディスプレイスモディフィアの上にアーマチュアを配置する必要がある。
辺分離モディフィアで角度を使って線を出す
辺分離モディフィアを使えば角度をしきい値として線が出せる。ただし、辺分離モディフィアは板ポリを生成するので、追加のソリッド化モディフィアが必要になる。
ジオメトリノードで背面法
ジオメトリノードで背面法
シンプルな実装だと線にパースがついてしまう。
線幅の均一化
解説は線幅の均一化を参照。
カメラの FOV の変化に対応する
画面上での線幅は、「カメラと頂点との距離 * tan(FOV/2) 」を掛けるとカメラに依存しない一貫した線幅が計算できる。FOV = 2 * tan-1(センサーサイズ[mm] / 2*焦点距離[mm]) なので、最終的には以下の式になる。
カメラと頂点との距離 * センサーサイズ[mm] / (2*焦点距離[mm])
外部リンク
「ギルティギア」シリーズ、輪郭線を自在に操る「背面法」実装テクニック【CEDEC2024】
中途半端な線を消す
背面ポリゴンをカメラの向いている方向へ移動させることで、アウトラインのみを表示させられる。
「ギルティギア」シリーズ、輪郭線を自在に操る「背面法」実装テクニック【CEDEC2024】では頂点カラーにオフセット量を入力することで消したい頂点を指定している。ジオメトリノードでは名前付き属性(Named Attributes)で頂点色を取得できる。
外部リンク
「ギルティギア」シリーズ、輪郭線を自在に操る「背面法」実装テクニック【CEDEC2024】
外部リンク
ジオメトリノード(3.1)
・Blender3.1 1/7Ver以降 ジオメトリノードでアウトライン表示beta版
— 風見ひよこ (@weatherchick227) January 10, 2022
・エッジの抽出→メッシュを配置という実装。LineArt に似た方法
・ファイルはこちら(GoogleDrivehttps://t.co/ioZbt3VywQ pic.twitter.com/gt6bPtAYTQ
オリジナル版は重いので私が編集したノードのアルゴリズムを解説する。
バージョン 3.1 のジオメトリノードで辺の角度が取得できるようになった。そこでメッシュをカメラ方向に圧縮して辺の角度を強調し、圧縮後の辺の角度を閾値として抽出する辺を判定する。
ジオメトリノードの情報をシェーダに渡す
シェーダの属性(Attribute)ノードを使えばジオメトリノードの情報をシェーダに渡せる。
ただし辺の角度はある程度のポリゴン数が必要で、上の画像ではベベルを付けている。
他の手法との比較
背面法
背面法よりポリゴン数は少ない。ジオメトリノードを使う方法は必要な辺にのみカーブを実体化するからだ。ただしこのジオメトリノードの実装はカメラやメッシュが動くたびに再計算が発生するため、背面法の方が動作が軽い。
ラインアート
ラインアートより動作が軽い。ただしジオメトリノードを使う方法は交差線が出せない。
アルゴリズム
- 属性キャプチャノードで元の頂点位置を保存しておく
- カメラ方向へメッシュを圧縮する。これにより辺の角度が強調される
- 辺の角度ノード等を使い輪郭抽出
- 抽出した辺をカーブへ変換
- 保存しておいた頂点位置へ戻す
- カーブの太さを設定
- メッシュに再変換
- 線にマテリアルを設定
- ジオメトリ結合
辺の角度による線検出を追加したバージョン
コンポジター
コンポジターで行う輪郭抽出はフィルターノードのラプラス・ソーベル・キルシュ・プルウィットを使う。これらのノードは色に差があればそこに線を出せるので、設定を工夫すれば任意の場所に線を出せる。おすすめはソーベルとラプラス+ガウスぼかしだ。
ソーベルはプルウィットの中央に重みをつけ、ノイズを抑えるために平均化を行ったものだ。そのためプルウィットはあまり使われない。
キルシュはピクセルの八方向に輪郭抽出を実行し、差が最大のものを採用する。検出力が強い分ノイズも出やすい。
ピクセルの濃度差の一次微分をとる、プルウィット・ソーベル・キルシュはグラデーションでも輪郭を抽出できるが、ノイズが出やすい。ラプラスは二次微分をとり、より高性能だが前処理が必要になる。ラプラスは画像内にあるノイズに弱いので、前処理としてガウスぼかしがよく使われる。
バージョン 2.93 からはアンチエイリアスノードが使える。
拡張/浸食(Dilate/Erode)ノードとミックスの差分ノードとを組み合わせる方法もある。
一般的な構成
輪郭線・オブジェクト交差線・マテリアル境界が欲しいなら Cryptomatte を使う。
交差線・クリースが欲しいなら法線、Cycles でクリース検出を使う。
深度差が欲しいなら AO・深度・UV・ワールド位置が使える。
バージョン 2.93 以降ならアンチエイリアスノードが使える。
ビューポートコンポジター(3.5)
バージョン3.5 からはビューポートでコンポジターの結果が確認できる。
バージョン 4.5 では 法線・深度・AO・AOV・アンチエイリアスノード・Cryptomatte に対応しているので、深度や AO・法線・頂点色などを使ってリアルタイムでソーベル等を使って線出しができる。
ビューポートコンポジターを有効にする
ビューポートシェディングでマテリアルプレビューかレンダーを選択して、コンポジターを「常時」にする。
ノイズ対策
AO やディザー透過はノイズが乗るので、ぼかしノードの高速ガウシアンでぼかす。
アドオン
FreePencil
現在アドオンは削除されている。実装方法は頂点色を使ってソーベルの輪郭抽出をコントロールするを参照。
頂点カラーに線画用情報を書き出すアドオン。使い方は FreePencil を参照。
外部リンク
アンチエイリアス
コンポジターでアンチエイリアスをかけるならば、バージョン 2.93 以降で追加されたアンチエイリアスノードを使う。
アンチエイリアスノード(2.93)
バージョン 2.93 でコンポジターにアンチエイリアスノード(場所は「フィルター > アンチエイリアス」)が追加された。
しきい値(Threshold)と Contrast Limit はソーベルの結果に適用する場合にはほとんど影響がない。これらのパラメーターは画像のアンチエイリアスで意味がある。Corner Rounding を上げるとシャープネスがあがる。
ブラーを使った AA
カラーランプをつなぐ前にブラーをかける方法もある。ブラーの量が大きいと輪郭が太くなる。
デノイズノード(2.81)
バージョン 2.81 で追加されたデノイズノードを使うことでもアンチエイリアスがかけられる。
法線/深度を使う
法線のみを使う
以下のように 3 つの直交するベクトルとの内積をそれぞれ RGB として解釈させると、法線の検出力を調整できる。
単純な深度を使った輪郭抽出
深度は値が 0, 1] の範囲に収まらないので正規化が必要になる。正規化によって深度を [0, 1] の範囲に変換することで深度を色として解釈できるようになる。[エッジノードでは深度を対数に変換することで、カメラから見て手前にある深度の精度を上げている。
深度に色をつける
エッジノードは深度に色を付けることで深度の検出力をあげている。深度を正規化した後にカラーランプで色を付けると深度差が微妙な部分にも線が出せる。カラーランプのカラーモードを HSL にして、補間モードを時計回りにすると簡単に深度に虹色をマップできる。
ワールド位置を使う
AOV でワールド位置を出力すると役に立つことがある。深度と同じで正規化が必要になる。
ふたつを合成
Cycles・Eevee でクリース・交差線検出
AO
AO マテリアルを使ってクリース・交差線を検出できる。これを AOV でコンポジターに持ち込む。
Eevee ならビューポートでプレビューできる。
ベベルノード(Cycles のみ)
ベベルノードの法線とリアル法線との内積でクリースを検出する。
線を細くするにはベベルの半径を小さくする。ベベルのサンプル数は 50~100 ぐらいは必要になる。
拡張/浸食(Dilate/Erode)ノードとミックスの差分ノードとを組み合わせる方法
入力としては正規化した深度とミストが使える。
明度差/色を使う
明度差
カラーランプで線の出る範囲を調節できる。
色
上のカラーランプは明度差をコントロールし、下の方は他の色を引き算する強さを調整する。
Object/Material ID を使う
輪郭抽出したいオブジェクトに Object > Pass Index を設定。 マテリアルの場合 Material > Options > Pass Index。
オブジェクトのみを表示したいので、Render > Shading > Alpha を Transparent にする。Render Layer > Passes > Object Index にチェックを入れる。マテリアルの場合は Material Index。
以下のようにノードをつなぐ。ID Mask の Index に設定した ID を指定する。
覆い焼きを使う方法
覆い焼きでは明暗差のある場所に線を出せる。ソーベルやラプラスの代わりに使うこともできる。
頂点色を使ってソーベルの輪郭抽出をコントロールする
線を出したい部分に頂点色を塗って、ソーベル等で輪郭抽出する。頂点色を変更することで輪郭をコントロールできる。頂点色は AOV でコンポジターに渡す。
古い情報
Blender レンダーで頂点色を使ってレンダリングするには、マテリアルの「陰影なし」と「頂点カラーペイント」にチェックを入れて頂点色を使ってレンダリングする。Eevee では放射(Emission)ノードを使う。
輪郭の太さを変更する
拡張/浸食(Dilate/Erode)を使えば輪郭の太さを変更できる。
ブラーをかけることで、輪郭を太くできる。
インペイント(Inpaint)
線でない部分をカラーキー(Color Key)ノードでアルファ抜きすると、インペイントノードで輪郭線を太くできる。
頂点ペイント tips
頂点ペイント作業を効率化する Vertex Color Master for Blender アドオンがある。
マスクして塗るとエッジの効かせて色を塗れる。マスクする面は左クリックモードでは Shift + 左クリックで選択できる。
現状(バージョン 2.80)では頂点ペイントでテクスチャペイントのようにグラデーションをかけられない。グラデーションをかけたいときはステンシルテクスチャを作る。ステンシルテクスチャはマウス右ドラッグで平行移動。Shift + マウス右ドラッグで拡大縮小できる。
レンダリング設定
頂点ペイント用のレンダーレイヤーを作成し、マテリアルオーバーライドを使ってレンダリングする。マテリアルオーバーライドを使うとレンダリングするオブジェクトすべてに、指定したマテリアルを適用してレンダリングされる。マテリアルオーバーライドを使わない場合はオブジェクトを複製しなければならず、管理が面倒になる。
ノード設定
フィルタを使って輪郭を抽出する。
ノードで余計な線を消す方法
オブジェクトの交差する部分に線を出す
フィルタのキルシュを使う方法はセルアニメ風輪郭線の生成方法を参照。
レンダーレイヤーのマスクを適用してレンダリングすれば、ソーベルなどのフィルターで輪郭抽出できる。
UV を直接使う方法
UV 座標を使って線を出すこともできる。この方法は以下の利点がある。
- セットアップの手間が小さい
- 同時に深度も検出できる
- 辺のある場所ならば自由に線が描ける
バージョン 2.82 以降の Cycles とバージョン 2.92 以降の Eevee では AOV が使えるので、輪郭抽出用の UV をそのままコンポジターに持ち込める。
UV を使う方法では深度によっても線を抽出する。深度が異なる場所は UV 座標も異なる可能性が高いからだ。深度を使う方法で精度が不足する場合は UV を使うことで疑似的に深度を使った線を抽出できる。
手順
手順は簡単で線画抽出用UVを作成し「UVマッピング(U)> プロジェクション」でUV展開するだけだ。後は線が出てほしい部分のUVを縮小するか、移動するかする。
超簡単!blender 3d 輪郭線を抽出方法の『node』アニメ調に最適
三次元 UV を出力する
正面と横とから線画出力用のUVを作成し、色として出力する。3次元UVはマテリアルオーバーライドを使って色として出力する。
Cycles・Eevee
Cryptomatte(Cycles 2.80,Eevee 2.92)
Cycles ではバージョン 2.80 以降、Eevee ではバージョン 2.92 以降で Cryptomatte が使えるので、オブジェクトやマテリアルに ID を設定する必要はない。
バージョン 2.93 以降はレンダーレイヤーの Crypto* ソケットを Cryptomatte ノードにつなぐ必要はない。ただし「プロパティパネル > ビューレイヤー > パス」にチェックを入れる必要がある。マット ID にオブジェクト名が使えるようになった。
Cryptomatte を使うには、「プロパティパネル > ビューレイヤー > パス」にあるオブジェクトまたはマテリアルにチェックを入れ、コンポジターで Cryptomatte ノードにつなぐ。特定の色だけ取得したい場合は、オブジェクト名を入力するか、スポイトで色を取得する。
AOV を使う(Cycles 2.82,Eevee 2.92)
Cycles ではバージョン 2.82 以降、Eevee では 2.92 以降で AOV が使える。AOV を使えばコンポジターに必要なデータをレンダリングするのにマテリアルオーバーライドを使って何度もレンダリングする必要がなくなる。頂点色使えば頂点に任意のデータを格納できる。テクスチャにデータを格納しその UV 座標を出力する方法もある。
AOV を使うには、パスに Shader AOV を追加し、AOV Output ノードを使う。
Eevee は3Dビューのシェーディングのレンダーパスで AOV をビューポートでプレビューできる。Cycles はマテリアルプレビューの時のみプレビューできる。
レンダラー依存
Blender レンダー
ポストプロセスの辺
Blender レンダーでアンチエイリアスをかける
Blender Render では Render > Anti-Aliasing > Full Sample にチェックを入れる。ただしレンダリング時間は長くなる。
穴にできた線を消す方法
深度や法線で線を出す場合、眼窩に線が出やすい。このような穴にできる線は透明なポリゴンを張ることで防ぐことができる。
透明なポリゴンはレイトレース透過にし、影を生成しないよう設定する。Z値透過は精度の問題でフリンジが発生することがある。
Cycles
マテリアルの Ambient Occlusion・凸部分を使う
アンビエントオクルージョンの代わりにジオメトリノードの凸部分が使える。凸部分はローポリではうまく抽出できないが、ハイポリならば AO より高速でノイズも少ない。
ベベルノードを使う
ベベルノードと法線との差分を計算する。ミックスノードの差分をとる方法や、内積とアークコサインでベクトルの角度を計算する方法がある。
OSL で輪郭抽出
toon edges along the boundaries of vertex colors also can be drawn with OSL #b3d #OpenShadingLanguage pic.twitter.com/uEnP09n5aM
— irieぐぬー (@iRi_E) 2018年10月31日
OSL で getmessage("trace", "geom:uv",...) や getattribute("geom:uv", uv) で UV 座標を取得する際に、Image Texture ノードを配置しておく必要がある。そうしないと OSL 上で UV 座標を取得できない。
フリースタイル
フリースタイルの線のみ取得する
バージョン 2.83 からは Eevee と Cycles でフリースタイルの線を取得できるようになった。「プロパティパネル > ビューレイヤー > Freestyle」でレンダーパスに出力にチェックを入れる。
ワークベンチレンダラーと組み合わせて交差線を出す
ちょっと小ネタ
— どぶごんずい (@dovnzui) January 8, 2020
freestyleのチェックボックスを有効にしてレンダーエンジンをworkbenchに変えてもfreestyleは使える。これを利用してoutline有効にした状態でレンダリングすると交差した部分にもエッジが引ける#b3d pic.twitter.com/Py3TSGxDJo
オブジェクトの交差する部分に線を出す
どちらかのオブジェクトを複製し、ブーリアンモディフィアを「交差(Intersect)」で追加する。
任意の場所の線を消す方法
- 「Ctrl + F > FreeStyle面をマーク」で輪郭線が出てほしくない面をマークする
- FreeStyleラインセット > 面マーク にチェックを入れ、面マークの設定を「排他」にする
外部リンク
Little workflow hack that I used to add my basic Greasepencil Stroke outlines 😋
— Lua 🎏 (@luamono) March 17, 2020
(Just a little teaser, I will adress this more thoroughly in my artstation breakdown.)
#b3d #3dartist #madewithblender #greasepencil #Blender3D #3dart pic.twitter.com/JkkHSXEPI5
アドオン
Lineworks($20)
グリースペンシルの線にリグをつけるアドオン。メッシュに沿った線が描ける。
CHALK STYLE Wireframe
ワイヤーフレームとAOを合成した画像をレンダリングするアドオン。
外部リンク
「ギルティギア」シリーズ、輪郭線を自在に操る「背面法」実装テクニック【CEDEC2024】
LEARNING RESOURCES
モデリング・シェーディング・輪郭抽出等の NPR に関する情報のリンク集(英語)。
AI を使った輪郭抽出
informative drawings で、ラフスケッチを描く
ノードベースの輪郭抽出
Blenderのコンポジット処理のみで手書き風のセルシェーディングを実現するノードを作成しました.
— 大城 (@Magryllia) 2018年6月9日
一応データを置いとくので欲しい人はどうぞ.(https://t.co/jNSRjiqPZv)#Blender #b3d pic.twitter.com/2OO8vZJjPe
運動と同期して輪郭線の歪みとスピード線を生成するコンポジット処理を作ってみました.
— 大城🐈 (@Magryllia) 2018年11月3日
データ置いとくので(不完全ですが…)見たい人どうぞ.https://t.co/qb7y51FN0k#b3d #bnpr pic.twitter.com/iJJi3rNqZq
イラスト風画像加工アプリ " Olli " を模倣したコンポジット処理です.
— 大城🐈 (@Magryllia) 2018年11月10日
シンプルな画像に限ればそれっぽく見える気がします.ザリガニ画像はBoxsuiさんよりお借りしました
1枚目:オリジナル 2枚目:Olli 3枚目:コンポジット
↓データです(実用性はあまりないです)https://t.co/1KAaEojh4P #b3d pic.twitter.com/GoZqvqXc0L
I always get questions about how I do my outlines in my renders and this is the method I came up with. The freestyle settings don't always work so you have to get creative to get good outlines! #tutorial #blender #Blender3D #b3d pic.twitter.com/fEJpSbH1jJ
— Niall Stenson Art (@niallstensonart) October 30, 2019
Simple edge detection in Blender shader nodes
— Iyad Ahmed (@cgonfire) May 11, 2020
follow for more ^_#b3d #Algorithms pic.twitter.com/eGN5F86BDq
漫画用の線画をレンダリングする
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