C++ 纹理无法渲染-DirectX 9
我在DirectX 9中有这段代码,其中我需要从COM接口获取DC并绘制它。我确实得到了DC,它包含了图像,但我得到了一个黑屏。你知道为什么吗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)
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应用程序)中,这根本不起作用。有些事情是不同的,我不知道为什么。这些症状的原因是什么?