Game Dev/Article

Render to Texture

AKer 2008. 12. 17. 21:06
반응형
bool CopyTexture(LPDIRECT3DDEVICE9 pDevice, 
		LPDIRECT3DTEXTURE9 pDestTex, 
		RECT* pDestRect, 
		LPDIRECT3DTEXTURE9 pSrcTex, 
		RECT* pSrcRect)   
{   
    if (!pDevice || !pDestTex || !pSrcTex)   
        return false;   
  
    // Get Surface   
    LPDIRECT3DSURFACE9 pSrcSurf, pDestSurf;   
  
    if (FAILED(pSrcTex->GetSurfaceLevel(0, &pSrcSurf))) return false;   
    if (FAILED(pDestTex->GetSurfaceLevel(0, &pDestSurf))) return false;   
    pSrcTex->Release();   
    pDestTex->Release();   
  
    D3DSURFACE_DESC desc;   
    pDestTex->GetLevelDesc(0, &desc);   
  
    LPD3DXRENDERTOSURFACE pRenderToSurface = NULL;   
    HRESULT hrSurf 
	= D3DXCreateRenderToSurface(pDevice, desc.Width, desc.Height, desc.Format, 
				FALSE, D3DFMT_UNKNOWN, &pRenderToSurface);   
  
    // Calc Size   
    int nSrcWidth = pSrcRect->right - pSrcRect->left;   
    int nSrcHeight = pSrcRect->bottom - pSrcRect->top;   
    int nDestWidth = pDestRect->right - pDestRect->left;   
    int nDestHeight = pDestRect->bottom - pDestRect->top;   
  
    // Draw   
    D3DVIEWPORT9 vp = {0, 0, desc.Width, desc.Height, 0, 1.0f};   
    HRESULT hrBegin = pRenderToSurface->BeginScene(pDestSurf, &vp);   
  
    if (SUCCEEDED(hrBegin))   
    {   
        pDevice->Clear(0L, NULL, D3DCLEAR_TARGET, 0xFF000000, 1.0f, 0L);   
  
        pDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);   
        pDevice->SetRenderState(D3DRS_SRCBLEND,  D3DBLEND_SRCALPHA);   
        pDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);   
        pDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1);   
        pDevice->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);   
        pDevice->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1);   
        pDevice->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);   
  
        TVERTEX_RHWPT1 vertex[4];   
        vertex[0].fU1 = 0; vertex[0].fV1 = 0;   
        vertex[1].fU1 = 0; vertex[1].fV1 = 1;   
        vertex[2].fU1 = 1; vertex[2].fV1 = 0;   
        vertex[3].fU1 = 1; vertex[3].fV1 = 1;   
  
        // Copy Dest   
        vertex[0].vPos = D3DXVECTOR4(-0.5f, -0.5f, 0.5f, 1.0f);   
        vertex[1].vPos = D3DXVECTOR4(-0.5f, desc.Height - 0.5f, 0.5f, 1.0f);   
        vertex[2].vPos = D3DXVECTOR4(desc.Width - 0.5f, -0.5f, 0.5f, 1.0f);   
        vertex[3].vPos = D3DXVECTOR4(desc.Width - 0.5f, desc.Height - 0.5f, 0.5f, 1.0f);   
  
        pDevice->SetTexture(0, pDestTex);   
        pDevice->SetFVF(TVERTEX_RHWPT1::FVF);
        pDevice->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2, vertex, sizeof(TVERTEX_RHWPT1));   
  
        // Copy Source   
        vertex[0].vPos = D3DXVECTOR4(pDestRect->left - 0.5f, pDestRect->top - 0.5f, 0.5f, 1.0f);   
        vertex[1].vPos = D3DXVECTOR4(pDestRect->left - 0.5f, pDestRect->top + nDestHeight - 0.5f, 0.5f, 1.0f);   
        vertex[2].vPos = D3DXVECTOR4(pDestRect->left + nDestWidth - 0.5f, pDestRect->top - 0.5f, 0.5f, 1.0f);   
        vertex[3].vPos = D3DXVECTOR4(pDestRect->left + nDestWidth - 0.5f, pDestRect->top + nDestHeight - 0.5f, 0.5f, 1.0f);   
  
        pDevice->SetTexture(0, pSrcTex);   
        pDevice->SetFVF(TVERTEX_RHWPT1::FVF);
        pDevice->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2, vertex, sizeof(TVERTEX_RHWPT1));   
  
        HRESULT hrEnd = pRenderToSurface->EndScene(D3DX_FILTER_LINEAR);   
    }   
  
    pRenderToSurface->Release();   
  
    return true;   
}  




반응형

'Game Dev > Article' 카테고리의 다른 글

Internet File Download  (0) 2009.02.20
배열과 Loop를 다루는 3가지 방법  (0) 2009.01.12
소프트웨어 일정 예측  (1) 2008.10.22
Open Partner File  (0) 2008.09.24