BlenderでDistance Field Texture

BlenderでDistance Field Textureをやってみた覚え書きと解説。

ていうかDistance Field Textureって何?

Distance Field Texture(ディスタンス フィールド テクスチャ。日本語だと距離場テクスチャ?)とは!
マスク用のテクスチャで境界からの距離をグレースケールで格納したものであるッ!
というわけで資料
  1. ValveのPublicationのページSIGGRAPH2007の資料(PDF)
  2. 【距離情報によるテクスチャ画像のベクトル化】-Distance Field Texture Vectorization-
1が元ネタ。
2はヘキサドライブのブログ。とりあえず日本語で説明してくれているので、詳しい理屈に関してはそちらをどうぞ。
で、これの利点はなにかというと、 といったところ。一方デメリットは という感じ。
では行ってみよう!

まずはテクスチャを用意する

最初の難関。
distance field texture generator なんて単語でググるといくつも作り方やツールっぽいものが出てくる。
でも今回はBlenderで作る。
  1. アウトラインを用意

    ちなみにこれはBlender公式のロゴページから拝借したもの。
  2. 内側、外側の2つを用意してExtrude[E]
  3. UV展開。今回はBlendテクスチャを利用する。グラデーションの方向だけ合ってれば良いので適当に
  4. 法線の向きを確認して(Recalculate Outside, Flip Normal)奥側の頂点をShrink[Alt+S]
    角の部分などがいまいちなこともあるので適当に調整しておく
  5. もし内側に隙間ができているようなら適当に埋める。ここでは元のロゴを後ろに置いただけ。
こんな流れでできあがり。
ちなみに山形になっているのはShrinkする都合もあるけれど、この方が重なった部分がいい感じになるため。
円錐をたくさん並べてボロノーイを作るのと似たようなもの。
注意点としては、角の内側の部分の面がおかしくなっていたりするのでよく確認する。

こういう場所

Shrinkする前に頂点をRip[V]しておくと楽。


そしてマテリアルはこんな感じ。Diffuseは1.0の白でShadeless。前述のBlendテクスチャを適用。

細かい調整が要るかと思ってRampを入れてあるけど無くても良さそうなのでお好みで。
そしてレンダリングするのだけれど、Color ManagementのRenderをRawにする。
あと背景を真っ黒にするのも忘れずに。

あと今回はアンチエイリアスは切ってレンダリングした。
これはどちらが良いかは要検証。
これで素材は完成。
PNGファイル

使う

今回はCyclesを使用。
理由は私が使ったのがCyclesだったから。
というのは半分冗談で、CyclesはNode Editorだけでマテリアルの設定が一望できるし、なによりリアルタイムでプレビューできるから。これがありがたい。
もちろんNode Materialなどを使えばInternalでも同じような事はできるはず。
というわけで、マテリアルの設定はこんな感じ。

Image TextureのColor SpaceをNon Color Dataにするのを忘れずに。Rawで作ったからね。
Node EditorではColorRampのカラーの位置を数値で設定できないようなので、Addすると丁度真ん中に挿入されるのを利用すると良い。
このColorRampを直接いじったり、出力を利用してシェーダーを切り替えたりする。
下のは2つDiffuseを切り替えるようにしたもの。
大サイズ
以上で完了。

で、実際のところどうなの

というわけで、用意したのがこちら。

左をソースにして右のテクスチャを作成。そしてサイズを色々変えてみたのが以下。
なお、サイズを変えてみたというのは大きなものをリサイズした訳ではなく、Blenderでテクスチャをレンダリングする際にそのサイズでレンダリングしたという事。
大サイズ
左の上が512pxで下が256px、右の上が128pxで下が64px。
直線や円のような滑らかな曲線の部分は非常に効果的。
しかし解像度が低いと、鋭利な角が丸くなってくる。
比較用にソースの画像を普通のテクスチャとして使ったものと、それをColorRampを通してアルファテストのようにしたもの。
大サイズ 大サイズ
これだと同じようにColorRampを通しても輪郭の荒れがひどくなる。

次に輪郭を太らせる例。
こんなものを用意。サイズは256px。

それをこんなシェーダーでレンダリング

大サイズ
テクスチャの作り方で角を丸くしたりもできる。
四角の方の太らせた角がふにゃふにゃになっているのは、元のモデルの角部分の分割数が少なかったのが影響している様子。

そして合成。
合成にはMathのMinimum/Maximum、もしくはMixのLighten/Darkenを使う。
上記の2つの違いはValueかColorかの違い。グレーなのでValueで良いんじゃないかと。
こんな感じ。
大サイズ
上段が合成結果のDistance Fieldで、下段がColorRampを通したもの。左から順番に ちなみにMinimum(Subtract(1.0, テクスチャ1), テクスチャ2)というのはこんな風に接続するということ。

応用編

さて、ここからは応用編。
合成を利用すると、弱点だった角が丸くなるというのを回避できなくも無い。
理屈としては、交差して角になる辺を別々に用意しておけば良い、ということ。
たとえばこんなデータを用意して合成する。これが原寸で32x32px。

それをこんな風に合成してレンダリング。
大サイズ
大サイズ
ほら奇麗!32pxなんてサイズのテクスチャなのに!
なおUVにVector Mappingをくっつけているのは、反対側の色を拾ってこないようにするため。
今のところCyclesでは画像のリピート設定がないので、タイリングの回数制限なんかもこうやってやるらしい。
ちなみに元ネタはゲーム用なので、RGBAのチャンネルを別々に使ってテクスチャ1枚で行けるぜみたいな話になっているけれど、別にBlenderではそんな風にする利点はあまり無い。
修正が面倒になるだけなのでグレーで好きなだけ用意しましょう。
という訳で、さらにこんなものを用意して合成してみると

大サイズ
大サイズ
奇麗に抜けるとはいえ、なかなかに頭の体操。
最後にこれ。

大サイズ
もう少しスマートにわけられそうな気もするけれど。
さてどうなるでしょう。
大サイズ
Happy New Year!
さすがにここまでくると無理がある。
ちなみにこの数字の0の内側のところなどがポリラインのようになっているけれど、これが解像度の限界によるアーティファクト。
4ピクセルを頂点にした四角を直線で分割する、というような原理なので。
Blenderの中ではメタボールや流体シミュレーションのポリゴンメッシュ化も同じような原理でできていたりする。
inserted by FC2 system