簡體   English   中英

紋理無法渲染 - DirectX 9

[英]Texture fail to render - DirectX 9

我在DirectX 9中有這個代碼,我需要從COM接口獲取DC並繪制它。 我確實得到DC,它包含圖像,但我得到一個黑屏。 有什么想法嗎?

    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();

提前致謝

確保使用m_pRenderTexture創建D3DUSAGE_RENDERTARGET pRenderSurfacepRenderSurfaceTMP的大小和格式應該匹配。 有關詳細信息,請參閱GetRenderTargetData失敗的時間: http//msdn.microsoft.com/en-us/library/windows/desktop/bb174405( GetRenderTargetData 。aspx

嘗試這個:

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);

或這個:

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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM