Directx9 поверхность к текстуре

Я хочу записать свой Backbuffer в мой LPDIRECT3DSURFACE9, а затем скопировать поверхность в мой IDirect3DTexture9, наконец, использовать эту текстуру в качестве моей обложки объекта. Я написал коды, но только что получил черные пиксели.

IDirect3DTexture9* texture;
LPDIRECT3DSURFACE9 pd3dsBack = NULL;

void init()//init point
{

D3DXCreateTexture(g_pd3dDevice, 640, 480, D3DUSAGE_DYNAMIC,
0, D3DFMT_X8R8G8B8, D3DPOOL_DEFAULT, &texture);

}

void render()//render point
{

g_pd3dDevice->BeginScene();

g_pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,
D3DCOLOR_COLORVALUE(0.0f, 1.0f, 0.0f, 1.0f), 1.0f, 0);

//my scene (1) 3d objects codes for draw.

g_pd3dDevice->EndScene();

//now try to get back-buffer into surface

g_pd3dDevice->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, &pd3dsBack);//i add this Save section to ensure the backbuffer data received complete and work.(it was ok and save complete true picture of Scene(1) ).

D3DXSaveSurfaceToFileA("BackbufferImage.BMP", D3DXIFF_BMP, pd3dsBack, NULL, NULL);//this line put surface into my texture ; if u think this way is false please give me a simple code to fill texture by surface.

texture->GetSurfaceLevel(0, &pd3dsBack);

pd3dsBack->Release();//release my surface//scene(2)
g_pd3dDevice->BeginScene();

g_pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,
D3DCOLOR_COLORVALUE(1.0f, 0.0f, 0.0f, 1.0f), 1.0f, 0);

//now render my scene(2) and useing the texture object for draw it as skin of my 3d     object
g_pd3dDevice->SetTexture(0, texture);

g_pd3dDevice->EndScene();g_pd3dDevice->Present(NULL, NULL, NULL, NULL);

}

2

Решение

Вы можете попробовать что-то вроде этого

LPDIRECT3DDEVICE9 l_Device= RenderManager()->GetDirectXDevice();
LPDIRECT3DSURFACE9 l_RenderTarget, l_Surface;

m_Texture->GetSurfaceLevel(0,&l_Surface);
l_Device->GetRenderTarget(IdStage,&l_RenderTarget);
l_Device->StretchRect(l_RenderTarget,NULL, l_Surface,NULL,D3DTEXF_NONE);
l_RenderTarget->Release();

куда IdStage текущая цель рендеринга, которую вы хотите скопировать, в вашем случае это будет 0

m_Texture текстура DirectX, которую вы хотите получить копию из буфера

4

Другие решения

Еще один способ:

Шаг 1: Получить обратный буфер как поверхность:

 LPDIRECT3DSURFACE9 pBackBuffer;
GetBackBuffer(0, D3DBACKBUFFER_TYPE_MONO, &pBackBuffer)

Шаг 2: Создать пустую текстуру

 LPDIRECT3DTEXTURE9 textureMap
D3DXCreateTexture(device, width, height, D3DX_DEFAULT,  D3DUSAGE_RENDERTARGET,
D3DFMT_X8R8G8B8, D3DPOOL_DEFAULT,&textureMap);

Примечание. Если вам нужен альфа-канал, используйте формат D3DFMT_A8R8G8B8.

Шаг 3: Получить указатель, который указывает на верхнюю поверхность пустой текстуры

LPDIRECT3DSURFACE9 pTexSurface;
textureMap->GetSurfaceLevel(0, &pTexSurface);

Шаг 4: Копирование с поверхности на поверхность (обратная поверхность буфера на пустую поверхность)

StretchRect(pBBsurface, NULL, pTexSurface, NULL, D3DTEXF_NONE);

Шаг 5: Результирующая текстура с содержимым заднего буфера

textureMap
4

По вопросам рекламы [email protected]