Tech Notes

トゥーンレンダリングのアルゴリズム雑まとめ

調べてもなかなか(自分にとって)的確な記述が出てこなかったので、(自分にとって)分かりやすくまとめ。

以下の二点に絞って解説する。

  1. 輪郭線を描く。(エッジレンダリング)
  2. 影の彩色を不連続にする。(セルシェーディング)

輪郭線の描画

輪郭線の分類

手書きイラストだと特に分類もなく存在する輪郭線だが、3DCGではアルゴリズムを考える都合上いくつかの種類に分類する。

  • A: 物体と他物体または背景との間の輪郭線

  • B: 1物体の中の輪郭線

  • C: 2物体の交差する(めりこむ)輪郭線

  • D: 稜線

調べてみて出てきた主なアルゴリズム

  • 裏ポリレンダリング
    • 通常のオブジェクトの描画に加えて、オブジェクトを少し法線方向へ膨らませたオブジェクトを黒で描画して輪郭線とする。ただし膨らませた真っ黒のオブジェクトをそのまま描いても元のオブジェクトを覆い隠すだけなので、法線の向きを反転させる。すると裏面カリングにより、黒オブジェクト側は本来書かれる面が描かれなくなることで元オブジェクトを覆わなくなる。
    • A,Bのタイプの輪郭線を描画することになる。処理が軽いらしい。Cは原理的に描かれない。
  • 法線バッファ微分
    • 法線ベクトルの向きの不連続になっている場所をとる。
    • A~D全てを描画できるが、原理上、同じ向きを向いている面が二つ重なっているとその間の輪郭線はとれないため、後述の深度バッファ微分と併用する。ポストエフェクトの類なので重いらしい。
  • 深度バッファ微分
    • カメラからの距離の不連続になっている場所をとる。
    • D(稜線)以外が描ける。これもポストエフェクトの類なので重いらしい。二回微分とれば稜線もいけるんじゃないかって気がするけど未確認
  • 法線視線角
    • 「ポリゴンの法線の向き」と「視点からポリゴンの向き」の成す角が90度に近ければポリゴンを真っ黒に塗りつぶし輪郭線とする。
    • 線の太さは一切安定しない。普通のイラストっぽくなることを望むべくもないが、そういうものとしての味は出る。
    • これをやる場合モデルを作るにあたって必ず多少丸みを持たせなければいけなくなる。

おまけ:輪郭線はともかく、稜線はもともとモデルに描いてしまうという手はある。

影を不連続にする

Rampシェーダという有名なシェーダアルゴリズムがあるらしい。

通常のシェーダで光による陰影をつける際は、光線のベクトルとポリゴンの法線のベクトルの内積をとって明るさを算出するのが基本だが、Rampシェーダではそこに一工夫加える。光の当たり具合を数値にして、Rampテクスチャと言われる専用のテクスチャからその数値の場所の色をとってきて明るさとする。

要するにテクスチャを関数代わりにして、本来連続的に変わるはずの明暗を不連続にしてイラストっぽくするという手法。Rampテクスチャを差し替えれば色々な影の付き方にできる。便利。

さらに影の色味を場所によって変える「SSSテクスチャ」という技法もあるらしい。この辺に詳しい。イラストにおいては人の肌の影はやや赤みのある色で塗ったりするものだが、そういうのが再現可能になる。

以上、雑まとめ。