2012-03-23 15 views
0

正しいブレンドアルファチャンネル用に独自のzバッファを作る方法はありますか?私はglslを使用しています。 私には1つのアイデアしかありません。そして、これは2つの "バッファ"を使用し、そのうちの1つは深度コンポーネントと別の色(アルファチャンネル付き)を格納します。私は自分のプログラムでバッファにアクセスする必要はありません。 glslにはuniforms変数の数に制限があるので、私は一様配列を使用できません。フレームバッファの書き込みと読み取りの動作が定義されていないため(そしてどのカードでも動作しないため)、FBOを使用できません。独自のzバッファー

どうすればこの問題を解決できますか?

または実際のリアルタイムzバッファをglslから読み取る方法はありますか? (各フラグメントシェーダ呼び出しz-bufferを更新する必要があることを意味します)

+3

「正しいブレンドアルファチャンネル」とはどういう意味ですか?どのような問題を解決しようとしていますか?注文に依存しないことをやろうとしていますか? –

+1

Nicol Bolas氏の言葉に加えて:Order Independent Transparencyでは、いくつかの追加の深度バッファでは不十分です。シーンをレイヤーで分割して動作させるものです。これは深度ピーリングと呼ばれます。しかし、これの実装は自明ではありません。 – datenwolf

+0

@NicolBolas、はい。私がglslからZ-Bufferを読むことができれば、それを簡単に行うことができます! –

答えて

2

基本的な問題は、デプスバッファが1ピクセルあたりの深度に格納されていますが、部分的に透明なジオメトリのビューでは、複数のフラグメントが各ピクセルに寄与します。

問題を堅牢に解決するには、ピクセルあたりの深度の順序リストが必要です。最も近い不透明な部分に戻ってください。その後、リストを逆順に移動します。実際OpenGLは可変サイズの配列のようなことをしないので、ジオメトリを前後に並べることで多くのことが達成されます。

GL_SAMPLE_ALPHA_TO_COVERAGEによって実現される代替手段は、実際の高解像度またはマルチサンプリングのいずれかで実際の透明度と区別できないスクリーン・ドア透明度に切り替えることです。理想的にはそれを確率的に行いますが、それはOpenGLの再現性ルールを無効にします。それにもかかわらず、あなたがGLSLにいるので、あなた自身でそれを行うことができます。サンプラーは入力アルファを単に取り、それを最終ピクセルを出力する確率として使用します。だからどこかから0.0〜1.0の範囲のランダムな値を取得し、それがアルファより大きければピクセルを破棄します。常にアルファ1.0で出力し、通常の深度バッファを使用します。 Answers like this GLSLでランダムな数字を得るためにできることをもう少し詳しく説明し、明らかにマルチサンプリングを可能な限り高くしたいと思っています。

Eric Endertonは、チェックアウトする価値のあるDirectXの実装に沿って、確率的な順序に依存しない透明性を(これはslide version)と書いています。

2

正しいブレンドアルファチャンネル用に独自のzバッファを作る方法はありますか?

これはできません。オーダーに依存しない完全な透明度を得るには、zバッファーを取り除いて、隠れたサーフェス除去のための別のメカニズムに置き換える必要があります。

zバッファでは、問題に対処する方法が2つあります。

  1. (ハードウェアアクセラレーションでは実用的ではありません) - 基本的には、いくつかの「深度」値のレイヤーが保存され、透明なサーフェスをブレンドするために使用されます。たくさんの記憶があり、透明なオーバーレイ表面が最大限に存在します。一度限界を超えると、アーティファクトがあります。
  2. 深さピーリング(google it)。オーダーに依存しない透過性がありますが、1ピクセルあたり透明ポリゴンの「オーバーレイ」の最大数には制限があります。実際にはハードウェアで実装することができます。

両方のアプローチには制限があります(1ピクセルあたり透明ポリゴンが重複する最大数)。制限を超えると、シーンは適切にレンダリングされなくなります。それはむしろ役に立たないことを意味します。

zbufferを完全に削除して、レンダリングするすべてのポリゴンを集め、クリップしたり、分割したり(2つのポリゴンが交差する場合)、並べ替えを行うグラフィックレンダリングパイプラインを作成します正しい結果が得られるように正しい順序で画面にペイントしてください。しかし、これは難しく、ハードウェアアクセラレーションで行うのは難しいです。 6年前のATI GPU関連の文書によれば、Z-Bufferを無効にしてカードのいくつかを無効にして、何らかの拡張機能を有効にすることができるという。しかし、彼らはアルファブレンディングについては何も言わなかった。私は以来この機能について聞いていない。おそらく、それは人気がなく、TruForm(忘れられた)の運命を共有したでしょう。また、そのようなレンダリングパイプラインは、zバッファ上で可能なことをすることができません。

関連する問題