問題タブ [depth-buffer]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
1665 参照

objective-c - 解像度の異なるデプスバッファとカラーバッファの使用(サブサンプリングされたデプスバッファ)

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

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

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

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

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

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

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

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

0 投票する
2 に答える
429 参照

iphone - 2D iPhone OpenGL ES 1.1 アプリで、深度バッファをテクスチャに対して機能させるにはどうすればよいですか?

2Dビデオゲームを作っています。現在、スプライトはそれほど多くなく、深度バッファのない 1 つのテクスチャで問題なく動作します。しかし、複数のテクスチャに拡張するときは、深度バッファを使用して、同じテクスチャに対して複数のパスを作成する必要がないようにし、深度の制約に関してテクスチャを整理する必要がないようにします。

深度バッファを機能させようとすると、正しいクリアカラーの空白の画面しか表示されません。深度バッファを使用しない作業セットアップについて説明し、深度バッファへのアップグレードに関する質問をリストします。

  • 現在、私の頂点には位置(x,y)とテクスチャ(x,y)の座標しかありません。他に何もありません。照明なし、法線なし、色なしなど。ここで行う必要がある唯一のアップグレードは、自分の位置に az coord を追加することだけでよいでしょうか?

  • 現在、私は使用しています:

これは深度バッファなしで機能します。しかし、深度バッファーを追加するときは、near 値と far 値を変更する必要があると思います。それらを何に変更すればよいですか?

  • 今私の glTexImage2D() のために私は使用しています:

深度バッファを追加するとき、これらの引数のいずれかを変更する必要がありますか?

  • への呼び出しglClearDepthf();では、glOrthof() への呼び出しで使用する Near または Far 値のいずれかを使用する必要がありますか? どれ?
0 投票する
1 に答える
3936 参照

opengl - GL_LINESでデプスバッファを使用する

非表示のエッジを削除してオブジェクトのエッジを描画したい。適用したいアイデアは、最初にオブジェクトの面を深度バッファーにレンダリングし、次に2番目のパスで深度テストを有効にしてエッジを描画することです。

すべての三角形のエッジが表示されるわけではないため、エッジは個別に保存されます(単純な例:立方体では、対角線のエッジは表示されませんが、クワッドは2つの三角形としてレンダリングされるため表示されます)。したがって、面はを使用しGL_TRIANGLESて描画され、エッジはGL_LINES別の頂点バッファを使用して描画されます。

問題は、この設定では非表示のエッジが部分的に表示され、表示されているエッジが部分的に非表示になることです。どうすれば適切な結果を得ることができますか?

  • 深度テストなし:

    深度テストなし

  • 深度テストあり:

    深度テストあり

  • デプスバッファにレンダリングされる面:

    顔のみ

オブジェクトを描画するために、色と深度のバッファがアタッチされたフレームバッファを使用します。

この設定は問題なく機能します。オブジェクトを次のように描画します。

使用されるシェーダーは、標準のモデル-ビュー-プロジェクション頂点シェーダーであり、すべてのフラグメントに対して白を出力するフラグメントシェーダーです。

0 投票する
1 に答える
886 参照

optimization - Kinect の深度と OpenGL の深度を効率的に比較する

バックグラウンド:

この問題は、オブジェクトの 3D トラッキングに関連しています。

私のシステムは、オブジェクト/サンプルを既知のパラメーター (X、Y、Z) から OpenGL に投影し、Kinect センサーから取得した画像と深度情報との照合を試みて、オブジェクトの 3D 位置を推測します。

問題:

Kinect 深度 -> プロセス -> ミリ単位の値

OpenGL -> 深度バッファ -> 0 ~ 1 の間の値 (これは近距離と遠距離の間で非線形にマッピングされます)

http://www.songho.ca/opengl/gl_projectionmatrix.htmlに記載されている方法を使用して OpenGL から Z 値を回復できましたが、パフォーマンスが非常に低下します。

これはよくある問題だと確信しているので、何らかの解決策が存在することを願っています。

質問:

OpenGLから目のZ座標を効率的に回復する方法は?

または、上記の問題を解決する他の方法はありますか?

0 投票する
1 に答える
574 参照

xna - XNA 3.1クリアする前に深度バッファーを保持する

レンダー ターゲットを切り替える前に深度バッファーから IDirect3DSurface9 をコピーし、後で深度バッファーを復元することで、レンダー ターゲットを切り替えるときに XNA 3.1 の深度バッファーの自動クリアを回避しようとしています。

コードでは、getDepthBuffer メソッドは IDirect3DDevice9 GetDepthStencilBuffer 関数へのポインターです。そのメソッドへのポインターは正しいようですが、IDirect3DSurface9 ポインターを取得しようとすると、例外 (0x8876086C - D3DERR_INVALIDCALL) が返されます。surfacePtr ポインターは、最終的に 0x00000000 を指します。

なぜそれが機能していないのかについて何か考えはありますか? そして、それを修正する方法についてのアイデアはありますか?

コードは次のとおりです。

0 投票する
2 に答える
1989 参照

opengl-es - 深度バッファをテクスチャにレンダリング

シェーダーに関してはかなり新しいので、ここでばかげたことをしている場合はご容赦ください。:)

iOS で opengl ES 2.0 を使用してシーンの深度バッファをテクスチャにレンダリングしようとしていますが、ディスプレイに表示されるポリゴンの密度が比較的高いモデルでない限り、完全に正確な結果が得られないようです。

したがって、たとえば、4 つの頂点のみで構成される大きなプレーンをレンダリングすると、非常に不正確な結果が得られますが、このプレーンを分割すると、分割ごとに結果がより正確になり、最終的に正しくレンダリングされた深度バッファーが得られます。

これは、アフィンとパースペクティブ プロジェクション テクスチャ マッピングの問題について多くのことを思い出させてくれます。これを修正するには、何らかの方法で ".w" コンポーネントをいじる必要があると思います。しかし、「さまざまな」変数はすでにこれを考慮に入れるべきだと思ったので、ここで少し迷っています。

これは私の頂点とフラグメント シェーダーです。

このシェーダは、私が使用している方法を強調するために大幅に簡略化されていることに注意してください。肉眼ではほとんどの場合うまく機能しているように見えますが、実際には 32 ビット テクスチャにレンダリングしています (フロートを ARGB にパックすることによって)。後で処理するために非常に高い精度が必要です。そうしないと、アーティファクトが目立ちます。

ポリゴン数を増やすことでかなり高い精度を達成できますが、それによってフレームレートが大幅に低下するので、もっと良い方法はありますか?

0 投票する
3 に答える
8824 参照

c++ - Directx 11 深度テストが機能しない

どのモデルを前に配置するかをプログラムに正しく選択させることができません。MSDNコードに正確に従っています。私のコードは、DrawIndexed の特定の呼び出しですべてのポリゴンを正しく描画しているように見えますが、その後の各呼び出しでは、画面に近いかどうかに基づいてではなく、描画された順序でモデルが描画されるようです。

Direct3d を初期化するためのコードは次のとおりです。

これはレンダリング用の私のコードです:

私は広範囲に検索してみましたが、見つけたすべてのチュートリアルに従いました。それを修正するものは何もありません。

球体の場合、片側から見ると奥行きが正しく見えますが、反対側から見ると正しくありません。

どんな助けでも大歓迎です。ありがとう。

0 投票する
1 に答える
667 参照

ios - OpenGLES 2.0 (GLKit、iPhone): ポリゴンがワイヤフレーム ラインを部分的に覆い隠す

iOS 用の 3D 関数プロッターを作成しようとしています。三角形のストリップを使用してグラフをレンダリングすることに成功し、線を介してワイヤーフレームを描画することも実装しました。しかし、24 ビット (または 16 ビットは問題ではありません) の深度バッファーを使用して両方を同時にレンダリングすると、ラインがポリゴンによって部分的に隠され、非常に細く見えるか、完全に消えてしまいます。4xMSAA をオフにしても問題は解決しません。例については、下の画像を参照してください。

部分的に隠れた線の例

線だけを描くだけでも問題なく機能します。線の太さは適切です。線の深度バッファリングを無効にすると、それらも正しく描画されますが、もちろんすべてのポリゴンの上に表示されます (つまり、実際にポリゴンによって隠されている線)。また、ポリゴンの透明度を下げようとしましたが、役に立ちませんでした。ラインを上から見ている限り、ラインの y 座標を少し大きくすると見栄えが良くなり、実際にポリゴンの前に表示されます。

最適なパフォーマンスを得るために、レンダリングの前にすべての頂点データとインデックスを頂点配列に静的に格納します。したがって、私のレンダリング ループは非常に短いです。

ポリゴンとワイヤフレームを同時に適切に表示するにはどうすればよいですか? また、カメラが現在ある場所に線を少し近づけることも考えましたが、OpenGL ES でそれを行う方法がわかりません。また、このシフトがパフォーマンスに影響するかどうかもわかりません。カメラの現在の位置に依存します。線を描く直前に線に動的に変換を適用することは可能ですか?

0 投票する
1 に答える
753 参照

opengl - 深度バッファのサイズはビューポートのサイズと同じですか?

私が実行する場合

これにより、深度バッファーのサイズは SCREEN_SIZE x SCREEN_SIZE になりますか?