Снимите привязку текстуры, используя 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. Обратите внимание, что в этом случае матрицы устанавливаются главным по столбцу (что означает, что вам нужно умножить вектор слева в шейдере). Эффективное решение состоит в том, чтобы выделить непрерывное пространство для констант и установить их в одном вызове.