DirectX шейдер постобработки - PullRequest
1 голос
/ 25 июня 2009

У меня есть простое приложение, в котором мне нужно позволить пользователю выбрать шейдер (.fx HLSL или файл сборки, возможно, с несколькими проходами, но со всеми и только пиксельными шейдерами) и просмотреть его.

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

У меня настроена комбинация вершинных / пиксельных шейдеров, которая берет квад и выводит его на экран, текстурированный выбранным изображением. Это работает отлично. Затем мне нужно запустить другой эффект, чисто пиксельный шейдер, на выходе первого эффекта и отобразить окончательное изображение (после обработки) на экране. Это не работает вообще.

Последние несколько дней я пытался заставить его работать, но без видимой причины идентичные блоки кода, используемые для визуализации каждого эффекта, отображают только первый. Я могу добавить второй файл шейдера в качестве второго прохода в первый файл шейдера, и он отлично работает (хотя полностью противоречит моей цели предварительного просмотра пользовательских шейдеров). Когда я пытаюсь использовать второй эффект (который прекрасно загружается и компилируется), он ничего не делает. Я взял результаты первого шейдера (с GetRenderTargetData) и поместил их в текстуру и поверхность (destTex и destSur), затем установил эту текстуру в качестве входных данных для второго прохода (используя dev-> SetTexture и более поздний эффект-> SetTexture ("thisframe", destTex)).

Все вызовы завершаются успешно, эффекты компилируются, текстуры загружаются, отрисовываются квадраты, но эффект не виден. Сначала я подозревал, что причиной этого является устройство (созданное с программной обработкой вершин), но, похоже, это не так (пробовал с аппаратным и смешанным). Кроме того, используя устройства HAL и REF (это не проблема, поскольку приложение в любом случае не работает в реальном времени), этот второй шейдер не виден. Все написано на C ++ для Direct3D 9.

Ответы [ 3 ]

1 голос
/ 07 июля 2009

Сначала создайте текстуру, затем визуализируйте первый шейдер непосредственно в эту текстуру. Наконец, рендер второго шейдера с текстурой в качестве входных данных для Backbuffer.

1 голос
/ 06 марта 2010

Попробуйте очищать буфер глубины-трафарета после каждого рендеринга квадрата.

0 голосов
/ 28 июня 2009

Для запуска пиксельного шейдера должен быть какой-либо ввод вершин и обработка вершин (либо фиксированная функция, либо шейдер). Вы предоставляете вершинный шейдер, и если да, то уверены ли вы, что он выполняет то, что ожидает пиксельный шейдер? Как выглядит ваш розыгрыш?

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

...