DX11关于“D3D11CreateDeviceAndSwapChain”的出错问题!

bluegem218 2013-08-03 10:38:36


bool CDx11Base::Initialize( HINSTANCE hInstance, HWND hwnd )
{
hInstance_ = hInstance;
hwnd_ = hwnd;

RECT dimensions;
GetClientRect(hwnd, &dimensions);

unsigned int width = dimensions.right - dimensions.left;
unsigned int height = dimensions.bottom - dimensions.top;

D3D_DRIVER_TYPE driverTypes[] =
{
D3D_DRIVER_TYPE_HARDWARE, D3D_DRIVER_TYPE_WARP,
D3D_DRIVER_TYPE_REFERENCE, D3D_DRIVER_TYPE_SOFTWARE,
D3D_DRIVER_TYPE_UNKNOWN
};

unsigned int totalDriverTypes = ARRAYSIZE( driverTypes );

D3D_FEATURE_LEVEL featureLevels[] =
{
D3D_FEATURE_LEVEL_11_0,
D3D_FEATURE_LEVEL_10_1,
D3D_FEATURE_LEVEL_10_0,
D3D_FEATURE_LEVEL_9_3,
D3D_FEATURE_LEVEL_9_2,
D3D_FEATURE_LEVEL_9_1
};

unsigned int totalFeatureLevels = ARRAYSIZE( featureLevels );

DXGI_SWAP_CHAIN_DESC swapChainDesc; // 创建交换链结构体对象;
ZeroMemory( &swapChainDesc, sizeof(swapChainDesc)); // 初始化为0;
swapChainDesc.BufferCount = 1; // 设置swap chain中buffer的数量,不包括front buffer;
swapChainDesc.BufferDesc.Width = width; // 设置宽度;
swapChainDesc.BufferDesc.Height = height; // 设置高度;
swapChainDesc.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; // 扫描方式;
swapChainDesc.BufferDesc.RefreshRate.Numerator = 60; // 设置刷新频率;
swapChainDesc.BufferDesc.RefreshRate.Denominator = 1; // 设置共同特性;
swapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; // 设置surface的使用方式,设置CPU对backbuffer的访问方式,这些backbuffer可以用作shader input或者render target output;
swapChainDesc.OutputWindow = hwnd; // 输出窗口句柄;
swapChainDesc.Windowed = true; // 设置是窗口模式还是全屏模式;
swapChainDesc.SampleDesc.Count = 1; // 没像素多重采样的个数,默认 1;
swapChainDesc.SampleDesc.Quality = 0; // 图像的质量等级,等级越高,性能越低,默认 0;可选范围是0到ID3D10Device::CheckMultisampleQualityLevels;

unsigned int creationFlags = 0;

#ifdef _DEBUG
creationFlags |= D3D11_CREATE_DEVICE_DEBUG;
#endif
HRESULT result ;
unsigned int driver =0;
IDXGIAdapter *pAdapter_Set = NULL;


for (driver =0; driver < totalDriverTypes; ++driver)
{

// 确定设备类型;
result = D3D11CreateDeviceAndSwapChain( /*pAdapter_Set*/ 0 , driverTypes[driver], 0, creationFlags,
featureLevels, totalFeatureLevels,
D3D11_SDK_VERSION, &swapChainDesc, &swapChain_I,
&d3dDevice_I, &featureLevel_, &d3dContext_I );
if( SUCCEEDED(result) )
{
driverType_ = driverTypes[driver];
break;
}
}

if( FAILED(result) )
{
DXTRACE_MSG( L"Direct3D设备错误!");
return false;
}

ID3D11Texture2D* backBufferTexture;

result = swapChain_I->GetBuffer( 0, __uuidof( ID3D11Texture2D ), ( LPVOID* )&backBufferTexture );

if( FAILED( result ) )
{
DXTRACE_MSG(L"获取交换链后台缓存失败!");
return false;
}

result = d3dDevice_I->CreateRenderTargetView( backBufferTexture, 0, &backBufferTarget_I );

if( backBufferTexture )
backBufferTexture->Release();

if( FAILED( result ) )
{
DXTRACE_MSG(L"创建渲染目标视图失败!");
return false;
}

d3dContext_I->OMSetRenderTargets( 1, &backBufferTarget_I, 0 );

// 创建视口;
D3D11_VIEWPORT viewport;
viewport.Width = static_cast<float>(width);
viewport.Height = static_cast<float>(height);
viewport.MinDepth = 0.0f;
viewport.MaxDepth = 1.0f;
viewport.TopLeftX = 0.0f;
viewport.TopLeftY = 0.0f;

d3dContext_I->RSSetViewports( 1, &viewport );

return LoadContent();
}


这段代码是摘自《【Visual C++】游戏开发笔记之29 一步一步教你用优雅的Direct3D11代码画一个三角形》的一个函数,在我家的电脑上运行到这里的D3D11CreateDeviceAndSwapChain函数就会返回错误E_INVALIDARG或者E_FAIL,但是在其他的电脑上就能正常返回S_OK值。
这是为什么呢?
显卡肯定支持DX11。项目配置也没有问题!为什么呢??
求高手帮助!
也欢迎大家一起谈论!
...全文
3164 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
oN5GrzoN 2015-07-22
  • 打赏
  • 举报
回复
引用 2 楼 ADF1230 的回复:
主要是你这个flag设置错误了。
#ifdef _DEBUG
    creationFlags |= D3D11_CREATE_DEVICE_DEBUG;
#endif
DEBUG模式必须要设置该程序允许debug D3D模式下才能开启。
没太明白什么意思,好几本书上给的例子都是这么写的
#ifdef _DEBUG
    creationFlags |= D3D11_CREATE_DEVICE_DEBUG;
#endif
但是在debug模式下,有这句,下面D3D11CreateDeviceAndSwapChain就返回错误. 那书上为什么要这么写呢?或者要怎么设置才能用呢?
ccchychy 2015-03-17
  • 打赏
  • 举报
回复
谢谢楼主啊,帮大忙了。我是新人,刚开始学,差点就跪了。
晓兮 2014-04-25
  • 打赏
  • 举报
回复
楼主你好啊,我也在运行这个程序,只有在Release模式下才能运行,这个不是主要问题,问题是为什么我的刷新频率明明写的60,但是根本不到60呢?
oQiWuNongQingYing1 2014-01-13
  • 打赏
  • 举报
回复
哥最近也在学写类似的东西,看的教程也差不多
神-气 2013-08-05
  • 打赏
  • 举报
回复
对于楼主这种给出解决方案的行为表示赞赏。
神-气 2013-08-05
  • 打赏
  • 举报
回复
你把这句去掉就可以成功了。
神-气 2013-08-05
  • 打赏
  • 举报
回复
主要是你这个flag设置错误了。
#ifdef _DEBUG
    creationFlags |= D3D11_CREATE_DEVICE_DEBUG;
#endif
DEBUG模式必须要设置该程序允许debug D3D模式下才能开启。
bluegem218 2013-08-04
  • 打赏
  • 举报
回复
我自己 解决了! 拿出来给大家分享! 就是 D3D11CreateDeviceAndSwapChain()函数中的

__in   UINT Flags,
__in   const D3D_FEATURE_LEVEL *pFeatureLevels,
__in   UINT FeatureLevels,
一个设为0, 一个设为NULL, 一个设为0, 函数就能成功创建设备,交换链,立即上下文,特征级别,并返回S_OK了! 哎! 这里没什么人气啊!

8,305

社区成员

发帖
与我相关
我的任务
社区描述
游戏开发相关内容讨论专区
社区管理员
  • 游戏开发
  • 呆呆敲代码的小Y
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧