Снимите привязку текстуры, используя ID3DXEffect->SetTexture

У меня есть небольшая проблема при использовании инфраструктуры FX для привязки текстур к сэмплерам с использованием инфраструктуры FX:

ID3DXEffect->SetTexture(FXShadowtex,Lights->sunlight->ShadowTex)

После того, как эта текстура привязана к сэмплеру, мне не разрешается снова ее визуализировать (скажем, когда солнце меняет положение). Когда я это делаю, появляются следующие ошибки:

Direct3D9: (ПРЕДУПРЕЖДЕНИЕ): невозможно выполнить рендеринг в цель рендеринга, которая также используется в качестве текстуры. Цель рендеринга была обнаружена как связанная, но не смогла определить, действительно ли текстура использовалась при рендеринге.

Тем не менее, я не могу узнать, как "сбросить" текстуру с помощью фреймворка FX или чего-либо еще надежного. Я попробовал несколько вещей:

  • ID3DXEffect-> SetTexture (FXShadowtex, NULL). Это вызывает сбой.
  • ID3DXEffect-> SetTexture (FXShadowtex, SomeDummy). Это действительно безобразно.
  • Узнайте, какой индекс сэмплера соответствует сэмплеру, определенному в fx-файлах после компиляции, и установите для него значение NULL: IDirect3DDevice9-> SetTexture (i, NULL). Это, очевидно, не очень практично.
  • Забудьте о предупреждении. Это делает вывод отладки D3D бесполезным благодаря бесконечному количеству спама, и это тоже довольно уродливо.
  • Перед выполнением какого-либо рендеринга выполните цикл от нуля до количества сэмплеров, определенных в файлах fx, и установите для всех них значение NULL. Это тоже безобразно.

Есть ли какой-то другой подход, о котором я забыл? Объяснение того, почему любое из вышеприведенных "решений" является необходимым злом, также было бы хорошо.:)

1 ответ

Решение

Узнайте, какая единица текстуры связана с этой формой сэмплера (см. Класс ID3DXEffect в msdn), а затем просто сбросьте текстуру с помощью IDirect3DDevice9::SetTexture().

Я думаю, что это решение наименее уродливо в этом случае. Тем не менее, вы всегда можете написать свой собственный класс эффектов (что довольно просто, кстати).

Используйте, например, D3DXCompileShaderFromFile, затем вы можете просмотреть возвращаемую таблицу констант и установить единообразные значения с помощью IDirect3DDevice9:: SetPixelShaderConstantF. Обратите внимание, что в этом случае матрицы устанавливаются главным по столбцу (что означает, что вам нужно умножить вектор слева в шейдере). Эффективное решение состоит в том, чтобы выделить непрерывное пространство для констант и установить их в одном вызове.

Другие вопросы по тегам