2

DX 9.0cのピクセルシェーダー2.0を介して深度バッファーにアクセスすることは可能ですか?私は少しグーグルで調べました、そして私が見つけた唯一の解決策はGeForce6と7でのみ機能するGPUハックを説明しています。

私が達成しようとしているのは、被写界深度シェーダー効果を作成することです。他の後処理に使用されるテクスチャへのレンダリングトリックも行っているため、頂点のZ座標を単純に取得することはできません。

編集:

私はこれを試しました:

D3DXCreateTexture(lpD3Dev9, width, height, 1, D3DUSAGE_DEPTHSTENCIL, D3DFMT_D24S8, D3DPOOL_DEFAULT, &lpD3DepthBuffer);
lpD3DepthBuffer->GetSurfaceLevel(0,&lpNewDepthBuffer);

lpD3Dev9->GetDepthStencilSurface(&lpPrevDepthBuffer);
lpD3Dev9->SetDepthStencilSurface(lpNewDepthBuffer);
lpD3Dev9->BeginScene();
// Rendering...
lpD3Dev9->EndScene();
lpD3Dev9->SetDepthStencilSurface(lpPrevDepthBuffer);

// this function fails:
D3DXSaveTextureToFile("C:\backBuffer.png", D3DXIFF_PNG, lpD3DepthBuffer, NULL);

lpD3Dev9->BeginScene(); 
UINT passes;
D3DXHANDLE tech;
lpD3DXfxScreen->FindNextValidTechnique(0, &tech);
lpD3DXfxScreen->SetTechnique(tech);
lpD3DXfxScreen->Begin(&passes,0);
lpD3DXfxScreen->SetTexture("texDepth", lpD3DepthBuffer);
// render shader...

SaveTextureToFileは失敗し、シェーダーは真っ白なRGB(1、1、1)のテクスチャを取得します

4

1 に答える 1

2

私の知る限り、あなたがやろうとしているように、標準化された方法はありません。D3FMT_R32F (または何でも) テクスチャを D3DUSAGE_RENDERTARGET として作成し、通常のテクスチャであるかのように深さを書き込む (つまり、ピクセル シェーダから r コンポーネントに深さを書き込む) 方がよいでしょう。次に、そのテクスチャをサンプラーにバインドし、そこから r 値を直接読み取って、混乱しているピクセル シェーダーで使用することにより、純粋に好きな目的でそのテクスチャを使用できます。

そうは言っても、DirectX コントロール パネルに移動して、ランタイムをデバッグするように設定してみてください。DirectX ランタイムによって大量の有用なエラー メッセージがデバッグ出力ストリームに吐き出されるのがわかります。このような問題で多くの手間が省けるので、これを行わない理由はありません。

于 2011-09-07T21:34:33.117 に答える