・ToonTracerチュートリアル・

今回はシンプルなオブジェクトを使用して各エッジの発生を確認しながら進めます。
以下のチュートリアル用データをダウンロードし、適当なフォルダに解凍してください。

・SampleData・
・DownLoad・

 



1−1.グループIDとエッジの関係

グループIDとエッジの関係を知るために、まずbox.lwsを読み込みます。

読み込みが完了すると右の図のようになっていると思います。

・1-1-1・


このオブジェクトの各サーフェイスにはすでにCelPainterがセットされ、図のようにグループIDが割り振られています。

ピンクのサーフェイスは中心の1ポリゴンだけ別サーフェイスになっており、テクスチャが貼られています。

・1-1-2・

1−2.IDとエッジ種別


"シーン"タブの"イメージプロセス"ボタンを押し、開いた特殊効果パネルのイメージフィルタ追加ポップアップから"unReal:ToonTracer"をセット。

ダブルクリックしてToonTracerの設定パネルを開きます。

・1-2-1・


とりあえず全てのチェックを有効にしてパネルを閉じ、F9を押してレンダリングしてみます。

・1-2-2・


レンダリングしたイメージを見てみるとまだ完璧ではありません。
これはエッジ描画の対象グループIDが0しか有効になっていないため、ID1のピンクのサーフェイスは無視されたためです。

・1-2-3・


そこで再びToonTracerの設定パネルを開き、ID1も有効にします。

・1-2-4・


ここで問題が発生しました。
ピンクの面の中心はテクスチャを貼るために別サーフェイスにしてありました。
そのため、ToonTracerのサーフェイス境界が反応して線を描いてしまっています。

サーフェイス境界を無効にすればピンクのサーフェイスの問題は解決されますが、かわりにグリーンとオレンジのサーフェイスの境界まで無くなってしまいます。

・1-2-5・

この問題を回避する代表的な手法として以下の2つがあげられます。


A.グループID境界を使用する


まずサーフェイスエディタを開き、オレンジのサーフェイス(box3)を選択します。
シェーダータブを選択し、CelPainterをダブルクリックして設定パネルを開きます。
CelPainterの"グループID"スライダをドラッグしてグループIDを2に変更、パネルを閉じます。

・1-2-6・


次にToonTracerの設定パネルを開き、グループID0から2を有効にします。

そして"サーフェイス境界"を無効にし、グループ境界を有効にします。

・1-2-7・


これでレンダリングをすれば同じIDのピンクのサーフェイスには余計なエッジが出なくなり、IDを変えたグリーンとオレンジのサーフェイスにはちゃんとエッジが発生して望みどおりの結果になります。

・1-2-8・

B.強制排除を使用する


サーフェイスエディタを開き、テクスチャの貼られているサーフェイス(box_dec)を選択します。
シェーダータブを選択し、CelPainterをダブルクリックして設定パネルを開きます。
CelPainterの"グループID"スライダをドラッグしてグループIDを3に変更、パネルを閉じます。

・1-2-9・


次にToonTracerの設定パネルを開き、グループID0から2を有効にし、グループID3は強制排除(右の列)にチェックします。

そしてすべてのエッジを有効にします。

・1-2-10・


この方法でも余計なエッジを排除することができます。

・1-2-11・

・Tips・

今回は単純なオブジェクトだったのでどちらの方法でも同じ結果を得ることができました。
しかし複雑なオブジェクトになると使い分けが必要になってきます。

たとえば人の顔。
顔と白目の境界には線を出したくない場合、B.の方法を使うと下図のように目にかかる前髪の輪郭まで消えてしまいます(輪郭は見やすいように赤にしてあります)。

・1-2-12,13・

これは強制排除があらゆる種類のエッジを排除するためで、これを回避するためにはセルエッジレイヤーをもう一つ作り、前髪の線の設定を別にしてやる必要がありますが、使用レイヤー数を増やすのはあまりおすすめできません。

こういったケースではA.の方法を使った方がスマートにきれいな結果を得ることができます。

・1-2-14,15・

IDとエッジ種別、強制排除の組み合わせなどはパズルのようで複雑に感じるかもしれませんが、使いこなせれば余計な線を後からレタッチするなどの手間を抑え、効率よくイメージを作成できるでしょう。


2−1.法線の折り目その1

5つあるエッジ種別のうち、オブジェクト、サーフェイス、グループ境界は単純にレンダリングイメージ上での値が変化する部分に対して線を発生させます。
深度境界は隣り合うピクセルの深度の差によって線を発生させます。

しかし法線の折り目(旧バージョンではジオメトリエッジ)の発生条件はやや複雑です。
ここでは、法線の折り目がどのようにしてエッジを認識しているのかを見ていきます。


まず、plate.lwsを読み込みます。
シーンには各プラグインがすでにセットされた状態になっています。
・2-1-1・

右の図はシーンを上から見たところです。

カメラから見て角が手前に出る部分が山折り、奥になる部分を谷折りとして考えており、赤い円弧部分の角度がそれぞれのしきい値として判定される部分です。

ここがしきい値よりも小さくなる角をエッジとして処理します。

・2-1-2・

では実際に確認してみます。

ToonTracerの設定パネルを開き、"山折りの角度"を95度にしてみます。

このオブジェクトの角の部分は約90度なので、これで山折りの左側の角だけ線が出ます。

谷折りの設定も同様です。
・2-1-3,4・


次にオブジェクト"plate"を選択して回転、Hを-45度にしてキーを作成し、再びレンダリングしてみます。

すると右図のように線が消えてしまいました。

これが法線の折り目の欠点です。
・2-1-5,6・


右の図はシーンを上から見たところです。

赤い矢印はピクセルの法線になります。
法線の折り目は隣り合うポリゴンの法線を見るのではなく、レンダリングイメージ上での隣り合うピクセル法線を見るため、アングルによってはこのように法線の角度がなくなってしまい線が消えてしまいます。

これを回避するには現在のところ深度境界など他のエッジと組み合わせて補うしかありません。
・2-1-7・

2−2.法線の折り目その2

また、法線の折り目で参照する法線情報はシェーダー側で変更することができます。
EdgeTracer(下図左)ならグループID下の、CelPainter(下図右)なら"拡張設定"タブの"法線の種類"がそれで、ここを変更することでToonTracerに渡す法線情報を変更することができます。

・2-2-1・


右の画像はチュートリアルデータのBall.lwoをレンダリングした状態です。

サーフェイスにはバンプマップがされており、スムースオプションがチェックされています。
・2-2-3・

右の画像は法線情報を視覚的に表示したもので、RGBの赤の成分が法線ベクトルの要素Xを、YとZをそれぞれG,Bとして表示しています。

"法線の種類"を"スムース"にした場合はバンプマップによる法線の操作は無視され、サーフェイスパラメータのスムースオプションのみを見ます。

スムースオプションを切っている場合は次の"フラット"と同じ状態になります。
・SurfaceNormal : Smooth・

"法線の種類"を"フラット"にした場合はバンプマップ、サーフェイスパラメータのスムースオプション共に無視し、右のようにフラットポリゴンのような状態になります。

スムースと違ってポリゴン同士の角度がはっきり出るので、メカなどの硬質なオブジェクトの法線の折り目を出しやすくなります。
・SurfaceNormal : Flat・

"法線の種類"を"スムース+バンプ"にした場合はバンプマップによって操作された最終的な法線情報になります。

このモードを使用すればバンプマップによる凹凸部分にもエッジが描けます(あまり綺麗には出ませんが…)。
・SurfaceNormal : Smooth+Bump・

unRealでは「簡単設定でそこそこの効果」よりも「なるべく沢山のパラメータをいじれるようにして使用者の工夫で色々な効果が出せる」ように作られています。
そのためボタンが沢山あって最初は戸惑うかと思いますが、メインとなる機能の輪郭線描画についてはここで説明した点を抑えれば充分使えるようになると思います。