« 夢のUnpremultiply。 | トップページ | みあちゃんの馬鹿。 »

2009年2月 3日 (火)

しつこく Unpremultiply。

昨日書いたネタgaru さんがスヴァらしいレンダーツリーを考案してくれたので、テストした結果を書いてみるだけなんですけどね。


Alan さんの Unpremultuply シェーダや、俺が試しにやってみた RenderTree では、テクスチャ画像の背景部分が黒100%であることを前提にしてました。 これを AfterEffects の合成チャネルのようにユーザが自由に色を指定できないものかと思ってたわけですが、garu さんが会社で仕事をしてるフリをしながらこそこそと頑張ってそのツリーを考案してくれたわけですね。 

この RenderTree です。
Garunuki1
文系の俺は、正直仕組みはよくわかっていませんが、 garu さんが書いてくれた

>> たぶん、アルゴリズム的には合成を基本に考えればいいんだと思うんですが
>> respic = srcpic * Alpha + dstpic * ( 1 - Alpha )
>> が合成の基本なので
>> srcpic = ( respic - dstpic * ( 1 - Alpha ) ) / Alpha
>> を出せばOKなのかなーと思います。

ってやつを RenderTree のノードで再現したというものですね。

上の画像のように、黒バックの代わりに赤バックのモヤモヤを用意して、Color_Share でその赤をピックしているわけですが、フリンジが出ずにちゃんと抜けています。スヴァらしいです。これで、何らかの事情によって黒以外の背景にせざるを得ない時でも、安心してヌキができるようになりました。コンパウンドにまとめればもっと便利かもしれませんが、これだけでも十分です。 この手法は garu抜きと命名されました。みなさん、俺のかわりに garu さんにビールをおごってあげて下さい。


一応、ガル抜きの正しさを証明するために、こんなファンキーな状態も作ってみました。Garunuki2
テクスチャ画像の背景を単色ではなく2色の雲模様にしてみたんですが、その背景部分だけを Color に食わせると、ちゃんと綺麗に抜けてくれました。ガル抜き万歳。スヴァらしいです。
ただ、実際の仕事ではこんな場面はまずないであろう、っていうかどうやってメインのモヤモヤを消して背景要素だけ抜き出すんだよゴルァ ってことになるわけですが。




そんな実験をやっているうちに、ふと以前から気になっていた AfterEffects のプラグインのことを思い出してですね。 数々のスヴァらしいプラグインを世に放ち続けている RE:Vision の、 RE:Fill ってやつなんですけどね。

このプラグイン、画像にある 「穴」 を埋めてくれるんですね。 例えばスタビライズでフレームの端っこにバレが出てきた場合とかに、エッジのピクセルを繰り返して埋めるとかそういう感じ。 これを見つけたとき、あっ、テクスチャ抜き黒マット問題に使えるかもっ っと思ったまま、半年だか1年だか忘れてました。今回の実験でヌキまくっているうちに思い出しました。


ってことでデモ版をダウンロードして試してみたのですが、
Refill_ae1
アルファ付きの木の画像に適用した状態です。すっげーファンキーな絵が出来ています。



エッジの部分をどアップにすると、
Refill_ae2
エッジ部分のピクセルの色を、外側に繰り返すことによって穴(アルファの抜き部分)を埋めています。


これを XSI で貼ると、
Refill_xsi2
ちゃんとフリンジ出ずにレンダリングできました。 エッジのピクセルの色で元画像を太らせたような状態になるわけで、背景の黒はそもそもテクスチャ画像の段階で撃退されています。なので XSI では特段何もせず、ストレートマットで抜いているだけです。 ただ、RE:Fill によってアルファ部分は埋め尽くされてしまうので、RenderTree 上でマスクが別に必要になりますけどね。 

ちなみに RE:Fill も何もしないでそのまんま貼ると下の画像のように黒フリンジが出ています。ちゃんと RE:Fill 効いてるってことです。

Refill_xsi1


いやあ、さすが RE:Vision さんですね。Trapcode と並んで、買って損したことないプラグインばかりです。 この RE:Fill は他のことにも色々使えそうなので、会社をだまくらかして買ってもらおうと同僚と画策中です。



それ以外にも、同僚が提案してくれた方法。
これは AfterEffects の標準でできます。Alpha Level を使っています。Alphalevel_ae
上の画像内で、左側が元のテクスチャで、Alpha Level で最大までアルファを持ち上げた状態が右です。つまり完全に透明ではなく、少しでも値がある部分を、100%オペイク状態にするということです。

これを XSI で貼ると、
Alphalevel_xsi
ちゃんと綺麗に抜けてます。上の RE:Fill と同じく、アルファ値は変わってしまっているのでやはり別マスク(元のマスク)が必要になりますが。
なんだこれでいいじゃん Orz
標準機能で、ひと手間だけで出来てますねえ。Yukuhiro さんに教えてもらった Photoshop のレイヤ超複製作戦もそうですよね。ごく簡単な機能の組み合わせ。これは Yukuhiro スペシャルと名づけましょう。本人が恥ずかしがりそうですが。


ってことで、

Alan さんの Unpremultiply シェーダを使う
Garu 抜きで攻める
Yukuhiro スペシャルで行く
RE:Fill を会社に買わせる
Alpha Level で飢えをしのぐ


これくらいの解決方法が出てきちゃいました。いや、全ての場合で有効だとはもちろん限りません。でもこれらのどれかで、大抵の場合は切り抜けられると思います。


いやあ、ものは聞いてみるもんですね。一人で悩んでいても解決せず、人からインプットをもらうと一瞬で解決したりします。こんな単純なことですら、一人だと気づかないんですね。人からインプットもらって改めて考えてみると、出るわ出るわアイデアが。 こんなローレベルノードの組み合わせでいいのなら XSI ver2 とかの時でもできたはずで。 やっぱ、一人で作業していたとしても、人と話をしないとダメっすね。|



ってことで、何年もの間、ちまちまとペイントしたり近似色で雲模様かましたりしてきた俺の努力は、全て無駄であったという決定が下されました。

ちょっくら死んできます Orz




.

|

« 夢のUnpremultiply。 | トップページ | みあちゃんの馬鹿。 »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック


この記事へのトラックバック一覧です: しつこく Unpremultiply。:

« 夢のUnpremultiply。 | トップページ | みあちゃんの馬鹿。 »