Вопрос

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

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

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

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

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

Это было полезно?

Решение

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

Другие советы

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top