Постобработка/копирование текстур Direct3D

Итак, я пытаюсь реализовать некоторую постобработку Direct3D, и у меня возникают проблемы с рендерингом текстур. В общем, моя программа выглядит так:

// Render scene to "scene_texture" (an HDR texture)...

...

device->SetRenderTarget(0, brightpass_surface);
device->SetTexture(0, scene_texture);
// Render "scene_texture" to "brightpass_texture" using full-screen quad.
// This involves passing the quad geometry through a brightpass shader.

...

device->SetRenderTarget(0, ldr_surface);
device->SetTexture(0, brightpass_texture);
// Render "brightpass_texture" to "ldr_surface" using full-screen quad...

Я пропустил некоторые части, т.к. есть изрядное количество кода (я просто пытаюсь понять общую идею). К сожалению, приведенное выше приводит к пустому экрану. Вот что я хочу, чтобы произошло:

  1. Рендеринг сцены в текстуру (HDR)
  2. Визуализируйте эту текстуру во вторую текстуру ЧЕРЕЗ шейдер BrightPass.
  3. Рендерим вторую текстуру на видимую поверхность LDR.

Обратите внимание, что если я изменю последнюю строку выше с

device->SetTexture(0, brightpass_texture);

to

device->SetTexture(0, scene_texture);

Тогда все работает. Обратите внимание, что я пытался пропустить шейдер BrightPass и просто передать пиксели, но это тоже не работает.


person Matt Fichman    schedule 15.10.2009    source источник


Ответы (3)


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

Вместо этого я включил мультисэмплинг в цели рендеринга HDR-сцены (scene_texture) и отключил его в структуре PRESENT_PARAMS. Это хорошо, потому что мультисэмплинг мне нужен был только для рендеринга сцены.

person Matt Fichman    schedule 15.10.2009

Убедились ли вы, что создали Brightpass_texture с флагом рендеринга в текстуру?

person Blindy    schedule 15.10.2009

Выдает ли среда выполнения отладки какие-либо ошибки? Как получить ldr_surface?

Что произойдет, если вы отрендерите свою сцену прямо в ldr_surface и обойдете весь материал HDR? Вещь, вероятно, будет выглядеть немного насыщенной, но она должна дать вам представление ...

person Goz    schedule 16.10.2009
comment
Это работает, если я визуализирую прямо на поверхность LDR (с насыщением, как вы предложили). - person Matt Fichman; 17.10.2009
comment
хммм... что говорит отладочная извержение? - person Goz; 17.10.2009