Как получить доступ к буферу глубины в пиксельном шейдере в DirectX 9.0 c - PullRequest
1 голос
/ 04 сентября 2011

Возможно ли получить доступ к буферу глубины через пиксельный шейдер 2.0 в DX 9.0c?Я немного погуглил, и единственное решение, которое я нашел, описывает взлом GPU, который работает только на GeForce 6 и 7.

То, чего я пытаюсь добиться - это написать эффект шейдера глубины поля.Я не могу просто получить координаты 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)

1 Ответ

2 голосов
/ 08 сентября 2011

Насколько мне известно, не существует стандартизированного способа сделать это, как вы пытаетесь это сделать. Вам лучше просто создать текстуру D3FMT_R32F (или любую другую) в виде D3DUSAGE_RENDERTARGET, а затем записать в нее глубины, как если бы это была обычная текстура (т.е. записать глубину в компоненте r из пиксельного шейдера). Затем вы можете использовать эту текстуру для любых целей, которые вам нравятся, просто привязав ее к сэмплеру и считав значение r прямо из него, чтобы использовать его в любом пиксельном шейдере, с которым вы связываетесь.

При этом попробуйте зайти в панель управления DirectX и настроить себя на отладку среды выполнения. Вы увидите тонну полезных сообщений об ошибках, выдаваемых в поток вывода отладки во время выполнения DirectX. На самом деле нет причин не делать этого, поскольку это избавит вас от многих проблем, подобных этой.

...