« クラッシャー。 | トップページ | しつこく Unpremultiply。 »

2009年2月 1日 (日)

夢のUnpremultiply。

長年の夢だった。やっと叶った。

そういうプラグインシェーダを見つけましてね。


Binary Iris で有名な Alan Jones さんですね。
http://www.binaryiris.com/node/27

過去にも BoolTrace とか GenieTail とか、便利なシェーダをいっぱい提供してくれたスヴァらしいお方です。どうやら最近オーストラリアに引っ越したんだか里帰りしたんだかしたようで、彼のサ イトも刷新され、ブログのような形式になったようです(前のスタイルも好きだったんだけどな・・・・)。

過去にリリースしたシェーダたちを1つのパッケージにして、BinaryIris.xsiaddon として配布して下さってます。


んで、インストールして中身を見てみると、見慣れたシェーダたちの中に混じって、Unpremultiply というシェーダがっ!
名前からして、これはそのまんま 「プリマルチプライ状態を解除してくれるシェーダ」だろうっ! と思ってやってみたらやはりそのまんまでした。
わあい


これ、ずっと欲しかったんですよね。 After Effects で言うと 「フッテージのアルファを合成チャンネルとして扱う」 ってことですね。
XSI からレンダリングした絵はデフォルトではストレートアルファじゃなくて Premultiply Alpha なので、そして XSI の背景は何もしなければ黒なので、エッジのアンチエイリアス部分に代表される「透明部分」に、アルファの値に応じて背景色である黒の成分が混じった絵になるわけですね。 これを知らずにストレートマットとし て抜くと、すでに黒が混じっている RGB チャネルの色をアルファ値で乗算して合成するから、合成結果には黒いフリンジが残ってしまいますわね。 なので、あらかじめ 「これは黒との間で乗算済みの絵なんですよー だから黒成分をキャンセルしないとフリンジになりますよー」と AfterEffects 様に伝えておかねばならないわけで、それが「合成チャネル」ですわな。 もし青バックでレンダリングしたのならカラーピッカーで青を拾って、青との間でア ルファ乗算済みなんですよー って伝えればいいわけですね。

どーでもいいけど「合成チャンネル - カラーマット」って変な名前のパラメータですね。英語版ではそのまんま Premultiplied - Matted with Color になってる。うーむわかりやすい。  日本語に翻訳するとかえってわかんなくなるって、まるで XSI のようですよアドビさん。 


んでXSI の場合はというと、RenderTree にテクスチャ画像を読み込むと、アルファチャネルなどによるヌキの情報は全てストレートマットとして扱われているようで、必ずフリンジが出てしまうとい う問題に長年悩まされ続けてきました。ほんと、もう7~8年これに苛まれていたわけで。 しかたないので、これまではストレートマットで抜いてもフリンジ がバレにくい加工をテクスチャごとに毎回施して来た訳で。  これをやるたびに、なんで Image ノードの中にこれを決めるスイッチとかがねえんだよゴルァ と Softimage を呪ったものでした。 

しかし Alan Jones さまの Unpremultiply を一発挟むだけで、見事に Unpremultiply つまりプリマルチプライの無効化をしてくれるわけで、これでもうフリンジに悩まされることはなくなったはずなわけで、もうこれは夢のようなんですそうなん です。小躍りしてます。

たとえばこんなテクスチャをヌキで貼らなければいけないことって、よく あるじゃないですか。
 テクスチャ1。
左が RGB チャネル、右がアルファチャネルです。


それをこんな RenderTree で貼るだけなんですがね。



で、レンダリングしてみると、まあ、問題なく見えますわな。

でもこの時点ではまだ、背景が黒いわけですよ。 黒バックならなんとでもなりますわね。


なので、背景に真っ白の板を置いてみました。 すると・・・・。

なにやらフリンジのようなものが入っているように見える。。。。。


寄ってみると・・・・・

あからさまにエッジに黒が残ってますね。 ゴルァ

すでに黒との間でアンチエイリアス済みのエッジを、つまりプリマルチプライ済みのものを、ストレートマットで抜いてるからこうなるわけですね。
たぶん。そうですよね。合ってますよね。合ってると言ってくれ
でもまあ、この場合は簡単に解決できますよね。 下のようなテクスチャにすればいいだけ。
 テクスチャ2。

エッジに黒が残ってしまうなら、RGB チャネルから黒を無くせばいいってことで、文字の色である黄色で塗りつぶしました。


レンダーしてみると、

問題なく黒エッジは消えました。

でも実際の仕事では、これじゃ全然解決になりません。 黄色一色で良いなんて場合はめったにないからです。つまり単色だからこそ使える技ですねこれは。


こんなんだったらどうしますか。
 テクスチャ3。
エッジのいたるところでカラフルしてます。


これを貼っ付けたら当然、

こうなるわけで。 エッジに黄色が来ている部分は黄色に塗りつぶし、赤の部分は赤に塗りつぶし、青の部分は・・・・ って、あなた本当にやりますか。そん な地道なことやってる場合ですか。モニタ壊しませんか。
でも俺はしかたなくやってましたよ。木のテクスチャとかね、平均的な色を2色くらい拾って雲模様で塗りつぶしたり、幹の部分のエッジまわりは茶色っぽくし たり・・・・。

この例の場合はまあ、RGB チャネルに、文字の形でヌケていない noIcon.pic 模様を貼り付ければいいだけですけど、実際は、例えば木とかなら、木の形でヌケていない木のテクスチャ画像(写真)なんて無いわけでして。
 

同僚はこんなこともしてました。
 テクスチャ4。

この画像だとわかりにくいか。 RGB チャネルの絵を複製し、ブラーかまして、元の絵の下レイヤに何層も重ねています。 エッジ部分がボケて少し「太る」ので、部分ごとに色を拾って手でペイン トしたのと似た効果が出るようになってます。涙ぐましい努力です。



これをレンダーすると、

何もしないよりはずっといいですね。 でも完璧ではありません。





そこで、Unpremultiply 様に御登場願います。 


テクスチャは最初の「テクスチャ1」を使ってます。

これ1個挟むだけで、黒フリンジ撃退です。涙が出ます。Alan さん、本当にありがとう。あなたは恩人です。ビールおごります。




よくある木のテクスチャでもやってみます。

特に問題なさそうに見えてるが・・・・


寄って見ると、やはり黒が残っています(左側)。  Unpremultiply で撃退済みのが右側です。


もっと現実的によくあるパターンが、XSI のパーティクルなどでモヤモヤした画像をレンダリングし、それをそのままテクスチャとして使いたい場合とか。 こういうテクスチャです。
 テクスチャ5。


これをそのままレンダーすると、

モニタを破壊します。


Unpremultiply をかますと、

とってもスイートです。



ってことで、これで安心してヌキができます。 AfterEffects などで重ねているのと同じ状態。 テクスチャ画像に特段の加工は必要ありません。長年の夢がかないました。泣きそうです。Alan さん愛してます。

ただひとつ注意しなければいけないのは、テクスチャ画像の背景部分はで なくてはならないらしいこと。 AfterEffects の合成チャンネルではカラーピッカーが付いていて何色との間で Premultiply 済みなのかをユーザが指定できますが、このシェーダにはそのパラメータが付いていません。 何色かで試してみたんですが、黒バックを前提にしているように 見えました。まあ普通はそうだわな。  なので、黒バックではないテクスチャ画像はやはりなんらかの方法で、元の背景色がエッジに残らないように気を付け ながら、背景を黒で塗りつぶす加工が必要になると思います。






・・・・と、かなり頑張って画像もいっぱい使って書いてみたはいいけど、実は 「この PPG でチェックボックス入れるだけじゃん」 とか 「Photoshop で○○フィルタ一発でその状態になるよ」 とか言われそうな悪寒・・・・・。いつものパターン・・・・・。

覚悟はできています。どうか御指摘下さい。
今のうちがっかりしておこう。

Orz





--------
追記:

これ書いて送信した直後に、

アルファと乗算済みの反対の状態を作り出せばいいんだったら、従来のノードの組み合わせでもできるんじゃないの?

と思いついてやってみたら・・・。

Goodoldway

できました Orz

いや、よく仕組みはわかってないんだけど、アルファだけ取り出して、乗算の反対だから元の画像と除算しただけ・・・。  いちおう、これで Umpremultiply をやった時と全く同じ画像ができているように見える。黒バックテクスチャ限定だが・・・。 特定の色にしたい場合はどうすれば?

すいません文系の限界です。 誰か試して下さい。 しくみを説明して下さい。。。




|

« クラッシャー。 | トップページ | しつこく Unpremultiply。 »

コメント

お久しぶりです。
自分もXSIのpremultipyの問題、相当悩まされました。
このunpremultipyのシェーダー、自分も知らなかったので早速試してみたいと思います。
会社では古いやり方ですが、テクスチャを作る時点でunpremultされてるRGBを作ってます。

例えば、フォトショップで葉などのテクスチャを作る場合、葉のアルファを作った後に
それをRGBにapplyし、葉以外のバックグランドをトランスペアレントにします。
これをこのままフラットにするとpremultイメージができるので、それをする前に
このレイヤーを何度かduplicateすれば、エッジがどんどん太くなっていきます。
凄くソフトなエッジの画像なんかは2、30回ぐらいduplicateして
確実にエッジをオペークにしてやったりしてます。このプロセスはフォトショップで
簡単なスクリプトが作れるので、ボタン一つできます。バックグランドの色も関係ありません。

ただ、このシェーダーとJunkiさんの考えられたレンダーツリーをを使えばこういう事も
しなくていいかもしれませんね。
ILMで使っていたインハウスツールではフォトショップのRGBレイヤーのトランスペアレンシーを
自動的にアルファチャンネルとして読み込んでくれてたので、
カメラマップを製作中のワークフローとしては凄く便利でした。(いちいちテストレンダーのために
レイヤーをフラットにしたり、別アルファを作ったりしなくても良い為)

自分も最近は新しいPhotoshopの機能を研究してないので、
もしかしたらもっと良いやり方があるかもしれないですね。

投稿: | 2009年2月 2日 (月) 15時09分

ちょっとやってみました。
結構難しいですね。
いつもは、アフターで作れるからいいやって感じですが、いざ本気でやってみるとなかなかでした。
たぶん、アルゴリズム的には合成を基本に考えればいいんだと思うんですが

respic = srcpic * Alpha + dstpic * ( 1 - Alpha )

が合成の基本なので

srcpic = ( respic - dstpic * ( 1 - Alpha ) ) / Alpha

を出せばOKなのかなーと思います。

http://3.bp.blogspot.com/_-9eu6tYGM5o/SYaBJ4Tb9zI/AAAAAAAAAFc/SuP_AfjsgNU/s1600-h/premultiply.jpg

Color_Shareが、マットカラー入力です。
間違ってたら、ご指摘を・・・。

投稿: garu | 2009年2月 2日 (月) 15時29分

Yukuhiroさん、お名前が未記入ですが Yukuhiroさんですよね。ご無沙汰してます。

おおーそうか、既にアルファで抜いたレイヤを死ぬほど複製すれば、うーむ、そりゃオペイクになりますわね。そうかー全然気づかなかったよう。俺、ほんと頭硬いですね。 ブラーかける意味もないわな。意味ないどころか色がブリーディングしちゃって悪影響だわな。そのまんま複製が正しいですわな。 勉強になりましたOrz

Good Old Method いつも最高。確実だし。Yukuhiroさん超ありがとうございました。
そのILMのツールをこっそりかっぱらってきて俺にくれたら、ビール1ダースおごります。なに、バレませんよ。 大丈夫ですってば。




garu さん、理系の真打が来ましたね。けけけけけ。 俺は国際関係学部国際関係学科卒業ですが何か。

ってことで、やってみました。超できました。色指定できるようになりました。うわースヴァらしい。超ありがとうございます。これから別記事で簡単にレポート書いときます。

いやあ、ソフトウェアの内部でこびと達が何をしているのかがわかる人はうらやましいです。RenderTree や IceTree はまさにローレベルノード、つまり超単純機能担当のこびと君たちがいっぱい用意されてるわけで、こりゃもう、garu さんの独壇場ですな。嫉妬してますよ冗談抜きで。


おふた方、新しい input を本当にありがとうございます。一緒に呑みに行きましょうね。Yukuhiroさんもこっちに来て下さいね。けけけけ。

投稿: junki | 2009年2月 3日 (火) 00時59分

すみません。
名前を書き忘れてましたね・・・

ちなみにちょっとトピックからずれますが、ILMのフォトショッププラグインは
ご存知ですか?

http://www.openexr.com/downloads.html

これを使えばXSIでレンダーしたexrファイルを奇麗にunpremult出来ます。
ただ唯一の問題は、16bitまでしかサポートしてないので32bitの画像だと、せっかくの
HDRも潰れてしまいます。
いい加減、アドビがexrプラグインをアップデートしてくれればいいのですが、CS4になってもexrプラグインはしょぼいままで、アルファがpremultされた状態で開く上に、セーブする際にもアルファチャンネルが持てません。

変にアドビに期待するより、直接ILMのR&Dの
友人に交渉してプラグインをアップデートしてもらった方が早いかもしれないですね・・・

投稿: yukuhiro | 2009年2月 3日 (火) 19時33分

Yukuhiro さん、おお、OpenEXR のローダですね。ありがとうございます。

ただ、ノンフォトリアルなレンダリングばかりしている俺は、OpenEXR でレンダリングしたことはまだないですねw せいぜい Depth Pass とか諧調が必要なレンダリングで SGI 16bit 使うくらいです。普段は、燃える男のSoftimage pic 8bit オンリーですw  32bit floatは重そうだなあ。 

そうそう、コネを利用して ILM の人にやってもらいましょう。アドビなんてでかい会社だから、細かい部分で小回りが効かないと思いますよ。 嘔吐デスクも同じですわな Orz

ところで AO も ILM の人が発明したんじゃなかったでしたっけ。SIGGRAPH の論文とかがあったような気が。

投稿: junki | 2009年2月 4日 (水) 02時21分

コメントを書く



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




トラックバック


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

« クラッシャー。 | トップページ | しつこく Unpremultiply。 »