У меня есть небольшая проблема при использовании инфраструктуры FX для привязки текстур к сэмплерам с использованием инфраструктуры FX:
ID3DXEffect->SetTexture(FXShadowtex,Lights->sunlight->ShadowTex)
После того, как эта текстура привязана к сэмплеру, мне не разрешается снова ее визуализировать (скажем, когда солнце меняет положение). Когда я это делаю, появляется эта ошибка:
Direct3D9: (ПРЕДУПРЕЖДЕНИЕ): невозможно выполнить рендеринг в цель рендеринга, которая также используется в качестве текстуры. Цель рендеринга была обнаружена как связанная, но не смогла определить, действительно ли текстура использовалась при рендеринге.
Тем не менее, я не могу узнать, как «сбросить» текстуру, используя фреймворк FX или что-либо еще надежно. Я попробовал несколько вещей:
Есть ли какой-то другой подход, о котором я забыл? Объяснение того, почему любое из вышеприведенных «решений» является необходимым злом, также было бы хорошо. 🙂
Узнайте, какая единица текстуры связана с этой формой сэмплера (см. Класс ID3DXEffect в msdn), затем просто сбросьте текстуру с помощью IDirect3DDevice9 :: SetTexture ().
Я думаю, что это решение наименее уродливо в этом случае. Тем не менее, вы всегда можете написать свой собственный класс эффектов (что довольно просто, кстати).
Использовать например D3DXCompileShaderFromFile Затем вы можете просмотреть возвращаемую таблицу констант и установить одинаковые значения с IDirect3DDevice9 :: SetPixelShaderConstantF. Обратите внимание, что в этом случае матрицы устанавливаются главным по столбцу (что означает, что вы должны умножить вектор слева в шейдере). Эффективное решение состоит в том, чтобы выделить непрерывное пространство для констант и установить их в одном вызове.
Других решений пока нет …