元記事:Transparent Filtering



透過処理のフィルタリング



Alpha、transmit、filter、transparency…


Blender は透明な物を "Alpha" 値(不透明度)の設定によりレンダリングしており、Alpha が0の場合、100%透明であることを意味します。この Alpha 値は、あるピクセルが覆っている他のピクセルと、どれだけブレンドするかを定義しています。
これは画像処理からの慣習であり、Blender の古いピクセルベースのスキャンラインレンダリングシステムと相性がいいのです。

しかしながら多くの「現実」の透明な素材 ― ガラスなど ― の材質の色は、背後にある物(もしくはライトや光)とブレンドされてはいないでしょう。ただし、同様にフィルタは適用すべきです。この演算は実際には乗算であり、ブレンドではありません。例えば半透明な赤い素材(RGB:1, 0, 0)はすべての緑と青を遮断します。

このようなフィルタを定義するには、二つのアプローチがあります。




Povray: Filter 0.7、Transmit 0.7、両方を0.7

前者を選択する場合、自由な創作が可能になりますが、フィルタの決定に新しい RGB カラーをミックスするだけでなく、Material 自身に使用している同じ Texture にもこのフィルタを適用する必要がある、という欠点があります。更にこの方法では、Alpha自身は除外されており、基本的には全く違う演算になります。

この Povray のサンプルも奇妙です…この選択は単純な Alpha と Filter の加算で、簡単に実行不可能なオーバーフローに陥り、ユーザにとって編集がすばやくできる方法ではないことは明白です。
しかしながら、Alpha が従来どおりに役割を果たしつつ、後方互換性を保って追加できる方法であるという利点があります。



Blender: RGBA+F





alpha 0.4, filter 0.0



alpha 0.4, filter 0.5



alpha 0.4, filter 1.0

さまざまな方法をテストしていく中で、最も論理的な選択肢が現れました。それは単一の新しい Filter 値を定める方法で、Alpha の mix 演算の透過部分にのみ演算を行うというものです。

Filter が0.0 で、背景色(もしくは光)が Material を通してそのまま「透過」し、1.0で「透過した」部分を完全にフィルタリングします。ここの「透過」量は今も Alpha で決定されることに注意して下さい。

これはまた、単体の "AlphaOver" 演算に従来どおり集中できることも意味し、5番目の色成分(F = Filter) を使用してフィルタリングを行います。
更にいいことに、RGBA + F カラーは五重奏で一貫性のある挙動をし、ピクセルベースの Alpha の加算と同じように上手く適用できます。
/* regular alpha; RGBAo over RGBAu */
Rn = (1-Ao)*Ru + Ao*Ro;
Gn = (1-Ao)*Gu + Ao*Go;
Bn = (1-Ao)*Bu + Ao*Bo;
An= (1-Ao)*Au + Ao;

/* filtered alpha; RGBAFo over RGBAFu */
fr= 1+ Fo*(Ro-1);
fg= 1+ Fo*(Go-1);
fb= 1+ Fo*(Bo-1);
Rn = fr*(1-Ao)*Ru + Ao*Ro;
Gn = fg*(1-Ao)*Gu + Ao*Go;
Bn = fb*(1-Ao)*Bu + Ao*Bo;
An= (1-Ao)*Au + Ao;
Fn= (1-Ao)*Fu + Ao*Fo;


Blender は AlphaUnder 演算だけでなく、AlphaOver も使用しており、これは後ろから前への透過のレンダリング用です。RGBA でこれらの関数は連係できるようになり、a*(b*c) が (a*b)*c と同等になることを意味します。しかしまだ、これが RGBA+F 方法の目的に正しいものか証明する必要があります。


実装と将来の課題







フィルタを適用した Monkey



上記の画像の Alpha マスク

現在、フィルタリングされた透過処理はレイトレースレンダラにのみ実装されています。
"Mirror Transp" パネルの新しいボタン、"Filter" で使用できます。このボタンはオプション、"RayTransp" をセットした時にのみ表示されることに注意して下さい。

100%カラーフィルタリングするには、Alpha は0、Filter を1.0にして下さい。0の Alpha はフレネルの設定でも得られます。

Alpha
レイトレースによる透過では、画像のAlphaチャネルも保存するようになりました。このRGBカラーは、Sky を適用してレンダリングした時、Sky カラーで「汚染」されます。

将来的には、Zバッファベースの透過レンダリングでも RGB+F カラーをこの類のフィルタリングに使用する予定です。

同様に、カラー加算合成(Haloなど)を決定する統一された方法を探し、証明と研究を行うことも必要です。