2017-01-28 3 views
0

対象:OpenGL ESの3.0アカウントの深さを考慮してスクリーニングするためのFBOをレンダリング

私のデフォルトのフレームバッファ(画面)すでにレンダリングされた私のシーンの一部が含まれていると仮定する。その色および深度バッファは有効なデータを含む。

ここで、シーンの別の部分がすでに中間のFBO 'fbo1'にレンダリングされているとします。その色データは、fbo1.COLOR0添付ファイルに添付されたテクスチャ 'mColor'に保持され、その深さは、別のFBO 'fbo2'のDEPTH添付ファイルに添付された別のテクスチャ 'mDepth'に保持されます。

今、mColorを使ってmDepthの深さを考慮して、スクリーンにレンダリングしたいと考えています。カラーデータだけを含むテクスチャをスクリーンにレンダリングする方法はわかっていますが、mDepthを考慮する方法はわかりません。

本質的には、mColorでテクスチャ化されたクォードをスクリーンにレンダリングするときのように、スクリーンのデプスバッファをクワッドからの深さではなくmDepthからの深さと比較する必要があります。どうやってするか?

答えて

1

パイプラインを分割し、FBO0をオフスクリーンレンダリングでインターリーブされた複数のパスでレンダリングする場合、簡単な答えは「間違っている」ということです。

特に、タイルベースのアーキテクチャを持つモバイルでは、GPUに非常に非効率な中間状態を書き出して、読み戻すようにしています。

各オフスクリーンパスを最初にレンダリングし、次にウィンドウサーフェス(FBO0)を1回のパスでレンダリングします。

スクリーンの奥行きバッファをクワッドの奥行きではなく、奥行きをmDepthから比較する必要があります。どうやってするか?

デプステクスチャからデプス値をロードし、その値をフラグメントシェーダのgl_FragDepthに割り当てます。しかし、これはあなたのフラグメントのすべてを強制的に深さzsの深さの更新に強制します。フラグメントを保持する必要があるかどうかを判断する前に、シェイダーを実行しなければならないので、早いzsで実際の三角形z値か否か。だから、私はあなたのレンダリングパイプラインを再設計することをお勧めしたいので、これを行う必要はありません。

+0

私は参照してください。 私が実際にやっていることは次のとおりです。まずは自分のシーンのほとんどをレンダリングします。次に、N回のパスで、後処理を必要とする各オブジェクトをオフスクリーンバッファにレンダリングします。私は、オブジェクトが画面上でどこに終わるかを計算します(そのメッシュはかなりシンプルです)。それを十分に大きなFBOにレンダリングしてから、オブジェクトに後処理を適用し、問題に直面します。これを画面にマージします。 私は、オブジェクトごとに後処理をする方が簡単だと思っていました。これは、例えばBLURオブジェクトをBLURに近づけることが心配する必要がないからです。 – Leszek

+0

ぼかしは自然な形の「ファジーエッジ」を意味します。それはその半分のポイントなので、いつかは「クリープ」を解決する必要があります。あなたはパイプラインの後のポイントに痛みを延期しているだけで、遠ざけたわけではありません。 – solidpixel

+0

いいえ、私はあなたの提案を実装しました。完全に動作します。つまり、よりぼやけていないオブジェクトが、さらにぼやけたオブジェクトを部分的に遮っている場合、近くにあるオブジェクトは完全に鮮明になります。オブジェクトごとの後処理なしでこの効果を達成するには(つまり、シーン全体を一度に後処理しなければならない場合)、さらにオブジェクトにマークを付けるためにステンシルを使用し、ステンシルテストでぼかしを適用する必要がありますが、 DEPTHを考慮してください(より近いオブジェクトとの境界に近い別のオブジェクトのピクセルは、より近いオブジェクトのピクセルの影響を受けません)。 – Leszek

1

FBOの奥行きをテクスチャとして使用できます。 FBOのコンテンツを描画するときは、カラーパスを描画し、FBOの深度テクスチャから手動でgl_FragDepthを書き込みます。その後、適切な深度テストを有効にして、他のシーンのコンテンツをすべて描画できます。

+0

うーん...私はかなり理解していません。もちろん、mColorを使ってクォードをテクスチャにしてレンダリングするとき、私のフラグメントシェーダでgl_FragDepthに書き込んで 'mDepth'の内容に設定することはできますが、それは何も分かりません。 DEPTHテストは既にフラグメントシェーダーの前で実行されており、mDepthではなくQuadの4つのコーナーの線形補間から得られたDepthと画面の深さを比較しています。これが問題です。 – Leszek

関連する問題