1

プログラムのパフォーマンスを向上させるために、サブサンプリングされた深度バッファーを使用したいと思います。私の場合、アーティファクトがあるかどうか、またはジオメトリのポップが発生するかどうかは関係ありません。

フレームバッファを次のように設定しました。

// Color attachment
glBindTexture(GL_TEXTURE_2D, colorAttachment);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 640, 360, 0, GL_RGBA, GL_UNSIGNED_BYTE, nil);

// Depth attachment
glBindRenderbuffer(GL_RENDERBUFFER, depthAttachment);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, 160, 90);

// Framebuffer
glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorAttachment, 0);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthAttachment);

ただし、ドキュメントによると、「すべての添付画像の幅と高さが同じではない」という意味のglCheckFramebufferStatus(GL_FRAMEBUFFER)リターンが返されます。GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS

「粒子フィルターを使用したフル3Dエッジトラッキング」と呼ばれる研究論文があります。これは、セクション3.5で、アプリケーションのパフォーマンスを向上させるためにサブサンプリングされた深度バッファーを実際に使用したことを説明しています。

サブサンプリングされた深度バッファ:画像エッジに沿った隣接ピクセルは非常に密接に相関しているため、個々のエッジピクセルのテストは冗長です。単一仮説トラッカーの場合、サンプルポイントをエッジに沿って10〜20ピクセル離して広げるのが一般的です。n番目のエッジピクセルごとにのみサンプリングすると、必要なグラフィックス帯域幅も減少するため、4番目ごとのピクセルのみがサンプリングされます。点描線を明示的に描画する代わりに、サブサンプリングされたデプスバッファ(160 x 120)を使用することでこれを実現します。これにより、デプスバッファをクリアしてデータを取り込むための帯域幅がさらに削減されます。ただし、これは、隠線の除去が約4ピクセルまで不正確になる可能性があることも意味します。これを除けば、システムの精度は影響を受けません。

明らかな唯一の回避策は次のとおりです。

  • フラグメントシェーダープログラムを使用して、以前にレンダリングされた深度バッファーへのルックアップを実行し、深度チェックを手動で適用します。
  • デプスバッファを低解像度でレンダリングしてから、高解像度にリサンプリングしてから、以前と同じように使用します。

どちらのアプローチも、最もパフォーマンスの高いアイデアとは思えません。サブサンプリングされたデプスバッファを実現するための最もクリーンな方法は何ですか?

4

1 に答える 1

2

The doc page you referenced refers to OpenGL ES 1.0 and 2.0. The OpenGL wiki has more information as to the difference between 2.0 and 3.0, namely that starting with 3.0 (and ARB_framebuffer_object), framebuffer textures can be of different sizes. However, if I recall correctly, when you have textures of different sizes attached, the actual texture size used is the intersection of all FBO attached textures. I don't think this is what you want.

In order to reduce the size of your depth texture, I suggest using glBlitFramebuffer to transform your large texture into a smaller one. This operation is completely done on the GPU so it's very fast. The final smaller texture can then be used as input for further rendering operations in your shaders which will definitely provide bandwidth savings. Instead of performing the averaging of multiple depth values for each pixel shader execution, it will be done once per texel in the smaller texture. A smaller texture is also inherently faster to sample since it fits in cache better.

Keep in ming however that averaging depth samples can produce wild inaccuracies because the depth values are not linearly spread.

于 2011-11-17T18:47:12.177 に答える