問題タブ [depth-testing]

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 に答える
6261 参照

unity3d - リバース デプス マスク シェーダー

Unity3Dで開発しています。

ここで定義されている深度マスク シェーダを使用すると、シェーダを使用したマスクの背後にあるオブジェクトは描画されません (マスクの前にあるオブジェクトのみが描画されます)。参照されているコードを使用して、逆の深度マスクを作成しようとしました。これは、カメラがその背後にあるオブジェクトのみを描画することを目的としています。

私がしたことは変化でした

の中へ

私も試しました

ただし、何が起こるかというと、カメラはマスクの後ろまたは前にあるすべてのオブジェクトを描画します。逆深度マスクを実装するにはどうすればよいですか?

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

javascript - three.jsでメッシュのrenderDepthが無視されているようです

他のすべての上にメッシュをレンダリングしたいのですが、このソリューションはうまくいきます: Three.js - 別の上にあるジオメトリ

同じことが mesh.renderDepth で達成できるかどうか疑問に思っていましたが、今のところ機能させることができませんでした。renderDepth は、material.depthTest または depthWrite が false に設定されている場合にのみ効果があるようですが、同じオブジェクト内での深さの順序付けはもちろん間違っています: http://jsfiddle.net/SF9tX/22/

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

c++ - OpenGL デプス バッファの動作が期待どおりではない

私は教育的追求のためのエンジンの始まりに取り組んでおり、理解していると思っていた OpenGL の概念に出くわしましたが、私が観察してきた動作を説明することはできません。問題は深度バッファにあります。また、問題を修正したことを理解してください。投稿の最後で、問題を修正した理由を説明しますが、私のソリューションで問題が修正された理由がわかりません。まず、GLUT と GLEW を初期化します。

次に、プログラムを初期化します (読みやすさと関連性の欠如のためにセグメントを除外します)。

それ以降は、さまざまなエンジン コンポーネントの初期化、.obj ファイルの読み込み、ModularGameObject クラスのインスタンスの初期化、それらへのメッシュのアタッチが含まれます。ただし、先に進む前に、次の値を指定することが重要な場合があります。

これにより、ビューポートは右手の座標系に従います。問題に関与していると思われるコードの最後の部分は、私の頂点シェーダーです。

このコードにより、すべての変換と通常の計算 (含まれていない) が正しく実行されますが、モデルの各面は常に他の面よりも優れているように戦っています。問題がないのは、描画されている最初のモデルの内側に立っているときだけで、ちらつきはなく、スザンヌの頭の内側を本来のように見ることができます。

考えられることを何週間も試した後、最終的に、わずか2行のコードを変更/追加することで解決策にたどり着きました。まず、頂点シェーダーのメイン関数の最後に次の行を追加しました。

このコード行の追加により、Z ファイティングのすべてのビットがなくなりましたが、深度バッファーが完全に後方になり、遠くにある頂点が前方の頂点の上に確実に描画されていました。これが私の最初の質問です。なぜこのコード行がより信頼性の高い動作を引き起こすのでしょうか?

信頼できる動作が得られ、深度ファイティングがなくなったので、描画順序を逆にするだけで済みました。そのため、glDepthRange への呼び出しを次のように変更しました。

私は、glDepthRange(0.0f, 1.0f) が Z_NEAR (-0.1) に近いオブジェクトを 0 に近づけ、Z_FAR(-1000) に近いオブジェクトを 1 に近づけると仮定していました。 Depth Test を GL_LESS に設定することは完全に理にかなっています。実際のところ、私の Z_NEAR と Z_FAR が何であるかに関係なく、glDepthRange が値をマップする方法が間違っていなければ、これは当てはまります。

ただし、この行の変更は、私に近いオブジェクトが深度バッファーに 1 に近い値を格納し、さらにオブジェクトが後方描画順序をレンダリングする 0 の値を持つことを意味するため、間違っているに違いありませんが、確かにそれは魅力。

誰かが私の仮定が間違っている理由と、gsl と深度バッファリングの理解を考慮に入れていない可能性があることの方向性を教えてくれれば。エンジンの基礎の機能を完全に理解するまで、エンジンの進歩に進みたくありません。

編集: 私の _cameraPerspective マトリックスの内容は次のとおりです: 透視マトリックス図

AspectX は 16、AspectY は 9 です。焦点距離のデフォルトは 70 ですが、実行時にこれを変更するためのコントロールが追加されました。

derhass によって指摘されましたが、これは glOrtho() に渡された情報がシェーダーによってどのように考慮されるかを説明していません。標準のパイプラインとマトリックス スタックを使用していないため、ビューポートのサイズは _inverseScreenDimensions で考慮されます。これは [1/X_RIGHT, 1/Y_UP, 1/Z_Far, 1] を含む vec4 です。または、変数名がない場合は、[1/1000、1/1000、-1/1000、1]。

頂点シェーダーでこれをスクリーン座標ベクトルに掛けると、X 値は -1 から 1 の間、Y 値は -1 から 1 の間、Z 値は 0 から 1 の間になります (オブジェクトがカメラの前にあった場合、最初は負の z 座標)、W は 1 です。

私が間違っていなければ、これが「デバイス座標」に到達するための最後のステップであり、続いてメッシュを描画します。

元の質問を心に留めておいてください: 私はこれが合理化されていないことを知っています.GLMやこれに最もよく使用されるすべてのライブラリを使用していないことは知っています. 私の質問は、私が行った変更によってこれが修正されたのはなぜですか?

0 投票する
0 に答える
1330 参照

c# - OpenGL フレームバッファ深度バッファが機能しない

色と深度のバッファを持つフレームバッファ オブジェクトを作成しようとしています。カラー バッファは正常に機能しますが、深度バッファは機能しません。

デフォルトのフレームバッファを使用すると問題なく動作するため、問題がシーン描画ルーチンにある可能性は低いです。深度テストが無効になっている場合、シーンは何かを描画しますが、深度テストが有効になっている場合、シーンは描画されません。深度バッファが作成され、フレームバッファにアタッチされる方法に問題があるとしか結論付けられません。フレーム バッファーが正常に作成されました。さまざまな深度バッファー形式と同等のレンダー バッファーを試しましたが、これらの変更のいずれも違いがないようです。

glReadPixels を使用して深度バッファーのピクセルを読み取ろうとしました。いくつかの変更があったようで、シーンが深度バッファーに正常に書き込んでいることを示しています。

以下は、フレーム バッファを作成するためのコードです。問題をさらに修正したり、デバッグするのに役立つものは他にありますか? おそらく、カスタム フレームバッファ用に設定する必要があるが、デフォルトではないものでしょうか?

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

opengl - OpenGl アルファ テスト - 非推奨の AlphaFunc を置き換えるには?

アルファ付きの球体を描画しようとしていますが、Z バッファーに問題があります。一部のピクセルは透明ですが、Zbuffer に書き込むため、すぐ後ろの不透明なピクセルは隠されます。

ここに私の設定があります:

私はその機能を知っており、glAlphaFunc(GREATER, aFloat)それenable(ALPHA_TEST)を行うことができますが、OpenGL の 3.1 バージョン以降、非推奨の機能であることを読みました。ALPHAFunc を使用せずに正しいレンダリングを行うにはどうすればよいですか? 誰かがシェーダーを介してこれを行うためのトリックや方法を知っていますか?

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

c++ - OpenGL: Radeon ドライバーが深度テストを混乱させているようです

ここで深度テストで非常に奇妙な問題が発生しています。深度テストを有効にし、glDepthFunc を GL_LESS に設定して、Windows の OpenGL 3.3 コア プロファイル コンテキストで単純なメッシュをレンダリングしています。私のマシン (nVidia Geforce GTX 660M を搭載したラップトップ) では、すべてが期待どおりに機能しており、深度テストが機能しています。これは次のようになります。

ここに画像の説明を入力

ここで、このプログラムを別の PC (Radeon R9 280 を搭載したタワー) で実行すると、次のようになります。

ここに画像の説明を入力

奇妙なことに、描画する前にすべてのフレームで glEnable(GL_DEPTH_TEST) を呼び出すと、両方のマシンで正しい結果が得られます。それを行うとうまくいくので、両方のマシンで深度バッファが正しく作成されていると思います。初期化時に一度だけ有効にすると、レンダリング前に深度テストが何らかの形で無効になっているようです。どういうわけか問題の一部になる可能性のある最小限のコードは次のとおりです。

コンテキストが作成されて現在の状態になった後、初期化時に呼び出されるコード:

バッファ スワップの前にすべてのフレームを呼び出すコード:

上記のコードでは、Radeon で間違った出力が得られます。注: コンテキストの作成には GLFW3 を使用し、関数ポインターには GLEW を使用しています (もちろん、数学には GLM を使用しています)。頂点配列オブジェクトには、位置、UV 座標、および法線用の 3 つの属性配列バッファーが含まれています。フレームごとに深度テストを有効にすると、すべてが正常に機能するため、これらのそれぞれを正しく構成してシェーダーに送信する必要があります。

また、Radeon マシンは Windows 8 を実行し、nVidia マシンは Windows 7 を実行していることにも言及する必要があります。

編集: リクエストに応じて、メッシュをロードして属性データを作成するために使用されるコードを次に示します。エレメント ドロー コールを使用していないため、エレメント バッファ オブジェクトは作成しません。

.obj の読み込みルーチンは、主に次のものから変更されています: http://www.limegarden.net/2010/03/02/wavefront-obj-mesh-loader/

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

c++ - 深度バッファをテクスチャにレンダリングするパイプラインの問題は何ですか?

私の理解による深さテストの主な手順: 1) 深さテストを有効にし、深さテストを行う方法 2) フレーム バッファ オブジェクトを作成し、それに深さが付加されていることを確認します 3) フレーム バッファ オブジェクトをバインドします (必ずレンダリングする前にそれをクリアしてください)4)ものを描く

そして、それはいいえ?フレーム バッファ深度アタッチメントには深度データが必要ですか? しかし、私は常にストレート1のデフォルトの深度クリアカラーを取得します

ステップ1:

ステップ2:

.

ステップ 3:

ステップ 4:

これらはステップではありませんか?
何か不足していますか?
いくつかの異なるチュートリアルを試しました。
テクスチャにレンダリングする深さを得ることができません。ストレート 1 を何度も取得し続けます。

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

opengl - openGL のレンダー深度の値が 1 に近いのはなぜですか?

基本的なことをやっています

1) 位置を計算する
2) 「gl_Position」に保存する
3) 次に、位置情報に基づいて深度を vec2 に保存する

vDepth は、シェーダーの上記の変数で、フラグメント シェーダーに渡します

フラグメントシェーダーでは、フラグメントの深さを gl_FragDepth に保存します

私の深度値はすべて 1 の値に近いです。何か間違ったことをしていますか? 線形深度値を取得するステップが欠落している可能性はありますか? カメラ情報を計算すると、ニア クリッピングは 0.01 で、ファー クリッピングは 200.0fi です。ニアがそのクリッピング スペースの周囲にある必要があります。