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;
}

...全文
1275 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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程序。

8,325

社区成员

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

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