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

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

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

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

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

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

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

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

0

Решение

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

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

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

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]