Пользовательский интерфейс WPF не отображается при визуализации содержимого Direct3D с использованием SlimDX - PullRequest
1 голос
/ 24 октября 2011

Я работаю над проектом, в котором у меня есть D3DImage, размещенный в приложении WPF.У меня есть другие элементы управления WPF, отображаемые поверх D3DImage, каждый с прозрачным фоном.Однако при рендеринге моей сцены мой пользовательский интерфейс исчезает до тех пор, пока я не наведу курсор на элементы управления (предположительно, заставляя их перерисовываться).

Я знаю, что это не должно быть проблемой, так как я достиг этого относительнонедавно без этой проблемы, но у меня больше нет этого проекта, поэтому я не могу сравнить свой код.Если у кого-то есть идеи относительно того, что это может быть, я весь в ушах.Я создам небольшой тестовый проект, чтобы попытаться воспроизвести этот вопрос завтра утром;тогда я обновлю этот вопрос.

Редактировать Мне удалось воспроизвести проблему, с которой я столкнулся, в простом проекте, который можно загрузить здесь .Примечание. Для запуска проекта вам понадобится последняя установленная версия SlimDX.

Редактировать Закомментирование вызова D3DImage.AddDirtyRect (...) в этом тестовом проекте приводит к тому, что пользовательский интерфейс будетнарисовано правильно.Однако при повороте объекта (и последующем повторном рендеринге 3D-контента при обновлении вращения) пользовательский интерфейс мигает и не отображается повторно.

1 Ответ

0 голосов
/ 25 октября 2011

Я нашел причину проблемы.По сути, в WPF при использовании D3DImage в качестве поверхности рендеринга для содержимого Direct3D нельзя использовать вызов метода Device.Present (), поскольку он обрабатывает представление переднего буфера.Это не должно быть сделано, поскольку D3DImage должен обрабатывать это сам, чтобы он мог применять правильные прозрачные пленки (см. здесь для получения дополнительной информации об этом).

Проще говоря, мое исправление состоялоиз двух частей:

  1. После создания поверхности рендеринга с помощью Surface.CreateRenderTarget(...) я должен передать цель на устройство с помощью mDevice.SetRenderTarget(0, mSurface).Это позволяет выполнять рендеринг на поверхности.
  2. Во время операции рендеринга я удалил вызов Device.Present(), чтобы WPF мог обработать правильный рендеринг буфера.

Я осмелюсьскажем, что объяснение не на 100% точное, но чтение по этой ссылке и вокруг документации MSDN для D3DImage должно прояснить ее.

...