プログラムのパフォーマンスを向上させるために、サブサンプリングされた深度バッファーを使用したいと思います。私の場合、アーティファクトがあるかどうか、またはジオメトリのポップが発生するかどうかは関係ありません。
フレームバッファを次のように設定しました。
// 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ピクセルまで不正確になる可能性があることも意味します。これを除けば、システムの精度は影響を受けません。
明らかな唯一の回避策は次のとおりです。
- フラグメントシェーダープログラムを使用して、以前にレンダリングされた深度バッファーへのルックアップを実行し、深度チェックを手動で適用します。
- デプスバッファを低解像度でレンダリングしてから、高解像度にリサンプリングしてから、以前と同じように使用します。
どちらのアプローチも、最もパフォーマンスの高いアイデアとは思えません。サブサンプリングされたデプスバッファを実現するための最もクリーンな方法は何ですか?