Копирование данных IDirect3DSurface на другой IDirect3DSurface, созданный с помощью двух устройств DirectX

Есть окно с собственным устройством Direct3D, назовем его mainWindow. mainWindow и его вещи созданы другими людьми. Они дали мне несколько поверхностей Direct3D (указатели IDirect3DSurface9), которые они рисуют в mainWindow.
Я запустил поток из одного из их обратных вызовов и создал свое собственное окно с помощью winAPI. (у меня был немного похожий случай в этом вопросе)
Я хочу нарисовать эти выходные данные RTT в своем окне . поэтому я пытаюсь скопировать поверхности в поверхности/текстуры, которые я создал на своем собственном устройстве DirectX, которое рисует в моем окне.

некоторые вещи, которые я нашел, пытаясь сделать это,

  • это можно легко сделать с помощью функций D3DXSaveSurfaceToFileInMemory(...) и D3DXCreateTextureFromFileInMemory(...).
  • Функция StrechRect(...) не работает для двух поверхностей, созданных двумя устройствами.

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

Есть ли способ, которым вы, люди, знаете или предлагаете это сделать?

---EDIT---
MSDN говорит (ссылка на страницу)

В Windows Vista CreateTexture может создавать текстуру из указателя системной памяти, предоставляя приложению большую гибкость в использовании, выделении и удалении системной памяти. Например, приложение может передать указатель растрового изображения системной памяти GDI и получить вокруг него интерфейс текстуры Direct3D. Использование указателя системной памяти с CreateTexture имеет следующие ограничения.

  • Шаг текстуры должен быть равен ширине, умноженной на количество байтов на пиксель.
  • Поддерживаются только текстуры с одним уровнем MIP-карты. Аргумент уровней должен быть равен 1.
  • Аргумент пула должен быть D3DPOOL_SYSTEMMEM.
  • Аргумент pSharedHandle должен быть действительным указателем на буфер, который может содержать точку системной памяти; *pSharedHandle должен быть действительным указателем на системную память с размером в байтах ширины текстуры * высоты текстуры * байтов на пиксель формата текстуры.

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


person Deamonpog    schedule 05.06.2012    source источник
comment
Ваши две поверхности создают два процесса или один процесс?   -  person RolandXu    schedule 06.06.2012
comment
один процесс, я запустил собственный поток из обратного вызова, чтобы мой поток запускался и показывал окно, когда пользователь отправляет определенную команду, чтобы открыть его.   -  person Deamonpog    schedule 06.06.2012
comment
Я попытался заблокировать как поверхность текстуры (уровень 0), так и другую поверхность и скопировать данные. хорошо, это сработало. но я хочу знать, насколько хороша вещь CreateTexture. согласно странице MSDN, я должен передать void *, который указывает на данные пикселя в качестве последнего параметра функции CreateTexture, обряд? например: void * _pt; CreateTexture(Width,Height,1,D3DUSAGE_DYNAMIC,Format,D3DPOOL_SYSTEMMEM,&mytexture,(HANDLE*)_pt);   -  person Deamonpog    schedule 06.06.2012


Ответы (1)


если вы используете Vista/Win7/Win8, вы можете использовать Sharing_Resources Тогда вам не нужно копировать его.

person RolandXu    schedule 05.06.2012