Копировать текстуру в текстуру

Я сделал 2 программы для использования общих ресурсов, работающих на SlimDX и DirectX10. Одна программа будет отображать общую текстуру на 3D-сетке. Вторая программа загрузит изображение как текстуру. Пока мне нужно передавать совместно используемую обработку каждый раз, когда текстура обновляется с нового изображения.

Теперь есть способ инициализировать общую текстуру фиксированного размера (Texture2D), а затем каждый раз, когда я загружаю новое изображение, все, что мне нужно сделать, это загрузить его как текстуру, а затем скопировать в существующую текстуру. Таким образом, общий дескриптор не изменится, и я могу сэкономить некоторые накладные расходы на передачу общего дескриптора. Что касается DirectX9, я знаю, что есть функция для этого, «StretchRectangle», но я не могу найти ее или что-то подобное в DirectX10.

Промежуточный формат может быть любым, даже поверхностным, если я могу обновить его до общей текстуры.

Спасибо


person faulty    schedule 14.07.2010    source источник


Ответы (1)


А как насчет CopyResource () или CopySubresourceRegion ()? Я не знаю SlimDX, но они должны нормально работать в родном D3D10.

person Jesse Hall    schedule 14.07.2010
comment
CopyResource не работает. CopySubresourceRegion тоже не работает, но, возможно, я ошибся. У вас есть рабочий код? Мне просто нужен код, который успешно копирует текстуру. Я позабочусь об общей ручке, спасибо - person faulty; 15.07.2010
comment
Не могли бы вы подробнее рассказать о том, что не работает? Что случается? Если вы включите уровень отладки во время CreateDevice, получите ли вы какие-либо предупреждения или ошибки в выводе отладки? Эти вызовы являются основным способом копирования из одной текстуры в другую, поэтому, если они не работают, я, должно быть, неправильно понимаю ваш исходный вопрос. - person Jesse Hall; 15.07.2010
comment
Извините за дезинформацию. Не обошлось без текстуры. Но сегодня я просто понимаю, что на самом деле это было так, просто мне нужно избавиться от текстуры, тогда первая программа покажет текстуру. Итак, теперь я решил использовать CopyResource (). Но нужно воссоздавать текстуру при каждой перезагрузке. Может быть, из-за блокировки текстура не читается первой программой? - person faulty; 15.07.2010
comment
Не уверен, что вы имеете в виду под блокировкой. Общие поверхности сложны: поскольку команды рендеринга (включая Copy * ()) ставятся в очередь DX, вам нужно каким-то образом убедиться, что очередь очищена и команды завершены перед чтением с общей поверхности. Удаление текстуры, вероятно, делает это неявно. В C ++ вы должны использовать интерфейс IDXGIKeyedMutex для достижения этой цели без разрушения и повторного создания исходной текстуры; Я не знаю, доступно ли это в SlimDX. - person Jesse Hall; 17.07.2010