問題タブ [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.
opengl - OpenGLreadPixelsを使用した真の深度値
3Dフィルタリングアプリケーションのカメラビューから深度バッファを取得したいのですが。現在、深度コンポーネントを取得するためにglReadPixelsを使用しています。[0,1]値の代わりに、深度バッファーの真の値、またはワールド座標でのカメラまでの真の距離が必要です。
GL_DEPTH_BIASとGL_DEPTH_SCALEで深度値を変換しようとしましたが、うまくいきませんでした。
これはデプスバッファから真のz値を取得するのと似ていますが、シェーダーではなくメインメモリにデプス値を取得したいと思います。
android - Android OpenGL 3D ピッキング
私は Android OpenGL-ES 2.0 を使用していますが、それに伴うすべての制限の後、2D 画面のタッチを 3D ポイントにする方法がわかりません。正しい結果が得られません。
ポイントクラウドにレイを発射することを実装しようとしています。これにより、ポイントとレイの距離を比較して、最も近いポイントを見つけることができます。
これが私のピッキング機能です。デバッグの目的で、場所を画面の中央に設定しました。
パースペクティブ zNear と Far を変更しても、期待した結果が得られません。1.0-1000.0 パースペクティブの遠点が 11 ユニット離れているのはどうしてでしょうか?
私のコードに見られる提案やできればバグを探しています。とても有難い。私はできる限り報奨金を出しています (これはしばらくの間問題でした)。
android - OpenGL ESでの透明度と深度テストの回避策はありますか?
draw_texture拡張機能を使用して、OpenGLESで深度テストを正しく機能させようとしています。この拡張機能を使用してレンダリングすると、「通常の」z座標が機能しないことに早くから気づきました。これは、OpenGL OES描画テクスチャページに示されているように、深度バッファ内の実際のz位置ではなく、0と1の間の比率としてZ座標を効果的に使用する拡張によるものです。
Zsは、次のようにウィンドウの深さZwにマップされます。
OpenGLの透明性に関するFAQページで次のことを読みました。
アプリケーションでデプスバッファリングを使用する場合は、プリミティブをレンダリングする順序に注意する必要があります。完全に不透明なプリミティブを最初にレンダリングし、次に部分的に不透明なプリミティブを後ろから前の順序でレンダリングする必要があります。プリミティブをこの順序でレンダリングしないと、部分的に不透明なプリミティブを通して表示されるプリミティブは、深度テストを完全に失う可能性があります。
これは私の問題に私を連れて行きます。私は2つの正方形を持っています。両方とも64x64です。それらは円でテクスチャリングされています。「上の」正方形は、そのように下の正方形から少し下に配置されます。
円のテクスチャは、円を形成する単色であり、次に完全に透明な周囲の領域(t)です。
OpenGLがレンダリングすると、下の正方形は深度テストに失敗し、その上のピクセルは透明ですが描画されないため、画像全体ではなく、下のレイヤーから半円の効果が得られます。
どうすればこれを防ぐことができますか?
c++ - 深度に影響しますか、それともフラグメントシェーダーの内側からステンシルバッファーに影響しますか?
gl_FragDepthに書き込むことで、GLSLの深度バッファーに書き込む内容を制御できることは知っていますが、ステンシルバッファーに書き込むことはできますか?
また、ピクセルがステンシルまたは深度テストに失敗したかのように、フラグメントシェーダー内からピクセル書き込みを完全にキャンセルできますか?
ありがとう
opengl-es - WebGL で深度バッファを読み取るにはどうすればよいですか?
WebGL API を使用して、独自のレイキャスティングを実行する以外に、深度バッファーから値を取得したり、画面座標から 3D 座標を特定したり (つまり、クリックされた場所を見つける) するにはどうすればよいですか?
android - OpenGL ES 1.1 を使用する Android バージョン間の深度バッファの違い
OpenGL ES 1.0 で 2D ゲームを作成しています (該当する場合は 1.1 拡張機能にキャストします)。明らかな何かを見逃した場合に備えて、これをできるだけ一般的なものにしようとしています。
Android 2.2 (Froyo) と Android 2.3.3 (Gingerbread) の間の深度テストに関して問題があります。現在、onCreateには次のものがあります。
OES_draw_texture
拡張機能を使用すると、深度バッファーを正常に使用できますが、これは問題ではありません。ただし、頂点の従来の描画に Z 値を指定すると、バージョン間で奇妙な不一致が発生します。
2.2 では、次のコードが前面 (一番上) にレンダリングされます。
これで問題なく動作しますが、2.3.3 ではオブジェクトがさらに後方に押し出されます。2.3.3 を使用して正しい位置を取得するには、次の手順を実行する必要があります。
これにより、問題が修正されます。
私の質問は 2 つあります。
- 深度バッファを 1 ~ 320 に指定したのに、Z 値を +ve ではなく -ve と指定しなければならないのはなぜですか? 標準の (非 ES ではありますが)ドキュメントには、zNear と zFar を -ve または 0 にすべきではないと明確に記載されています。
- このように 2.2 と 2.3.3 の間に相違があるのはなぜですか? 私は、2.3.3 が近い値として 1 を持つことによって「正しい」方法でそれを行っているという印象を受けています。これは私が期待したものです。では、深度バッファの半分が事実上無視されるのはなぜですか?
Gingerbread が暗黙のうちに想定している特定のコマンドが欠落している可能性があると思いますが、Froyo はそうではありませんが、確信が持てません。どんな助けでも大歓迎です。
iphone - OpenGL ES 2.x: 深度バッファ glDiscardFramebufferEXT を破棄する方法は?
iOS OpenGL ES Logical Buffer Loadsを読んで、各描画サイクルの後に深度バッファーを「破棄」することでパフォーマンスが向上することを確認しました。これを試してみましたが、ゲーム エンジンがレンダリングされなくなったためです。次のサイクルをレンダリングしようとすると、glError 1286 または GL_INVALID_FRAMEBUFFER_OPERATION_EXT が発生します。
深度バッファを破棄する場合は、サイクルごとに深度バッファを初期化またはセットアップする必要があると感じていますが、これに関する情報が見つからないようです。深度バッファを初期化する方法は次のとおりです(実際にはすべてのバッファ):
そして、各描画サイクルの最後に深度バッファーを破棄するために私がやろうとしていることは次のとおりです。
すべてのドローコールの直後にそれを呼び出すと...
何か案は?誰かが私に指摘できる情報はありますか?この件に関するAppleのガイド(元のアイデアを得た場所)、http://developer.apple.com/library/ios/#documentation/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/WorkingwithEAGLContexts/WorkingwithEAGLContexts.htmlを読んでみましたが、そうではありません私にはうまく機能していないようです。
ios - 深度テストを使用したOpenGLポイントスプライト-ブレンディングの問題?
ポイントスプライトを(iOSでOpenGL ES 2.0を使用して)ユーザーの描画ストロークとしてレンダリングしています。これらのポイントを頂点バッファオブジェクトに保存しているので、スプライトが描画に送信されたときに正しい順序で表示されるように、深度テストを実行する必要があります。
次のスクリーンショットに示すように、これらの描画ストロークをレンダリングすると、奇妙な効果が見られます。
青のストロークの端の周りの背景色の「境界線」に注意してください。ここでは、緑の上に描画されています。ユーザーは緑のストロークの後に青のストロークを描画しましたが、VBOが再描画されると、青のストロークが最初に描画されます。緑のストロークを描くことになると、深度テストが開始され、青のストロークの後ろにあるはずであることがわかります。これもある程度の成功を収めています。ある種のブレンディングの問題であるように見えますか、それともフラグメントシェーダーで色を誤って計算することに関係していますか?すべてのストロークのエッジは透明である必要がありますが、フラグメントシェーダーは、それらのフラグメントを処理するときに、それを背景テクスチャと組み合わせているように見えます。
私のアプリでは、深度レンダーバッファーを作成し、glEnable(GL_DEPTH_TEST)
を使用して呼び出しましたglDepthFunc(GL_LEQUAL)
。glDepthMask()
私は無駄に実験しました。ブレンディングはに設定されglBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA)
、ポイントスプライトカラーは事前に乗算されたアルファ値を使用します。描画ルーチンは非常に単純です。
- レンダリングからテクスチャへのFBOをバインドします。
- 背景テクスチャを描画します。
- (多数のVBOから)ポイントスプライトを描画します。
- このFBOのテクスチャをメインフレームバッファに描画します。
- メインフレームバッファを提示します。
編集
これが描画ルーチンからのコードです。
描画前のセットアップ状態:
描画ルーチン:
助けてくれてありがとう。
opengl - フラグメントシェーダーで gl_FragCoord.z を使用して最新の OpenGL で深さを線形にレンダリングする方法は?
フラグメントシェーダーで深度を取得することに関する多くの情報を読みました。
そのような
http://www.opengl.org/discussion_boards/ubbthreads.php?ubb=showflat&Number=234519
gl_FragCoord.z
しかし、線形かどうかはまだわかりません。
GLSL仕様では、その範囲はスクリーンスペースで[0,1]であり、線形かどうかは言及されていません。
レンダリングされたモデルを使用して Kinect の深度マップを一致させるため、線形性は非常に重要だと思います。
それが線形でない場合、ワールド空間で線形化する方法は?
opengl-es - OpenGL(ES)で一致するポリゴンを正しくレンダリングする方法
OpenGL ESで深度関数を設定することにより、3Dシーンでオーバーラップするジオメトリがどのようにレンダリングされるかを制御できることを理解しています。gl.depthFunc(gl.LEQUAL)
コードで(webgl)を使用しています。
ただし、2セットのポリゴンが一致し、色が異なる場合、結果のサーフェスは2つの色の任意の混合パターンになります(カメラの位置が変わると変化するため、ちらつきが発生します)。この画像を見てください:
どうすればこれを修正できますか?さまざまなdepthFunc値を試しましたが、どれもこの問題を解決しません。一致するポリゴンを単色にしたいのですが、どちらでも構いません。