2009-07-14 2 views
1

Как перенести IDirect3DDevie8 :: CopyRects на DirectX9 в DX8? Я нашел функцию (stretchRect), но это не похоже на работу ...IDirect3DDevice8 :: CopyRects в DirectX 9? C++

//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. 
+0

Почему вы не могли бы просто использовать IDirect3DDevice8 :: CopyRects? Если код написан для DX8, просто используйте DX8. IDirect3D8 :: CreateDevice() :) – Pod

ответ

2

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

MSDN IDirect3DDevice9::UpdateSurface

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

+0

Из SDK: «Растяжка не поддерживается, если целевая поверхность является поверхностью экрана вне экрана, но источник не является" – gatorfax

0

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

+0

Я использую книгу, Программирование игр все в одном, и она достаточно взрослая, чтобы использовать DirectX 8. Автор демонстрирует поверхности, поэтому я просто использую код, который он дал. –

+0

Ahh, справа, StretchRect возвращается FAILED. –

+0

хорошо получить время отладки DirectX, и он, скорее всего, скажет вам, ТОЧНО, почему его провал. Для этого перейдите в Пуск-> Программы-> Панель управления DirectX SDK-> DX Utilities-> DX и выберите время отладки под D3D. – Goz

1

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

отладки во время выполнения вы вывесили выше говорит вам, что это неправильно: форматы поверхности, так или иначе несовместимы.

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