我刚开始学习直接3d,用DirectX11编写3D游戏编程一书。
我学习了第一个教程,得到了一个MessageBox,上面写着"D3D11CreateDevice失败“。
我检查了这个函数的返回值,并得到了-2005270483
的垃圾值。0x887a002d
的十六进制值,人们说它是DXGI_ERROR_SDK_COMPONENT_MISSING
错误。
但是,我找不到任何关于它的信息。而且,MSDN没有通知D3D11CreateDevice()
的任何可能值。
以下是“创建D3D设备”一书的代码:
bool D3DApp::InitDirect3D()
{
// Create the device and device context.
UINT createDeviceFlags = 0;
#if defined(DEBUG) || defined(_DEBUG)
createDeviceFlags |= D3D11_CREATE_DEVICE_DEBUG;
#endif
D3D_FEATURE_LEVEL featureLevel;
HRESULT hr = D3D11CreateDevice(
0, // default adapter
md3dDriverType,
0, // no software device
createDeviceFlags, // createDeviceFlags,
0, 0, // default feature level array
D3D11_SDK_VERSION,
&md3dDevice,
&featureLevel,
&md3dImmediateContext);
if( FAILED(hr) )
{
// I added this part to check out the return value
TCHAR str[100];
int code = -1;
switch(hr) {
case D3D11_ERROR_FILE_NOT_FOUND: code=0;
break;
case D3D11_ERROR_TOO_MANY_UNIQUE_STATE_OBJECTS: code=1;
break;
case D3D11_ERROR_TOO_MANY_UNIQUE_VIEW_OBJECTS: code=2;
break;
case D3D11_ERROR_DEFERRED_CONTEXT_MAP_WITHOUT_INITIAL_DISCARD: code=3;
break;
case DXGI_ERROR_INVALID_CALL: code=4;
break;
case DXGI_ERROR_WAS_STILL_DRAWING: code=5;
break;
case E_FAIL: code=6;
break;
case E_INVALIDARG: code=7;
break;
case E_OUTOFMEMORY: code=8;
break;
case E_NOTIMPL: code=9;
break;
case S_FALSE: code=10;
break;
case S_OK: code=11;
break;
} // switch
_stprintf(str, L"D3D11CreateDevice Failed. Code:%ld %d", hr, code);
MessageBox(0, str, 0, 0);
return false;
} // if
...
我目前正在Windows8.1与DirectX版本11工作。我的显卡是NVIDIA GeForce GTX 650。我使用的编译器是VS2010 Express。
有没有人知道问题和解决方案是什么?
发布于 2014-08-21 18:06:14
问题在于,您的操作系统没有安装正确的DirectX调试运行时。 legacy DirectX SDK (2010年6月)为Windows SP2和Windows7aka DirectX 11.0安装了正确的DirectX调试运行时,但对于Windows8.0、Windows8.1或带有KB 2670838又名DirectX 11.1或DirectX 11.2的Windows 7 SP1则不正确。
对于Windows8.1,安装正确的DirectX调试运行时的唯一方法是安装Windows8.1SDK。如果安装了Visual 2013,或者可以直接在系统上安装SDK,则会自动完成此操作。还可以通过安装Visual 2013远程调试工具包获得Windows8.1SDK调试运行时。有关调试运行时与SDK匹配的完整表,请参见Direct3D SDK Debug Layer Tricks。
请注意,安装Windows8.1SDK独立并继续使用遗留的DirectX SDK (2010年6月)和VS 2010使D3D11_CREATE_DEVICE_DEBUG
在Windows8.1上重新工作就足够了,但我建议(a)升级到VS 2012或VS 2013 -或- (b)使用'props' solution将Windows8.1SDK与VS 2010集成到最新版本的标头。DirectX Tool Kit这样做是为了支持VS 2010。
如果您需要继续只在VS 2010项目中使用遗留的DirectX SDK组件(如D3DX11 ),那么您可以将Windows8.1SDK与DirectX SDK组合起来,但是一定要列出Windows8.1SDK包含和库路径之后的DirectX SDK包含和库路径(参见MSDN)。
总结一下:理想的解决方案是只在Windows8.1上使用Visual 2013,而不使用遗留的DirectX SDK。Win32 desktop Direct3D tutorial或Windows Store app Direct3D tutorial在没有遗留DirectX SDK的情况下构建得很好。许多Windows示例现在都可以在使用Windows8.xSDK构建的DirectX上使用,并且不使用遗留的MSDN Code Gallery SDK。
解决当前问题的最小解决方案是安装Windows 8.1 SDK或Visual 2013远程调试工具(x86或x64),以获得为操作系统安装的SDKDebugLayers的正确版本,但请记住,弗兰克·露娜的书已经过时了。有关其他注释,请参见Book Recommendations。
https://stackoverflow.com/questions/25423371
复制相似问题