問題タブ [stencil-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-es - glColorMask/glDepthMask vs フラグメントシェーダー
OpenGL ES 2.0 では、カラー バッファーと深度バッファーへの書き込みが glColorMask/glDepthMask で無効になっている場合 (ステンシル バッファーのみを変更したいため)、フラグメント シェーダーが何かを書き込むことができるバッファーがありません。この場合、フラグメントシェーダーが実行されないと合理的に推測できますか?
opengl - OpenGLで「AND」ステンシルを行うには?
レンダリングされたシーンがあり、画面の一部でのみ行われる後処理を行っています。球を使用して領域を「カット」しますが、「完全な」球が得られますが、球の内側にあるサーフェスの「AND」カットが必要になります。説明するのは少し難しいですが、次の 2 つのモックアップが役立つことを願っています。シーンが青いもので、緑の球がステンシル メッシュだとしましょう。右の写真は、結果のステンシルを示しています。
それで...どうすればこれを行うことができますか? 現時点では、次のようなことをしています。
ただし、これにより、完全な球を持つステンシル バッファーが生成されますが、球の内側に残っているサーフェスのみが必要です。
directx - デフォルトで作成された深度ステンシル バッファによって引き起こされる問題
シャドウ マップの DirectX SDK のサンプルから学習しています。このサンプルは、初期化中にステンシル サーフェスを作成し、次のように述べています。
これは何を意味するのでしょうか?ステンシル バッファーを作成して操作するステートメントにコメントを付けようとしたところ、結果が非常に不安定になりました。誰かが私にこれを説明できますか? どうもありがとうございました!!!
opengl - OpenGL で stencil_texturing を正しく使用する
OpenGL の stencil_texturing 拡張機能を概念実証として実装しようとしています。私のビデオ カードは GL 4.3 までサポートしているので、stencil_texturing を利用できます。さらに明確にする必要がある場合は、http ://www.opengl.org/registry/specs/ARB/stencil_texturing.txt という仕様が提供されています。
したがって、テストの目的は、カラー バッファをフレーム 0 のテクスチャにレンダリングし、次にフレーム 1 の深度バッファ、最後にフレーム 2 のステンシル バッファをレンダリングすることです。簡単な部分は完了し、カラー バッファと深度バッファ テクスチャをレンダリングします大丈夫。私の問題はステンシル バッファにあります。この問題は、ステンシル バッファを理解していないことが原因であると考えています (これは非常によくあるケースです)。オンラインでいくつかの情報を見つけようとしましたが、入手できる情報はほとんどありません。
ここで何をレンダリングしているかを示すために、現在のフレーム キャプチャを示します: カラー バッファー、深度バッファー、ステンシル バッファー
したがって、ステンシル バッファーに対する私のビジョンは、中央の三角形をステンシル アウトすることです。つまり、中央の三角形のすべての値が 1 になり、テクスチャのすべての部分の値が 0 になります。レンダリング時にこれがどのように表示されるかはわかりません。しかし、ステンシル値が 1 の領域は、0 の領域とは異なると思います。
以下は私のコードです。私が彼らのために作ったフレームワークに投げ込むのは、単なるテストクラスです。定義されていない唯一のものは、基本的に glGetError() を呼び出してすべてが正しいことを確認する GLERR() だと思います。
opengl - フラグメント シェーダーでカスタマイズされたステンシル テストを行う方法
私のプロジェクトでは、'discard' 呼び出しを使用してカスタマイズされたステンシル テストを実行しました。これは、ステンシル テクスチャによって定義された特定の領域にのみ描画を試みるものです。フラグメント シェーダーのコードは次のとおりです。
このコードは機能しますが、'discard' 呼び出しが原因でパフォーマンスの問題が発生します。GPU シェーダーを使用してこれを行う別の方法はありますか? どうやってか教えて。
c++ - 画面外でのレンダリング (FBO および RenderBuffer を使用) および色、深度、ステンシルのピクセル転送
OpenGL で画面外にレンダリングしてから、画像を QImage に渡す必要があります。さらに、演習のために、深度とステンシル バッファも CPU に転送したいと思います。
オフスクリーンの描画には、フレーム バッファ オブジェクトをレンダー バッファと共に使用しました (テクスチャは必要ないため、テクスチャでは使用しません)。
カラー バッファ (実際の生の画像) を使用したピクセル転送操作は機能します。しかし、深さとステンシルが機能していません..深さの奇妙な画像とステンシルの何もありません。
まず、簡単な部分、私が実際に描いているもの:
ここでは、FBO と 3 レンダー バッファーの初期化を行います。
最後に、ピクセル転送の 3 つの方法を次に示します。
ここに2つのスクリーンショット(色と深さ、ステンシルを使用すると空のQImageが得られます):
カラーのものはまさに私が描いているものです(反転していますが、それは正常だと思います)。深さ..グラデーショングレーの三角形を持つ白い画像を期待しています..確かに、画像の形式に間違いがありますが( GL_FLOAT
?)、いくつかの組み合わせを試しましたが、これが最良の結果です..紫の背景にグリッチ色が入っている..ステンシル バッファ..黒の背景に白い三角形の輪郭を期待しているのですが..なぜ何も見えないのかわかりません..
編集:
ステンシル バッファを単独で使用しないでください。そのため、少しリファクタリングしました。
FBO を宣言する場合:
深度のピクセル転送:
ステンシルは似ていますがp_stencil
、rgb コンポーネントを使用しています
..結果の画像は、深度とステンシルの両方の黒い画像です
編集
Nicolas answer のおかげで、深度とステンシル バッファーの両方にレンダー バッファーを使用し、深度コンポーネントを抽出して、次のQImage::Format_ARGB32
コードに適合させることができました。
.. ステンシル コンポーネントにはまだいくつかの問題があります (次のコードは機能しません: グリッチ画像が生成されます):
c++ - DirectX - インスタンス化されたステンシル ボリュームを使用したディファード シェーディング
DXUT を使用して、DirectX9 を使用してグラフィック アプリケーションを作成しています。私のアプリケーションでは、ディファード シェーディングを実装したいと考えています。このライティング方法では、シーン内のライトごとにステンシル ボリューム ( mask ) をレンダリングする必要があります。ボリュームを個別にレンダリングすることを避けるために、DirectX のインスタンス化機能を使用したいと考えています。頂点シェーダー 3.0 とピクセル シェーダー 3.0 を使用して、特定のモデルの複数のインスタンスの描画に成功しましたが、インスタンス化されたステンシル ボリュームを描画しようとすると、バックバッファーの深度ステンシル サーフェスにデータが書き込まれないようです。
遅延シェーディングの私の実装は、擬似コードで次のようになります。
すべてのシーン ジオメトリ (インスタンス化されたジオメトリ パス) をバックバッファに描画します。
- Z を有効にする ( D3DRS_ZENABLE, TRUE )
- ZWrite を有効にする ( D3DRS_ZWRITEENABLE, TRUE )
- ステンシルを無効にする ( D3DRS_STENCILENABLE, FALSE )
- CullMode の設定 ( D3DRS_CULLMODE, D3DCULL_CCW )
- ColorWrites を無効にする ( D3DRS_COLORWRITEENABLE, 0 )
- アルファブレンディングを無効にする ( D3DRS_ALPHABLENDENABLE, FALSE )
- レンダーシーン
バックバッファーへのポインターを取得します。
- IDirect3DDevice9::GetRenderTarget( 0, pBackbufferSurface )
3 つの rendertargets ( COLOR( 0 )、NORMAL( 1 )、POSITION( 2 ) ) を設定します。
- IDirect3DDevice9::SetRenderTarget( 0 -> 2, COLOR -> POSITION)
すべてのシーン ジオメトリを 3 つのレンダー ターゲットに描画します。
- ColorWrites を有効にする ( D3DRS_COLORWRITEENABLE、CW_RED、CW_GREEN、CW_BLUE、CW_ALPHA )
- シーンをレンダリング
バックバッファをデバイス RenderTarget 0 にリセットします。
- IDirect3DDevice9::SetRenderTarget( 0, pBackbufferSurface )
エフェクト テクスチャ ( SrcColor ) を COLOR レンダー ターゲットに設定します。
- ID3DXEffect::SetTexture( "g_TextureSrcColor", pRTColor )
フルスクリーンのクワッドをレンダリングし、COLOR レンダー ターゲットからサンプルを作成します (シーンをペイントします)。
Instancing Technique を使用してすべてのシーン ライトをステンシルします (ここに実際のコードを示します)。
インスタンス バッファの頂点宣言は次のとおりです。
このメソッドは、インスタンス化せずに正常に機能します...インスタンス化により、深度ステンシルの書き込みが妨げられますか? PIX を使用してデバッグすると、「ピクセルがステンシル テストに失敗しました」と表示されます。レンダリング前にバックバッファをクリアする呼び出しは次のとおりです。
デバイスの作成中に、次のように AutoDepthStencilFormat D3DFMT_D24S8 を使用するように設定を変更します。
IDirect3DDevice9::Clear() のステンシル パラメーター (最後のパラメーター) を 1 に変更すると、ステンシル ボリュームはステンシル テストに合格します。ボリューム マスクがバックバッファのピクセルと交差し、そのイベントで、ライトのピクセル カラーが許可されます。これは、次の 2 つの問題のいずれかがあることを示しています。
- 'Instanced Geometry Pass' 中にシーン ( オブジェクト ) を描画するとき...オブジェクトが描画されるとき、バックバッファはオブジェクトの深さを保存していません (そのため、ステンシル テストは比較のために '0' の値を持ちます。
- ステンシル ボリューム ( ライト ) を描画するとき、バックバッファは描画されたボリュームの深さを格納していません...
これは私のインスタンス化方法によるものですか? シェーダーのバージョン(vs3、ps3)やDXのバージョンによるものでしょうか?