D3D新手,请轻拍。
最近在学CodeSampler上的DX9范例。编译环境是VS2012。搭编译环境用了一两天,另行开文吐槽(有时间的话)。
本文讲讲Full-screen initialization里面的一个问题。
程序运行到第288行时报错:
g_pd3dDevice->Clear( , NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,
D3DCOLOR_COLORVALUE(0.0f,1.0f,0.0f,1.0f), 1.0f, );
因为g_pd3dDevice此时是空指针。
所以单步调试,发现init中有这样几行:
// Does this adapter mode support a mode of 640 x 480?
if( d3ddm.Width != || d3ddm.Height != )
continue; // Does this adapter mode support a 32-bit RGB pixel format?
if( d3ddm.Format != D3DFMT_X8R8G8B8 )
continue; // Does this adapter mode support a refresh rate of 75 MHz?
if( d3ddm.RefreshRate != )
continue;
d3ddm是显示器支持的模式的枚举,包括分辨率宽高,刷新率和format(暂时不知是啥)。我的显示器上一共有13种。
但是这几行检测强制要求显示器支持640X480,75MHZ的模式。
LZ的显示器没有完全符合的模式
于是在后面的代码里
if( bDesiredAdapterModeFound == false )
{
// TO DO: Handle lack of support for desired adapter mode...
return;
}
init函数直接返回了。而初始化g_pd3dDevice的代码还在后面,于是它就没被初始化了。
o(╯□╰)o这代码居然不报错而是直接return。
解决方案:上面的75改成60(即LZ的显示器支持的一种模式),运行成功。