首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >纹理渲染失败- DirectX 9

纹理渲染失败- DirectX 9
EN

Stack Overflow用户
提问于 2012-06-28 16:19:18
回答 2查看 2.7K关注 0票数 0

我在DirectX 9中有这段代码,其中我需要从COM接口获取DC并绘制它。我得到了DC,它包含了图像,但我得到了一个黑屏。你知道为什么吗?

代码语言:javascript
复制
    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();

提前感谢

EN

回答 2

Stack Overflow用户

发布于 2012-07-02 06:35:39

确保使用D3DUSAGE_RENDERTARGET创建了m_pRenderTexturepRenderSurfacepRenderSurfaceTMP的大小和格式应匹配。有关更多信息,请参见when GetRenderTargetData fails:http://msdn.microsoft.com/en-us/library/windows/desktop/bb174405(v=vs.85).aspx

票数 1
EN

Stack Overflow用户

发布于 2012-07-03 22:11:51

试试这个:

代码语言:javascript
复制
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);

或者这样:

代码语言:javascript
复制
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);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11240648

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档