D3DXCreateRenderToSurface

D3DXCreateRenderToSurface( )를 이용해 LPD3DXRENDERTOSURFACE 값을 사용하면 다이렉트X 디바이스 처럼 편하게 사용할 수 있다.

왼쪽 상단의 주전자는 LPD3DXRENDERTOSURFACE의 렌더러 텍스쳐를 스프라이트로 그리고 있다.

LPD3DXRENDERTOSURFACE를 사용할려면  아래 세 개의 변수가 필요하다.

< 필요한 변수 >

    LPDIRECT3DTEXTURE9       pTexture;

    LPD3DXRENDERTOSURFACE    pRendererSurface;

    LPDIRECT3DSURFACE9       pTextureSurface;

pTexture는 IDIRECT3DDEVICE9::CreateTexture( ..D3DUSAGE_RENDERTARGET.. ) 렌더 타겟으로 만들어진 렌더러 텍스쳐이다.

pRendererSurface는 D3DXCreateRenderToSurface( ... &pRendererSurface ) 디바이스 대신 사용할 수 있는 렌더 타겟 텍스쳐의 디바이스처럼 생각하면 된다.

pTextureSurface는 렌더러 타겟의 표면이다.

< 렌더러 텍스쳐 생성 >

pTexture, pRendererSurface 생성시 width, height, format( D3DFORMAT )은 일치  해야 한다.

void  CreateTexture( LPDIRECT3DDEVICE9 pDevice, D3DFORMAT format, int  width, int  height )

{

    pDevice->CreateTexture( width, height, 1, D3DUSAGE_RENDERTARGET,

        format, D3DPOOL_DEFAULT, &pTexture, NULL);

 

    D3DXCreateRenderToSurface( pDevice, width, height,

        format, TRUE, D3DFMT_UNKNOWN, &pRendererSurface );

 

    pTexture->GetSurfaceLevel( 0, &pTextureSurface );

 

    pDevice->SetRenderTarget( 0, pTextureSurface );

    pRendererSurface->BeginScene( pTextureSurface, NULL );

    pDevice->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0xff0000ff, 1.0f, 0);

    pRendererSurface->EndScene( 0 );

}

< 렌더러 텍스쳐에 주전자 그리기 >

LPD3DXRENDERTOSURFACE::BeginScene( ) 이전에 LPDIRECT3DDEVICE9::Clear( )를 하면 주전자가 잘려서 나온다. BeginScene( ) 이후에 Clerar( )를 실행 해야 한다.

    //렌더러 텍스쳐 그리기

    g_d3d_Device->SetRenderTarget( 0, g_rendererTexture.pTextureSurface );

    g_rendererTexture.pRendererSurface->BeginScene( g_rendererTexture.pTextureSurface, NULL );

    g_d3d_Device->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0xff0000ff, 1.0f, 0);

 

    g_d3d_Device->SetVertexShader( NULL );

    g_pMesh->DrawSubset( 0 );

 

    g_rendererTexture.pRendererSurface->EndScene( D3DX_FILTER_NONE );

< 스프라이트로 렌더러 텍스쳐 출력 >

렌더러 텍스쳐의 표면인 pTextureSurface 타겟을 디바이스의 백버퍼로 렌더러 타겟을 바꾼다.
주전자를 3D 공간에 그리고 이전에 렌더러 텍스쳐에 의해 그려진 이미지를 스프라이트에 올린다..

    //렌드링

    HRESULT hr;

    g_d3d_Device->SetRenderTarget( 0, g_pBackBuffer );

 

    g_d3d_Device->Clear (0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB (255, 255, 255), 1.0f, 0);

    g_d3d_Device->BeginScene ();

 

    g_d3d_Device->SetVertexShader( NULL );

    g_pMesh->DrawSubset( 0 );

 

    D3DXVECTOR3 pos( 0, 0, 0 );

    g_pSprite->Begin( 0 );

    g_pSprite->Draw( g_rendererTexture.pTexture, NULL, &pos, NULL, 0xffffffff );

    g_pSprite->End();

 

    g_d3d_Device->EndScene ();

    hr = g_d3d_Device->Present (NULL, NULL, NULL, NULL);

프로젝트 :  
주전자가 회전하는 데모 teapot.zip
렌더러 텍스쳐로 주전자를 스프라이트에 렌더링하는 데모 RenderToSurface.zip