Как скопировать данные frontBuffer в текстуру DirectX 9

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

Я уверен, что этот код работает (Direct X 9, C ++)

// capture screen
IDirect3DSurface9* pSurface;
g_pd3dDevice->CreateOffscreenPlainSurface(640, 480,
    D3DFMT_A8R8G8B8, D3DPOOL_SCRATCH, &pSurface, NULL);
g_pd3dDevice->GetFrontBufferData(0, pSurface);

Теперь, когда я получил свой frontBufferData, я хотел бы создать с ним объект IDirect3DTexture9.

Эта функция / D3DXCreateTextureFromFileInMemory / казалось наиболее логичным, но, похоже, не сработало.

Я уверен, что есть способ сделать это, хотя я не уверен, как это сделать. Любая помощь будет приветствоваться!

Спасибо!

Ответы на вопрос(1)

Решение Вопроса

GetRenderTargetData() вместоGetFrontBufferData()потому что первый быстрее. С учетом сказанного это не совсем вопрос. Вы хотите сохранить данные, полученные из фронт-буфера, или материал, который вы сейчас просматриваете на экране, в текстуру.

Прежде всего,IDirect3DTexture9 а такжеIDirect3DSurface9 на самом деле, в некотором роде, братья и сестры, но ониnot то же самое, хотя в какой-то момент в своем классе hiearchy они сходятся кIDirect3DResource9 (что логично, так как они являются ресурсами). Что в них обоих приятно, так это то, что они реализуют общую функциональность, в частности, возможностьLockRect() и ручное копирование данных с поверхности (грубо говоря, только одной поверхности уровня mipmap (связки пикселей) в текстуру (которая может состоять из нескольких уровней mipmap). Поэтому ваша цель - поверхность level0 объекта текстуры ,

Имея это в виду, так как всеCreateOffscreenPlainSurface() считаются изолированными, мы не можем найти родительскую текстуру, от которой эта поверхность может быть потомком (являющейся конкретным мип-картой текстуры). Короче говоря, если мы не используем LockRect для обоих из них и вручную копируем данные, мы можем использоватьStretchRect().

Хотя его название может не обозначать одну из его целей, оно поможет нам здесь. Помните о нашем сравнительном разговоре между текстурами и поверхностями, поверхности как бы их младший брат. Что ж, если вы правильно определите текстуру (такую же, как поверхность), вы на самом деле получаете автоматические уровни, которые вы можете вручную определить, сколько их там. Но по сути каждый из этих уровней является поверхностью. И & quot; преобразование & quot; от IDirect3DSurface9 до IDirect3DTexture9 - это просто вопрос заполнения надлежащей поверхности двухуровневого уровня (которая в этом случае должна быть level0, так как в основном это скриншот).

Следовательно, если вы попадаете в грубый код, это дает нам:

IDirect3DTexture9* texture; // needs to be created, of course
IDirect3DSurface9* dest = NULL; // to be our level0 surface of the texture
texture->GetSurfaceLevel(0, &dest);
g_pD3DDevice->StretchRect(pSurface, NULL, dest, NULL, D3DTEXF_LINEAR);

И вот, вы идете, один IDirect3DTexture9, чтобы пойти. Не хотите ли картошки фри с этим? Заметьте, я здесь работаю с памятью, я довольно долго не касался DX9 (отказался от DX10). Надеюсь, поможет.

 01 июн. 2012 г., 23:29
Добро пожаловать. Пожалуйста, примите это как ответ, если это решило вашу проблему.
 zeroxgames30 мая 2012 г., 19:54
Очень полезно, большое спасибо! (сейчас работает отлично)

Ваш ответ на вопрос