CreateDevice返回D3DERR_INVALIDCALL,这是为神马?

lookupheaven 2013-01-11 02:57:22
我用的是一台虚拟机,代码如下,传递的参数是 InitD3D(hInstance, Width, Height, true, D3DDEVTYPE_REF, &Device),网上搜了下,说可能是d3dpp内容错误所致,但我实在看不出来错在哪里?
bool d3d::InitD3D(
HINSTANCE hInstance,
int width, int height,
bool windowed,
D3DDEVTYPE deviceType,
IDirect3DDevice9** device)
{
//
// Create the main application window.
//

WNDCLASS wc;

wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = (WNDPROC)d3d::WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(0, IDI_APPLICATION);
wc.hCursor = LoadCursor(0, IDC_ARROW);
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wc.lpszMenuName = 0;
wc.lpszClassName = "Direct3D9App";

if( !RegisterClass(&wc) )
{
::MessageBox(0, "RegisterClass() - FAILED", 0, 0);
return false;
}

HWND hwnd = 0;
hwnd = ::CreateWindow("Direct3D9App", "Direct3D9App",
WS_EX_TOPMOST,
0, 0, width, height,
0 /*parent hwnd*/, 0 /* menu */, hInstance, 0 /*extra*/);

if( !hwnd )
{
::MessageBox(0, "CreateWindow() - FAILED", 0, 0);
return false;
}

::ShowWindow(hwnd, SW_SHOW);
::UpdateWindow(hwnd);

//
// Init D3D:
//

HRESULT hr = 0;

// Step 1: Create the IDirect3D9 object.

IDirect3D9* d3d9 = 0;
d3d9 = Direct3DCreate9(D3D_SDK_VERSION);

if( !d3d9 )
{
::MessageBox(0, "Direct3DCreate9() - FAILED", 0, 0);
return false;
}

// Step 2: Check for hardware vp.

D3DCAPS9 caps;
d3d9->GetDeviceCaps(D3DADAPTER_DEFAULT, deviceType, &caps);

int vp = 0;
if( caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT )
vp = D3DCREATE_HARDWARE_VERTEXPROCESSING;
else
vp = D3DCREATE_SOFTWARE_VERTEXPROCESSING;

// Step 3: Fill out the D3DPRESENT_PARAMETERS structure.

D3DPRESENT_PARAMETERS d3dpp;
d3dpp.BackBufferWidth = width;
d3dpp.BackBufferHeight = height;
d3dpp.BackBufferFormat = D3DFMT_UNKNOWN/*D3DFMT_A8R8G8B8*/;
d3dpp.BackBufferCount = 1;
d3dpp.MultiSampleType = D3DMULTISAMPLE_NONE;
d3dpp.MultiSampleQuality = 0;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.hDeviceWindow = hwnd;
d3dpp.Windowed = windowed;
d3dpp.EnableAutoDepthStencil = true;
d3dpp.AutoDepthStencilFormat = D3DFMT_UNKNOWN/*D3DFMT_D24S8*/;
d3dpp.Flags = 0;
d3dpp.FullScreen_RefreshRateInHz = 0;
d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;

// Step 4: Create the device.

hr = d3d9->CreateDevice(
D3DADAPTER_DEFAULT, // primary adapter
deviceType, // device type
hwnd, // window associated with device
vp, // vertex processing
&d3dpp, // present parameters
device); // return created device

if( FAILED(hr) )
{
// try again using a 16-bit depth buffer
d3dpp.AutoDepthStencilFormat = D3DFMT_D16;

hr = d3d9->CreateDevice(
D3DADAPTER_DEFAULT,
deviceType,
hwnd,
vp,
&d3dpp,
device);

if( FAILED(hr) )
{
d3d9->Release(); // done with d3d9 object
::MessageBox(0, "CreateDevice() - FAILED", 0, 0);
return false;
}
}

d3d9->Release(); // done with d3d9 object

return true;
}

...全文
1182 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
星江月 2013-02-21
  • 打赏
  • 举报
回复
一般来说,原因是你的d3dpp没有设置正确(不是绝对) 你尝试先用0填充该结构体,再设置要设置的参数看看
lookupheaven 2013-01-30
  • 打赏
  • 举报
回复
这个程序的关键错误在于,我把Init_3D放在了ShowWindow下面去了
mrsupersky 2013-01-27
  • 打赏
  • 举报
回复
引用 楼主 Razor87 的回复:
本帖最后由 Razor87 于 2013-01-11 14:58:22 编辑 我用的是一台虚拟机,代码如下,传递的参数是 InitD3D(hInstance, Width, Height, true, D3DDEVTYPE_REF, &Device),网上搜了下,说可能是d3dpp内容错误所致,但我实在看不出来错在哪里? C/C+……
肯定不行啊。 虚拟机绝大多数不支持3D硬件的。虽然,现在微软的VPC和Oracle的VBox都有相应的支持,但是一般所有的云主机肯定是不支持的。 因为云主机主要是用来 做web或者做业务计算的。 而且我还不清楚像XenServer这一类虚拟机软件是否支持显卡硬件加速。。。如果不支持,那就肯定不能跑对硬件有一定要求的图形程序了。
lookupheaven 2013-01-15
  • 打赏
  • 举报
回复
引用 6 楼 tkminigame 的回复:
引用 5 楼 Razor87 的回复: 引用 4 楼 tkminigame 的回复:引用 2 楼 Razor87 的回复: 引用 1 楼 tkminigame 的回复:看你跑什么虚拟机,还有你本机的硬件状况。我以前在虚拟机里面跑d3d程序失败过,基本上当时跑不了3D程序。 我的主机是云主机,反正开不了win7的aero特效,但这个没用hal,应该跟这个没关吧 虽然不了解云,但是在远程主……
我不告诉你
tkminigame 2013-01-14
  • 打赏
  • 举报
回复
引用 5 楼 Razor87 的回复:
引用 4 楼 tkminigame 的回复:引用 2 楼 Razor87 的回复: 引用 1 楼 tkminigame 的回复:看你跑什么虚拟机,还有你本机的硬件状况。我以前在虚拟机里面跑d3d程序失败过,基本上当时跑不了3D程序。 我的主机是云主机,反正开不了win7的aero特效,但这个没用hal,应该跟这个没关吧 虽然不了解云,但是在远程主机上跑d3d程序……
奇葩公司求曝光啊
lookupheaven 2013-01-14
  • 打赏
  • 举报
回复
引用 4 楼 tkminigame 的回复:
引用 2 楼 Razor87 的回复: 引用 1 楼 tkminigame 的回复:看你跑什么虚拟机,还有你本机的硬件状况。我以前在虚拟机里面跑d3d程序失败过,基本上当时跑不了3D程序。 我的主机是云主机,反正开不了win7的aero特效,但这个没用hal,应该跟这个没关吧 虽然不了解云,但是在远程主机上跑d3d程序是不是有点蛋疼?跑不了aero特效已经说明它不支持一些基本的显卡功能了……
是很蛋疼,在公司只有这个机子,没办法啊
tkminigame 2013-01-14
  • 打赏
  • 举报
回复
引用 2 楼 Razor87 的回复:
引用 1 楼 tkminigame 的回复:看你跑什么虚拟机,还有你本机的硬件状况。我以前在虚拟机里面跑d3d程序失败过,基本上当时跑不了3D程序。 我的主机是云主机,反正开不了win7的aero特效,但这个没用hal,应该跟这个没关吧
虽然不了解云,但是在远程主机上跑d3d程序是不是有点蛋疼?跑不了aero特效已经说明它不支持一些基本的显卡功能了。
彩阳 2013-01-12
  • 打赏
  • 举报
回复
看代码可能是后台缓存的格式问题, 使用SDK自带的D3DCapsViewer看看你的后台缓存格式和深度模板格式有哪些是可以支持的。
lookupheaven 2013-01-11
  • 打赏
  • 举报
回复
引用 1 楼 tkminigame 的回复:
看你跑什么虚拟机,还有你本机的硬件状况。我以前在虚拟机里面跑d3d程序失败过,基本上当时跑不了3D程序。
我的主机是云主机,反正开不了win7的aero特效,但这个没用hal,应该跟这个没关吧
tkminigame 2013-01-11
  • 打赏
  • 举报
回复
看你跑什么虚拟机,还有你本机的硬件状况。我以前在虚拟机里面跑d3d程序失败过,基本上当时跑不了3D程序。
DXUT框架剖析 DXUT框架剖析(14) 摘要: 控件是用户接口的重要组成部分,为了便于用户操作,为程序界面添加各种控件是非常好的方法。DXUT框架为在Direct3D程序中添加各种控件提供了支持。为了便于加载控件和处理各控件的消息,通常先在窗口中加载对话框,然后在对话框中添加响应的控件,由对话框来管理控件。为了统一管理各个对话框,还需要定义对话框资源管理器类CDXUTDialogResourceManager的一个对象,在程序开始时,调用各个对话框的Init函数和对话框资源管理对象进行初始化 DXUT框架剖析(13) 摘要: DXUT框架对文本绘制进行了封装,提供了类CDXUTHelper来简化文本显示,使用该接口大体分为3个步骤:初始化ID3DXSprite和ID3DXFont对象,显示文本,释放ID3DXSprite和ID3DXFont对象。 DXUT框架剖析(12) 摘要: DXUT暂停函数: DXUTPause:将框架的内部计数器和(或)渲染过程设为暂停状态。 DXUTRenderingPaused:检查当前设备的渲染状态是否处在暂停状态。 DXUTIsTimePaused:检查当前设备的计时器是否处在暂停状态。 DXUT框架剖析(11) 摘要: DXUT统计函数: DXUTGetFPS: 获取当前每秒提交的帧数。 DXUTGetFrameStats:获取一个指向字符串的指针,该字符串包括每秒帧数、分辨率、后台缓冲区格式、深度缓冲区格式。 DXUTGetDeviceStats:获取一个指向字符串的指针,该字符串包括当前设备类型、顶点运算行为和设备名。 DXUT框架剖析(10) 摘要: 管理DXUT框架的函数: DXUTResetFrameworkState: 将框架状态重置为初始默认状态,之前设置的框架状态改变将失效。 DXUTShutdown: 触发程序终止和清空框架。 DXUTGetExitCode: 获取框架的退出代码。 DXUT框架剖析(9) 摘要: 下面列出允许改变DXUT行为和获取内部变量的函数,这些函数在使用DXUT框架的Direct3D程序中是非常实用的。 DXUT框架剖析(8) 摘要: Direct3D API的设计使程序能比较容易地处理各种错误,尽管大多数Direct3D API函数返回HTRSULT值,但只有一部分函数返回设备错误,如D3DERR_DEVICELOST或 D3DERR_DRIVERINTERNALERROR。但是通常的Direct3D应用程序使用多种API函数,当传递的参数不合要求时,将返回 D3DERR_INVALIDCALL。 当开发Direct3D应用程序时,应该检查所有的API调用是否成功,如果出现一个没有预测到的失败调用,应用程序应立即给出通知或记录该错误。使用这种方法,开发人员能很快发现哪些API函数的调用是不正确的。一个正确调用Direct3D API函数的应用程序应能安全地忽略大多数Direct3D API函数的失败调用,除了一些关键性的API函数,如Present()或TestCooperativeLevel(),这些函数返回的错误应用程序不能忽略。 DXUT框架剖析(7) 摘要: 框架也提供了帧事件,它在渲染过程中的每一帧被调用,应用程序应该注册并实现这些回调函数。 DXUT框架剖析(6) 摘要: 在窗口和设备创建好之后,应用程序需要使用消息循环处理窗口消息、更新和渲染场景、处理设备事件。应用程序可以实现自己的消息循环,也可以使用DXUT消息循环,注册相应的回调函数,可以让DXUT处理设备、帧消息事件。 为使用DXUT框架的消息循环,可以调用DXUTMainLoop()函数. DXUT框架剖析(5) 摘要: 应用程序可以通过DXUTSetCallbackDeviceChanging()设置回调函数来修改Direct3D设备的创建设置。 回调函数ModifyDeviceSettings()返回一个布尔值,如果应用程序返回 TRUE,DXUT框架继续像在正常情况下那样进行设备创建。如果返回FALSE,框架不能改变设备,如果已有一个设备,则继续使用当前设备。如果框架提出的请求是改变到一个应用程序不能使用的设备,应用程序可以拒绝该请求。例如,在一个多显示器配置中,默认情况下在显示器之间拖动窗口将使框架改变设备。但如果应用程序不能使用其他设备,它就必须拒绝这种改变并继续使用当前设备。 DXUT框架剖析(4) 摘要: 通常可以用标准的Direct3D方法Creat

8,303

社区成员

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

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