正しいブレンドアルファチャンネル用に独自のzバッファを作る方法はありますか?
これはできません。オーダーに依存しない完全な透明度を得るには、zバッファーを取り除いて、隠れたサーフェス除去のための別のメカニズムに置き換える必要があります。
zバッファでは、問題に対処する方法が2つあります。
- (ハードウェアアクセラレーションでは実用的ではありません) - 基本的には、いくつかの「深度」値のレイヤーが保存され、透明なサーフェスをブレンドするために使用されます。たくさんの記憶があり、透明なオーバーレイ表面が最大限に存在します。一度限界を超えると、アーティファクトがあります。
- 深さピーリング(google it)。オーダーに依存しない透過性がありますが、1ピクセルあたり透明ポリゴンの「オーバーレイ」の最大数には制限があります。実際にはハードウェアで実装することができます。
両方のアプローチには制限があります(1ピクセルあたり透明ポリゴンが重複する最大数)。制限を超えると、シーンは適切にレンダリングされなくなります。それはむしろ役に立たないことを意味します。
zbufferを完全に削除して、レンダリングするすべてのポリゴンを集め、クリップしたり、分割したり(2つのポリゴンが交差する場合)、並べ替えを行うグラフィックレンダリングパイプラインを作成します正しい結果が得られるように正しい順序で画面にペイントしてください。しかし、これは難しく、ハードウェアアクセラレーションで行うのは難しいです。 6年前のATI GPU関連の文書によれば、Z-Bufferを無効にしてカードのいくつかを無効にして、何らかの拡張機能を有効にすることができるという。しかし、彼らはアルファブレンディングについては何も言わなかった。私は以来この機能について聞いていない。おそらく、それは人気がなく、TruForm(忘れられた)の運命を共有したでしょう。また、そのようなレンダリングパイプラインは、zバッファ上で可能なことをすることができません。
「正しいブレンドアルファチャンネル」とはどういう意味ですか?どのような問題を解決しようとしていますか?注文に依存しないことをやろうとしていますか? –
Nicol Bolas氏の言葉に加えて:Order Independent Transparencyでは、いくつかの追加の深度バッファでは不十分です。シーンをレイヤーで分割して動作させるものです。これは深度ピーリングと呼ばれます。しかし、これの実装は自明ではありません。 – datenwolf
@NicolBolas、はい。私がglslからZ-Bufferを読むことができれば、それを簡単に行うことができます! –