複数のtoon.bmpを適用した出力画像の重ね合わせによる陰影の重層化その1〜序・トゥーンの仕組み

はじめに

http://gyazo.com/f7fda233071ee5b7ff4f7774adadd7f3.png]
MikuMikuDanceスターターパックでも解説した、「白色モデルにさまざまなtoon.bmpをかけ合わせた動画を複数出力して合成し陰影を重層化する加工」の解説をします。
この技術を活かした動画の構想はあるのですが、どうもやる気が出ない制作が滞っていて完成の目処が立たないので、先に技術紹介だけやってしまいます。正直俺以外にだれがこんなのやるんだって感じがしますがまあ一種のバカテクギャグということで…。

  • 資料

http://www.mediafire.com/?66i5ixhubte71u0
資料としてモデルデータ、NiVEのプロジェクトファイルをアップしておきます。参考にするなり応用して使うなりはご自由に。(メディアファイアーは広告がうざいですが、上げる側としては管理が楽なので…)

MMDのシェーダー・セルフシャドウとはどういうものか

標準のミクモデルの材質を単一のtoon.bmpで設定
http://gyazo.com/9f45880dd42cba1469fef57c4cee7b53.png


左からMMDデフォで使われている一段階トゥーン。それのセルフシャドウオン。
上から下への単純なグラデーション。中央付近が一番濃くなるような両サイドグラデーション。
toon.bmpは円筒を横倒しにしたような感じで、上から光源に対してポリゴンが表向きに平行、一番下が光源に対して裏向きに平行、というように適用されるとイメージしてみてください。
グラデーション状にすると、微妙な凹凸が陰影に反映されて立体感が強調されます。中央部が濃くなるようなグラデーションはななみさんモデルなどで使われていたりします。以前toon.bmpグラデーション化の新たな方法 - えむえむでえで紹介したテクです。


【MMD】セルフシャドウ説明‐ニコニコ動画(9)
【MMD】セルフシャドウ説明 - ニコニコ動画
セルフシャドウについては「左下1ピクセルのみがトゥーン色として使われる」と説明されていますが、これは「セルフシャドウモードでは左下1ピクセルのみでシェードが決定され、それ以外の部分は無視される」ということです。極端に言うと、toon.bmpが1*1の解像度でも1000*1000の解像度でも同じ結果が出ます。
※toon.bmpの解像度についてはtoon.bmpの話 - えむえむでえを参照。解像度で補間の差が出ます。

MMDレンダリングは材質に対してtoon.bmpを乗算して表示される

http://gyazo.com/dce1ff24d29368365dddaf326ef81702.png
http://gyazo.com/d3af82506f2cb93eb1b648ecb3322554.png
MMDのトゥーンは元材質の発色にtoon.bmpを乗算した結果です。
左は全面白トゥーンで陰影が出ていません、右は全面黒を適用して真っ黒に塗りつぶされています(ただしspecularの光沢は出ています)。

toonの仕組みを単純なオブジェクトに適用

http://gyazo.com/5ea59538b4f86864233d2f9a4c6d8de4.png


球にトゥーンを適用したものです。上の■はセルフシャドウを落とすため。
セルフシャドウは色の推移する範囲が案外広く、また光源側にやや食い込んでいるのがわかると思います。
Mによると、これはセルフシャドウの精度に絡んで陰影が汚くなるのを防ぐためにこうなったそうです。

なぜシェーダをコントロールしたくなったか

自分の動画を見てもらうとわかりますが、もともと階調のハッキリしたトゥーンレンダがあまり好きではなくグラデーションタイプのtoonを多用していました。

セルフシャドウモードが実装されたときは感動しましたが、

  • 陰影の調子がMMDの設定で一様に決まってしまう
  • 落ち影の精度にどうしても限界がある

という点がどうしてもクリアしたくなり、工夫してみたという感じです。

複数のtoon.bmpを適用した出力画像の重ね合わせによる陰影の重層化その2〜素材の作成

素材作成

実際に使う素材は基本4パターンです。
ミクと球は真上から照明をあてた例。博霊神社はより実践的な画像です。
toon.bmpの解像度などにも細かい理由はありますが割愛。

原版

toon.bmpは白一色
http://gyazo.com/463e196262b84b2c3afbe2a7dab0e9f9.png
http://gyazo.com/7fdff818fce96c4d43999b070b3e9829.png

以下は材質設定をすべて真っ白(アルファは0.999)にしたモデルを使用。エッジラインはオフにしてあるが、あってもなくても変わらないかもしれない。

セルフシャドウ

(0.0.0)の真っ黒を適用
http://gyazo.com/bad2f1e259c142f6211528e88bd47613.png
http://gyazo.com/eb038ddba26e2c7cb2106346260bda3e.png

セルフシャドウキャンセル

セルフシャドウの陰(物から落ちる"影"ではなく裏側の陰部分)を消して落ち影のみを取り出すための素材
http://gyazo.com/2f38ee7a946a11e2e42f5aef7fa29bf1.png適用toon.bmp
http://gyazo.com/4c01293cf3b0186054761ebe668a4280.png
http://gyazo.com/ae3fb68ec22abeb91a914ec53acc5bfa.png

陰影補正

陰影の調子を調整するための素材
http://gyazo.com/da8dfaaa2da9c5b2340377de21908e26.png適用toon.bmp
http://gyazo.com/44a1feee40ede525d2108411b7281890.png
http://gyazo.com/85feac49a93ffd4d98ba1d02081243c9.png

素材作成の手法

これら4パターンの出力をする際にいちいちすべてモデルを差し替えるというのは現実的ではありません。そのため、現在のMMDの仕様を利用します。
また、使用するモデルはすべてpmdデータになり、xファイルのアクセサリは使いません。


http://gyazo.com/c623078fff4402936aeb7bd31030789c.png
MMDをふたつ用意し、適当にそれぞれ名前をつけておきます。
http://gyazo.com/7474c4cacf41cc4ba77daca71129ac75.png


使用するモデルは「Model」フォルダ直下におき、toonは1種類にまとめてしまいます。PMDeditorのプラグイン「EdgeOn」を使うと便利。こちらが「MMD通常」に置くモデル。
適用するtoon.bmpは同じフォルダ内に。
http://gyazo.com/e3ca13979652368fd6707c2ac6f60b77.png
http://gyazo.com/c963dce9fbc130356faf7adcb90d7107.png


MMD影」には素材を白一色にし、モデルのpmdファイル名やtoon.bmpを通常版と同じ名前にしたモデルを置きます。
http://gyazo.com/a15955d6285c35a93f3acabbcd706cf9.png
http://gyazo.com/4920b6cb7afeb9bb12f89a26ff53184e.png


こうしておくことで、「MMD通常」で作成したpmmファイルを「MMD影」で読み込むと自動的にモデルがすべて入れ替わります。pmdモデルはModelフォルダ直下にあるファイルが優先的に読み込まれることと、またボーンや材質が異なっているモデルを読みこむとMMDが落ちてしまいますが、材質設定だけなら変更されていても問題がないからです。
また、白モデルに適用するトゥーンは複数の種類がありますが、これはbmpファイル名をその都度リネームすることで対応できます。この場合はT01.bmpが適用されるtoonになるということです。

物理演算について(この項目は現在必要なし。詳しくは次項にて)

この技法を使う場合、まったく同じ挙動で複数のaviファイルを出力する必要があるため物理演算が使えません。
そのため物理演算を使うならVMDviewの機能を利用します。
http://gyazo.com/c234e3e978f4f806e470e639e6e4ec7b.png

  • モデル・モーションデータを読み込み
  • 編集→Fixモーションで再生
  • ファイル→現在のモーションを非物理化保存

で物理演算をvmdに固定化しMMDに戻します。
データ量が増えすぎて困る場合にはこちら文化ヒナゲシ制作所雑記帳 VMDsimpliphy ver0.0.3公開のツールを利用させてもらってもいいでしょう。

2010/09/16追記 物理演算再現テクニック

みくだん 物理演算の同一結果出力方法
【MMD】賊・女子中学生の物理演算検証 〜常識を覆せ!〜【検証動画】‐ニコニコ動画(9)
【MMD】賊・女子中学生の物理演算検証 ~常識を覆せ!~【検証動画】 - ニコニコ動画


物理演算の再現方法が発見されました。

  • MMDを起動して一回目のavi出力なら同一の物理演算挙動が出力される

ということですね。
モデルの材質差し替えなどは関係がないので、これを利用すればVMDViewでの物理Fixはしなくてもすみます。

複数のtoon.bmpを適用した出力画像の重ね合わせによる陰影の重層化その3〜NiVEでの合成

NiVEでの合成

ここからはNiVE1を使って素材を合成します。プラグイン「レベル補正は必須です。
ちょっと専門的な話題ですが、意図的にクリッピングを利用するので、内部的に色深度が32bitで処理されているらしいAEでは同じことができないかも?

読み込みから落ち影を整えるまで

まず素材ファイルを読み込みます。
「*」は「素材」を示す記号としてつけています。
http://gyazo.com/e686ee17338b1aceefb0f22c1367b41b.png


白(255.255.255)のカラーイメージを作成して読み込み「落ち影」とリネームし、「*セルフシャドウ」を乗算します。
http://gyazo.com/dc3dc17acad6bcd6596e67ac09c28e1b.png


「レベル補正」をこのようにかけ、中間のグレーを飛ばします。
http://gyazo.com/b36f6260166fd68dbf2e4e6c3397117f.png
http://gyazo.com/ea9456c809ccc5a4c3f1469fa1500ca3.png
http://gyazo.com/78ed862190810970d0b784f446c704bf.png


また、別にアイテムのシャドウコピーを読みこみ「*セルフシャドウキャンセル」をコピーし、「色調反転」をかけて白黒を逆転させ「@反転セルフシャドウキャンセル」とリネームします。「@」はシャドウコピーを示す記号とします。
http://gyazo.com/722af9b47134b21e1486e43ff166322f.png
http://gyazo.com/18c61a7a1740a32d01ce24f0277a14e9.png
http://gyazo.com/f286ad52dfc2b67386b33db76f8edecc.png


さきほどの「落ち影」に戻り、「@反転セルフシャドウキャンセル」をスクリーンで合成。
これで陰影の落ち影部分を取り出すことができました。
陰影のうち、光源の裏側にあたる面の陰が「*セルフシャドウキャンセル」であり、それを反転してスクリーン合成(乗算の逆で、明るくなる)をかけることで陰影のうちのものの「陰」の部分をクリッピングで白飛びさせて飛ばしているわけです。
http://gyazo.com/7f49d90b7d878222839a859ac09893b6.png
http://gyazo.com/745b818dd787ed9cad413fb8ad37376f.png


セルフシャドーの落ち影を整えるため「ガウスブラー」をかけ、ブラーをかけることによって影が少し縮小してしまうので「グロー」を焼きこみ(リニア)で適せんかけ影を膨張させます。
これでセルフシャドーのノイズがとれました。
http://gyazo.com/0a1e204d8f70b44888124a995e63e22e.png
http://gyazo.com/61a0abb5bac66bbc48466229bcd4bfac.png
http://gyazo.com/db45f597169cf89eb3da7e2da095b497.png



再度シャドウコピーを読み込み、「落ち影」をコピーし「@落ち影」とリネームしておきます。なぜこんなことをするかというと、ブレンド合成したアイテムをさらに他のアイテムにブレンドしたいときには、シャドウコピーを経由させないとエフェクトがかかる前の素材の状態で合成されてしまうからです。

陰影の統合

別に白イメージを読み込み「陰影合わせ」とリネームし「*陰影補正」を乗算した上で以下のように「レベル補正」をかけます。
http://gyazo.com/717154f0aec6464b93e604f19a786afb.png
http://gyazo.com/27b456d5d25f7df27d7e50d4669519fc.png
http://gyazo.com/f7bf4e6d9e49cc2d034ef72485341888.png


さらに「@落ち影」と「*セルフシャドウキャンセル」を乗算します。
http://gyazo.com/1e280ddc09203b4df7a3e6310c4211c8.png
http://gyazo.com/8e328e94e6f06167ebc8c31bf2b3c700.png


仕上げに「レベル補正」のRGBモードなどで少し色味をつけます。白色部分には色がつかないよう、陰影のみに色をつけます。これは最後に合わせるときにわかるのですが、陰影を単なるグレーにせず色相の変化をつけることで色に深みを出すためです。
http://gyazo.com/75c34da0031327920ac6fbe04c89784d.png
http://gyazo.com/c8571a5f9a03705ebb87dc22111469cc.png
http://gyazo.com/dcdd3a6ee357971c13e00bd28a66c76f.png


また、これなら最初から単純に「*セルフシャドー」にブラーをかけるだけでもいいようにも思えますが、それだと陰影からキレがなくなってズレやすくなることと、このあと行う陰影の中に光を入れる合成をするために落ち影の分離する必要がありました。

陰影の中の光

「陰影の中に入っている光」を作ります。基本的な概念はこちらの動画から学ばせていただきました。
きぃら〜☆的お絵描き講座2♪【色塗前の基礎知識編】‐ニコニコ動画(9)
きぃら~☆的お絵描き講座2♪【色塗前の基礎知識編】 - ニコニコ動画


白イメージを読み込み「反射光裏側」とリネーム。「*陰影補正」を乗算し「色調反転」をかけ「@反転セルフシャドウキャンセル」を乗算します。
http://gyazo.com/86f343c76e00c3d8a15d82311b872a24.png
http://gyazo.com/54bfc3c5cee1537db0271d363c48a458.png
http://gyazo.com/7e4a977547d1026a0426bc224ec26554.png
陰影の中の「裏の陰側」が白くなっているのがわかると思います。


「レベル補正」で陰影を整え、さらにもうひとつレベル補正をRGBなどでかけ色味をつけます。おもに地面からの照り返しなので、草の緑を意識。これは黒地に色がつかないようにします。
http://gyazo.com/8f324bce0e0b8b33ee4ed90919333e7e.pnghttp://gyazo.com/979e0ff216d37ff91b1c149ee083219e.png
http://gyazo.com/3e934cc0e260b4ee8e0ef42ada2d9e41.png
http://gyazo.com/d5a7f63c86317c96ad39b4933cb41b03.png


また別に白イメージを読み込み「反射光落ち影」とリネームし、「@落ち影」を乗算し「色調反転」をかけます。落ち影の部分が白く抜けることになります。
http://gyazo.com/ed57f2fa76c73c085dceb25409c98607.png
http://gyazo.com/29edca7daa48278ebedc3f73b44cc34d.png
http://gyazo.com/7ef607e6bb0b9567378fe95952510158.png


さらに「*陰影補正」を乗算し、さきほどのようにレベル補正を2重にかけ陰影を調整し色味をつけます。今度は黄色っぽくしてみました。
http://gyazo.com/3b40ff581d63717a0596ba79cb0a76bf.png
http://gyazo.com/f6bd9d013864c48b9297d8a2688d88e1.png
http://gyazo.com/69e73ff69f6eeaca5ef2dce2b1db367a.png

全体を統合しバランスをとる

「陰影合わせ」「反射光裏側」「反射光落ち影」のそれぞれのシャドウコピー「@陰影合わせ」「@反射光裏側」「@反射光落ち影」を作成しておきます。
白イメージを読み込み「統合参照」とリネームし、「@陰影合わせ」を乗算で、「@反射光裏側」と「@反射光落ち影」を焼きこみ(リニア)で合成。
合成順を「後ろ」にしておき、それぞれブレンド率を調整して全体のバランスを見ます。
http://gyazo.com/95c48345229bdb7ae45bcb654ac7daa6.png
http://gyazo.com/dbac00f07e3525e4f55cc525ed6bea88.png
http://gyazo.com/456152684bd457c0ebc08b6583672f07.png


同時に「統合参照」のシャドウコピー「@統合参照」を作成し、これを「*原版」に乗算して完成形もチェックし、各種レベル補正なんかの微調整をしたりして仕上げです。
http://gyazo.com/c2fc5b7f182052b1c383f9fa119a3138.png
http://gyazo.com/22e2109eb50e66545abb6d5fefb37dc9.png
http://gyazo.com/15ece7619d96d87ef017f4715a168304.png


あとはこれをプリコンポーズしてほんの軽くブラーをかけてノイズをごまかしたり色調を補正したり。最近は彩度のトップを落とすのがマイブーム(死語)です。
http://gyazo.com/512a06ac31fdeb20794644e7af6d14c9.png
http://gyazo.com/f7fda233071ee5b7ff4f7774adadd7f3.png

まとめ

合成の組み立てはけっこう複雑でめんどくさいものの、一度テンプレを作ってしまえばあとはNiVEの「アイテムの入れ替え」を使って素材を入れ替えればいいという感じ。

しかしまあ、完成した絵を見て、こういうのやるならblender覚えてレンダリングとかやるべきでは…と我ながら思ったり。
「もともとそういう使い方をするわけではない素材を力技で切り貼りして形を作る」という意味で、「人力ボーカロイド」になぞらえてこれを「人力レンダリング」と呼んでみたりしている。正直謎の努力だと思う。


もうひとネタあるので続きますが、ひとまずここで一段落です。