У меня есть простое приложение, в котором мне нужно позволить пользователю выбрать шейдер (.fx HLSL или файл сборки, возможно, с несколькими проходами, но со всеми и только пиксельными шейдерами) и просмотреть его.
Приложение запускается, появляется список шейдеров, и кнопка запускает «окно предварительного просмотра».
В этом окне предварительного просмотра (в котором есть окно просмотра DirectX) пользователь выбирает изображение, и шейдер запускается на этом изображении и отображается. Необходимо отобразить только один кадр (не в реальном времени).
У меня настроена комбинация вершинных / пиксельных шейдеров, которая берет квад и выводит его на экран, текстурированный выбранным изображением. Это работает отлично.
Затем мне нужно запустить другой эффект, чисто пиксельный шейдер, на выходе первого эффекта и отобразить окончательное изображение (после обработки) на экране. Это не работает вообще.
Последние несколько дней я пытался заставить его работать, но без видимой причины идентичные блоки кода, используемые для визуализации каждого эффекта, отображают только первый. Я могу добавить второй файл шейдера в качестве второго прохода в первый файл шейдера, и он отлично работает (хотя полностью противоречит моей цели предварительного просмотра пользовательских шейдеров). Когда я пытаюсь использовать второй эффект (который прекрасно загружается и компилируется), он ничего не делает.
Я взял результаты первого шейдера (с GetRenderTargetData) и поместил их в текстуру и поверхность (destTex и destSur), затем установил эту текстуру в качестве входных данных для второго прохода (используя dev-> SetTexture и более поздний эффект-> SetTexture ("thisframe", destTex)).
Все вызовы завершаются успешно, эффекты компилируются, текстуры загружаются, отрисовываются квадраты, но эффект не виден.
Сначала я подозревал, что причиной этого является устройство (созданное с программной обработкой вершин), но, похоже, это не так (пробовал с аппаратным и смешанным).
Кроме того, используя устройства HAL и REF (это не проблема, поскольку приложение в любом случае не работает в реальном времени), этот второй шейдер не виден.
Все написано на C ++ для Direct3D 9.