IDirect3DDevice8 :: CopyRects в DirectX 9? C ++ - PullRequest
1 голос
/ 14 июля 2009

Как мне перенести IDirect3DDevie8 :: CopyRects DX8 на DirectX9? Я нашел функцию (stretchRect), но она не работает ...

//clear the window to blue
m_pD3DDevice->Clear (0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,255), 1.0f, 0);

//get back buffer
LPDIRECT3DSURFACE9 pBackBuffer;
m_pD3DDevice->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, &pBackBuffer);

//start rendering
m_pD3DDevice->BeginScene();
//copy the surface to the screen
m_pD3DDevice->CopyRects (m_pD3DSurface, NULL, 0, pBackBuffer, NULL); 
//end rendering
m_pD3DDevice->EndScene();

//present the rendered scene to the screen
m_pD3DDevice->Present(NULL, NULL, NULL, NULL);

вот код "замены", если он работал ...

StretchRect(m_pD3DSurface, NULL, pBackBuffer, NULL, D3DTEXF_NONE);

запустил отладчик D3D, вот вывод:

Direct3D9: (INFO) :======================= Hal SWVP device selected

Direct3D9: (INFO) :HalDevice Driver Style 9

Direct3D9: :BackBufferCount not specified, considered default 1 
Direct3D9: :DoneExclusiveMode
Direct3D9: (INFO) :Failed to create driver indexbuffer
Direct3D9: (INFO) :Using P4 PSGP

Direct3D9: (ERROR) :This format is not supported for offscreen plain surfaces. CreateOffscreenPlainSurface fails.
Game Library.exe has triggered a breakpoint
Direct3D9: (ERROR) :Invalid source surface interface specified. StretchRect fails CreateOffscreenPlainSurface fails.

Ответы [ 3 ]

2 голосов
/ 15 июля 2009

Не думаю, что вы хотите использовать StretchRect. Вы пытались использовать IDirect3DDevice9 :: UpdateSurface вместо этого.

MSDN IDirect3DDevice9 :: UpdateSurface

Этот метод похож на CopyRects в DirectX 8.

1 голос
/ 19 июля 2009

Какой формат вашего заднего буфера? Каков формат вашей поверхности?

Среда выполнения отладки, которую вы опубликовали выше, говорит вам, что не так: форматы поверхностей как-то несовместимы.

StretchRect - для копирования между поверхностями на устройстве. UpdateSurface - для копирования из CPU в GPU. Итак, вы используете правильную функцию, но у вас как-то есть несовместимые аргументы. Попробуйте взглянуть на Глава 4. 2D-приложения из моей книги Графический конвейер Direct3D . В разделе 4.9 обсуждается, как использовать StretchRect.

0 голосов
/ 14 июля 2009

Во-первых, вы проверяете, что говорит вам среда выполнения отладки, когда вы пытаетесь выполнить растяжку?
Во-вторых, какой HRESULT он возвращает?
Наконец, вам было бы гораздо лучше сделать что-то подобное, используя текстуру. Это будет во много раз быстрее, и делать это не особенно сложно ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...