我遇到了一个问题,有人声称我的Nvidia图形卡上的阴影贴图创建代码失败。我已经在互联网上搜寻了许多小时,但找不到一个确定的解决方案。
发生这种情况的特定卡是“ NVidia GTX 1050 ti 4GB”
这是我制作初始阴影贴图的代码(失败在第一个函数上):
if( FAILED( hr = g_pd3dDevice->CreateTexture( VGlobal::SHADOW_MAP_SIZE, VGlobal::SHADOW_MAP_SIZE, 1, D3DUSAGE_RENDERTARGET,
D3DFMT_R32F, D3DPOOL_DEFAULT, &g_pShadowMap[lpShadow], NULL ) ) )
....
// Create the screen-sized buffer map
if( FAILED( g_pd3dDevice->CreateTexture( d3dpp.BackBufferWidth / 2, d3dpp.BackBufferHeight / 2, 1, D3DUSAGE_RENDERTARGET,
D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &g_pScreenMap, NULL ) ) )
....
// Create the shadow depth surface
if( FAILED( g_pd3dDevice->CreateDepthStencilSurface( VGlobal::SHADOW_MAP_SIZE, VGlobal::SHADOW_MAP_SIZE, D3DFMT_D24S8,
D3DMULTISAMPLE_NONE, 0, TRUE, &g_pShadowDepth, NULL ) ) )
{
MessageBox( hWnd, "Unable to create shadow depth surface!", ERROR, MB_OK | MB_ICONERROR );
return E_FAIL;
}
// Create the general depth surface
if( FAILED( g_pd3dDevice->CreateDepthStencilSurface( d3dpp.BackBufferWidth / 2, d3dpp.BackBufferHeight / 2, D3DFMT_D24S8,
D3DMULTISAMPLE_NONE, 0, TRUE, &g_pNewDepthRT, NULL ) ) )
{
MessageBox( hWnd, "Unable to create general depth surface!", ERROR, MB_OK | MB_ICONERROR );
return E_FAIL;
}
我在这里找到了该线程,用以说明Nvidia可以使用D3DUSAGE_DEPTHSTENCIL,但带有D3DFMT_R32F的D3DUSAGE_RENDERTARGET应该被所有卡接受。 https://www.gamedev.net/forums/topic/649614-shadow-mapping-d3dusage-depthstencil-or-d3dusage-rendertarget/
多年来,我没有更改我的阴影渲染代码。我一直在浏览Nvidia编程文档,但找不到确切的答案。
我唯一想到的选择是,如果D3DUSAGE_RENDERTARGET失败,我还需要测试D3DUSAGE_DEPTHSTENCIL创建是否正常工作?
我认为Nvidia最近可能有所更改,并且不确定这些更改是什么。不幸的是,我没有Nvidia显卡可以对此进行测试。
感谢您的帮助!