3

私は、いくつかのワイヤーフレーム プリミティブをレンダリングする OpenGL コンテキストを持っています。それらの一部 (すべてではない) に後処理効果 (ぼかし、ブルームなど) を適用したいと考えています。これを実現するために、テクスチャ (カラー バッファー) とレンダー バッファー (深度バッファー) が添付されたオフスクリーン フレーム バッファーを定義しました。次に、次のことを行います。

  1. オフスクリーン バッファをバインドする
  2. パースペクティブ ビューの設定
  3. ぼかしたいワイヤーフレーム プリミティブを描画します
  4. オフスクリーン フレームバッファのバインドを解除し、「メイン」フレームバッファをバインドします
  5. 後処理すべきではないプリミティブをさらに描画する

  6. オルソ ビューの設定

  7. 後処理シェーダーをセットアップし、オフスクリーン バッファーのテクスチャーを均一パラメーターとして渡します。
  8. フルスクリーンクワッドを描画する

  9. メインフレームバッファの内容を表示

問題は、テクスチャをオフスクリーン バッファにレンダリングし、その結果を 2D クワッドのテクスチャとして使用すると、深度情報が失われ、シーン全体がリアルに見えないことです。

私の質問は、どうすれば私のデプスバッファをフレームバッファにマージできますか? または、複雑な 3D シーンにぼかしやその他のフラグメントシェーダー効果を適用する一般的な方法は何ですか?

4

2 に答える 2

2

これに具体的に対処するには:

私の質問は、どうすれば私のデプスバッファをフレームバッファにマージできますか?

異なる FBO 間でアタッチメントを共有することを妨げるものは何もありませんglFramebufferTexture2D。これは、深度/深度ステンシル バッファーにも適用されます。GL3では、異なるサイズの添付ファイルを使用することも有効です。

後の段階でメイン フレーム バッファ (可視ウィンドウ) の深度情報が必要な場合は、Framebuffer Blittingを使用してコピーできます。ブリット操作は非常に高速です。

レンダリングの順序にアプローチする方法は多数あります。個人の好み/柔軟性/パフォーマンス。私は個人的に、柔軟性のために FBO で可能な限り多くのことを行い、必要に応じて後で最適化します。最終的なカラー結果も、ブリットを介してフレーム バッファに移動されます。

一部の Linux ドライバーや、場合によっては OS X で深度添付ファイル (または一般的な添付ファイル) を共有する際に問題が発生し、深度添付ファイルを共有する代わりに blit を使用することになりました。

于 2012-10-26T00:19:14.520 に答える
0

初期の深度テストを使用してこれを実装します。アイデアは、最初にシーン全体を深度バッファのみにレンダリングすることです。つまり、色の書き込みはありません。次に、カラー パスを実行します。ここでは、深さの書き込みを無効にし、まったく同じ変換を使用して等しいかどうかの深さのテストを行います。これにより、必要な隠面が除去されます。すでに概説したように、カラー パスを実行します。ぼやけた画像を重ね合わせることで、問題なく見えるはずです (これが壊れる病理学的なケースがいくつかありますが、ステンシル バッファーのトリックを使用して修正できる可能性があります)。

ところで、フル スクリーン クワッド頂点シェーダーのプロジェクションを設定する必要はありません。頂点の位置を通過し、頂点の座標 (-1,-1) (1,-1) (1,1) (-1,1) を使用するだけです。

于 2012-10-25T19:52:04.943 に答える