WPF и DirectX 11 через D3DImage - PullRequest
       27

WPF и DirectX 11 через D3DImage

5 голосов
/ 01 февраля 2012

Я хочу использовать DirectX 11 из неуправляемого кода C ++ и использовать WFP для GUI. SlimDX мне не подходит. Я нашел решение сделать рабочий WPF с DirectX 10:

WPF и DirectX 10 через D3DImage

Но мне не удалось работать с DirectX 11. Просто пустой экран с двумя кнопками. Кто-нибудь знает, как заставить WPF работать с DirectX 11.

Также я видел, что когда я только запускаю этот пример, загрузка процессора составляет около 4-5% для Intel i5 750 (64-битная Windows 7, NVidia Geforce 430). Я думаю, что это слишком .. Можно ли уменьшить загрузку процессора?

Вы можете найти мой код здесь: http://www.gamedev.net/topic/619534-wpf-directx-11-via-d3dimage/

Ответы [ 3 ]

3 голосов
/ 02 февраля 2012

Я использовал неправильный формат для макета буфера вершин. Я использовал DXGI_FORMAT_B8G8R8A8_UNORM, но должен использовать DXGI_FORMAT_R32G32B32_FLOAT в моем случае.

2 голосов
/ 02 февраля 2012

Вы пропускаете вызов D3DImage.AddDirtyRect.После рендеринга сцены с помощью Direct3D11 необходимо сообщить WPF, что готово к показу новое изображение.Чтобы сделать это, вы выполните следующее, где d3dimage - это ваш экземпляр D3DImage:

d3dimage.Lock();

//...
//your render code
///...

var surface = renderTexture.GetSurfaceLevel(0);

d3dimage.SetBackBuffer(D3DResourceType.IDirect3DSurface9, surface.ComPointer);

var rect = System.Windows.Int32Rect(0, 0, width, height);

d3dimage.AddDirtyRect(rect);

d3dimage.Unlock();

Это необходимо сделать каждый кадр.

Дополнительная информация о AddDirtyRect

1 голос
/ 01 февраля 2012

Я не могу комментировать, как заставить DirectX11 работать с этим примером, но 5% CPU, который вы наблюдаете, вероятно, является циклом рендеринга при вращении DirectX, но без работы.

Цикл рендеринга обычно используется в играх для рендеринга «так быстро, как вы можете» при обновлении сцены / физики / ИИ в другом потоке.В настольных приложениях визуализации это обычно не требуется.

Для научных приложений визуализации, где обновления GUI происходят только тогда, когда пользователь взаимодействует (например, перетаскивает элемент, перемещает область просмотра). Я переработал цикл рендеринга, чтобы он отображался только при наличии обновления.То есть: после вашей работы по панорамированию области просмотра при перемещении мыши вы заставляете DirectX перерисовывать, устанавливая флаг или подобное.Таким образом, «рисование, когда вам это нужно» уменьшит ваш процессор почти до нуля, пока приложение не работает, и больше подходит для настольных приложений.

...