Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 纹理无法渲染-DirectX 9_C++_Directx - Fatal编程技术网

C++ 纹理无法渲染-DirectX 9

C++ 纹理无法渲染-DirectX 9,c++,directx,C++,Directx,我在DirectX 9中有这段代码,其中我需要从COM接口获取DC并绘制它。我确实得到了DC,它包含了图像,但我得到了一个黑屏。你知道为什么吗 LPDIRECT3DSURFACE9 pRenderSurface = NULL, pRenderSurfaceTMP = NULL; m_pRenderTexture->GetSurfaceLevel(0, &pRenderSurface); if (pRenderSurface == NULL)

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

提前感谢

确保使用
D3DUSAGE\u RENDERTARGET
创建
m\u pRenderTexture
pRenderSurface
pRenderSurfaceTMP
的大小和格式应匹配。有关详细信息,请参见当
GetRenderTargetData
失败时:

尝试以下操作:

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

你们使用固定管道吗?如果是这样,您应该使用
SetTextureStageState
设置纹理状态。
m_pVertexBuffer
是否具有适当的FVF格式和正确的纹理坐标?您还应该调试应用程序,并检查它是否在
if(FAILED(hr))返回false时失败-
GetDC
如果您不满足要求(请参阅备注部分-)可能会失败。问题是,我在一个单独的应用程序中使用了此代码,并且我尝试将其调整到另一个应用程序中。因此,我认为FVF格式和纹理坐标是正确的(我可以看到在我想要的地方绘制的纹理,但它是黑色的)。我还知道GetDC不会失败,因为我将它打印成位图并看到了正确的图像。我认为我的应用程序使用的是固定管道(我对DX非常陌生),我尝试使用SetTextRestartGate。这似乎没有改变什么。还有其他想法吗?我还看到GetRenderTargetData失败,但我能够从pRenderSurfaceTMP获取DC。我很困惑。您可以从pRenderSurfaceTMP获取DC,但它指向一个空曲面,因为GetRenderTargetData失败。谢谢-现在我没有收到任何错误。但是,我仍然得到一个黑色矩形,而不是真实的图像(提醒,dc肯定包含正确的图像)。我还缺少什么?因为您调用
m_pD3DDevice->SetTexture(0,m_pRenderTexture)我假设您想要绘制一个对象(全屏四元?),使用
m_pRenderTexture
进行纹理处理。但是,将
m_pViewObject
绘制到
pRenderSurfaceTMP
上,它是
m_pRenderTexture
曲面的副本。因此,
m_pRenderTexture
的表面本身没有绘制任何图形。好吧,我有点怀疑这就是问题所在。但我如何更新m_pRenderTexture?我尝试了UpdateSurface,它没有改变任何东西。我该如何解决这个问题?为什么不直接从
pRenderSurface
GetDC
而不是创建一个临时曲面呢?顺便问一下,您是否在这里渲染了一个全屏四边形:
m_pD3DDevice->DrawPrimitive(D3DPT_triangalstrip,0,2)?如果是这样的话,从后台缓冲区获取DC并直接在屏幕上渲染
m_pViewObject
不是更容易吗?我已经试过了。问题是使用D3DPOOL_托管的CreateTexture失败(D3DERR_INVALIDCALL)。我不知道为什么,但在整个应用程序中,他们没有使用D3DPOOL_MANAGED,只有D3DPOOL_SYSTEMMEM。我尝试了选项2。没有失败,但我只得到一个灰色矩形。。。还有其他想法吗?你之前说过你有一个黑色的长方形。现在是灰色的。我想它现在起作用了,因为它在画东西。确保
m\u pViewObject->Draw
正确绘制(它应该绘制什么?)。嗯,不完全正确。在我开始所有其他尝试之前的代码中,我有一个导致黑色collor的FillRect。我知道DC上的图纸是可行的。我用我画的dc做了一个BitBlt到屏幕dc,我可以看到正在画的图像。而且-你的代码非常好。如果我在另一个临时项目中使用它,它可以正常工作。但在我的应用程序(这是一个功能齐全的directx应用程序)中,这根本不起作用。有些事情是不同的,我不知道为什么。这些症状的原因是什么?