yakobom
yakobom

Reputation: 2711

Texture fail to render - DirectX 9

I have this code in DirectX 9, in which I need to get the DC from a COM interface and draw it. I do get the DC and it contains the image, but I get a black screen. Any ideas why?

    LPDIRECT3DSURFACE9 pRenderSurface = NULL, pRenderSurfaceTMP = NULL;

    m_pRenderTexture->GetSurfaceLevel(0, &pRenderSurface);
    if (pRenderSurface == NULL)
        return FALSE;

    m_pD3DDevice->CreateOffscreenPlainSurface(m_nWidth, m_nHeight,
        D3DFMT_X8R8G8B8, D3DPOOL_SYSTEMMEM, &pRenderSurfaceTMP, 0);

    m_pD3DDevice->GetRenderTargetData(pRenderSurface,pRenderSurfaceTMP);

    HDC hDC = NULL;
    hr = pRenderSurfaceTMP->GetDC(&hDC);
    if (FAILED(hr))
        return FALSE;   

    if (m_pViewObject != NULL)
    {
        // RECT is relative to the windowless container rect
        RECTL rcRect = {0, 0, m_nWidth, m_nHeight};  

        // Draw onto the DC!
        hr = m_pViewObject->Draw(DVASPECT_CONTENT, 1,
            NULL, NULL, NULL, hDC, &rcRect, NULL, NULL,
            0);
    }


    pRenderSurface->ReleaseDC(hDC);
    pRenderSurface->Release();


    // Draw the surface
    m_pD3DDevice->SetStreamSource( 0, m_pVertexBuffer, 0, sizeof(Vertex) );
    m_pD3DDevice->SetTexture( 0, m_pRenderTexture );


    hr = m_pD3DDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2);

    m_hbrBackground = NULL;
    pRenderSurfaceTMP->Release();

Thanks in advance

Upvotes: 0

Views: 3003

Answers (2)

miloszmaki
miloszmaki

Reputation: 1645

Try this:

m_pD3DDevice->CreateTexture(m_nWidth, m_nHeight, 1, 0, D3DFMT_X8R8G8B8,
                            D3DPOOL_MANAGED, &m_pRenderTexture, NULL);

// ...

LPDIRECT3DSURFACE9 pRenderSurface = NULL;
if (FAILED(m_pRenderTexture->GetSurfaceLevel(0, &pRenderSurface))) return FALSE;

HDC hDC = NULL;
if (FAILED(pRenderSurface->GetDC(&hDC))) return FALSE;   

if (m_pViewObject != NULL)
{
    RECTL rcRect = {0, 0, m_nWidth, m_nHeight};

    m_pViewObject->Draw(DVASPECT_CONTENT, 1,
        NULL, NULL, NULL, hDC, &rcRect, NULL, NULL, 0);
}

pRenderSurface->ReleaseDC(hDC);
pRenderSurface->Release();

m_pD3DDevice->SetStreamSource( 0, m_pVertexBuffer, 0, sizeof(Vertex) );
m_pD3DDevice->SetTexture( 0, m_pRenderTexture );

m_pD3DDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2);

or this:

m_pD3DDevice->CreateTexture(m_nWidth, m_nHeight, 1, 0, D3DFMT_X8R8G8B8,
                            D3DPOOL_DEFAULT, &m_pRenderTexture, NULL);

// ...

LPDIRECT3DSURFACE9 pRenderSurfaceTMP = NULL;
m_pD3DDevice->CreateOffscreenPlainSurface(m_nWidth, m_nHeight,
    D3DFMT_X8R8G8B8, D3DPOOL_SYSTEMMEM, &pRenderSurfaceTMP, 0);

HDC hDC = NULL;
if (FAILED(pRenderSurfaceTMP->GetDC(&hDC))) return FALSE;   

if (m_pViewObject != NULL)
{
    RECTL rcRect = {0, 0, m_nWidth, m_nHeight};

    m_pViewObject->Draw(DVASPECT_CONTENT, 1,
        NULL, NULL, NULL, hDC, &rcRect, NULL, NULL, 0);
}

pRenderSurfaceTMP->ReleaseDC(hDC);

LPDIRECT3DSURFACE9 pRenderSurface = NULL;
if (FAILED(m_pRenderTexture->GetSurfaceLevel(0, &pRenderSurface)))
    return FALSE;

if (FAILED(m_pD3DDevice->UpdateSurface(pRenderSurfaceTMP, NULL,
                                       pRenderSurface, NULL))) return FALSE;

pRenderSurface->Release();

m_pD3DDevice->SetStreamSource( 0, m_pVertexBuffer, 0, sizeof(Vertex) );
m_pD3DDevice->SetTexture( 0, m_pRenderTexture );

m_pD3DDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2);

Upvotes: 1

miloszmaki
miloszmaki

Reputation: 1645

Make sure that m_pRenderTexture is created with D3DUSAGE_RENDERTARGET. The size and format of both pRenderSurface and pRenderSurfaceTMP should match. For more info, see when GetRenderTargetData fails: http://msdn.microsoft.com/en-us/library/windows/desktop/bb174405(v=vs.85).aspx

Upvotes: 1

Related Questions