2

バックバッファを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);

}
4

2 に答える 2

4

あなたはこのようなことを試すことができます

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テクスチャです。

于 2013-01-11T17:25:45.440 に答える
4

もう1つの方法:

ステップ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
于 2015-09-04T13:23:56.977 に答える