2012-04-14 2 views
2

Я пытаюсь реализовать очень базовое отложенное затенение в DirectX9. У меня есть возможность прямо использовать только две цели рендеринга (задний буфер и другая текстура). Поэтому я могу отображать нормали или глубину, но не обе. Мой вопрос: может кто-нибудь объяснить, как сделать более чем одну цель текстуры. Я был под впечатлением, что могу просто использовать что-то вроде кода ниже. Он работает только в том случае, если индексы равны нулю, что, вероятно, означает, что одна из поверхностей не записывается.Несколько целей визуализации в DirectX9

d3dDevice->SetRenderTarget(0, surfaceDepth); 
d3dDevice->SetRenderTarget(1, surfaceNormal); 

Я получаю сообщение: Direct3D9: (WARN): не может сделать к цели визуализации, который также используется в качестве текстуры. Цель рендеринга была обнаружена как связанная, но не могла определить, действительно ли текстура использовалась при рендеринге.

Я знаю, что, возможно, есть несколько вещей, которые могут быть связаны с этим сообщением ... Я думаю, если кто-то может объяснить, как правильно использовать несколько целевых индексов рендеринга. Также вы меняете технику для каждой цели рендеринга. Прямо сейчас у моего шейдера есть «обычная техника» и «техника глубины» и «техника после обработки» для трубопровода.

Спасибо за ваше время.

здесь некоторый код:

SetTransforms(); 
d3dDevice->SetRenderTarget(0, surfaceDepth); 
HR(d3dDevice->Clear(0, NULL, D3DCLEAR_ZBUFFER | D3DCLEAR_TARGET, 0xff000000, 1.0f, 0)); 
scenes[sceneIndex]->setTechnique("depthTech"); 
scenes[sceneIndex]->render(dt); 

d3dDevice->SetRenderTarget(1, surfaceNormal); 
HR(d3dDevice->Clear(0, NULL, D3DCLEAR_ZBUFFER | D3DCLEAR_TARGET, 0xff000000, 1.0f, 0)); 
scenes[sceneIndex]->setTechnique("normalTech"); 
scenes[sceneIndex]->render(dt); 
+0

Вы также установили эти поверхности как текстуры? (в вызове d3dDevice-> SetTexture (...)) – Torious

+0

im установка текстуры с текущим fx. что значит называть заданную текстуру с устройства? Я использовал это первоначально, чтобы развязать текстуру как: pDevice-> SetTexture (0, NULL); // отвязывает текстуру для рендеринга \t pDevice-> SetTexture (1, NULL); // отвязывает текстуру для рендеринга – iEATeVo

+0

nm Я понял это ... я неправильно понял, что происходило за кулисами. – iEATeVo

ответ

2

Вы просто сказать установить d3dDevice-> SetRenderTarget (п, поверхность) для всех целей, где п является целевой номер, а затем установить технику, которая выводит к кратному рендеринга целевой структуры в пиксельном шейдере

2

Ваш вопрос заставил меня разобраться в этом вопросе более интенсивно.

Вот что я нашел:

сначала вы должны проверить D3DCAPS9.NumSimultaneousRTs. Это больше, чем 1? Все rendertargets должны быть SAME resulution и bit depth, но могут быть разных форматов. Вы не можете использовать сглаживание.

Смежные вопросы