标题:DirectX初始化接口失败
只看楼主
七绝梦天
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2013-2-27
结帖率:0
已结贴  问题点数:20 回复次数:2 
DirectX初始化接口失败
这是一段Direct3D接口的初始化代码
程序代码:
pD3D=Direct3DCreate9(D3D_SDK_VERSION);
    if(pD3D!=NULL)
    {
        D3DPRESENT_PARAMETERS d3dpp;
        memset(&d3dpp,0,sizeof(d3dpp));
        d3dpp.BackBufferWidth=SURFACE_WIDTH;
        d3dpp.BackBufferHeight=SURFACE_HEIGHT;
        d3dpp.SwapEffect=D3DSWAPEFFECT_DISCARD;
        d3dpp.BackBufferFormat=D3DFMT_A8R8G8B8;
        d3dpp.BackBufferCount=1;
        d3dpp.Windowed=false;
        d3dpp.hDeviceWindow=g_hWnd;
        d3dpp.MultiSampleType=D3DMULTISAMPLE_NONE;
        d3dpp.MultiSampleQuality=0;
        d3dpp.EnableAutoDepthStencil=FALSE;
        d3dpp.AutoDepthStencilFormat=D3DFMT_D24FS8;
        d3dpp.Flags=0;
        d3dpp.FullScreen_RefreshRateInHz=D3DPRESENT_RATE_DEFAULT;
        d3dpp.PresentationInterval=D3DPRESENT_INTERVAL_DEFAULT;
        HRESULT hr=pD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,g_hWnd,D3DCREATE_HARDWARE_VERTEXPROCESSING,&d3dpp,&pd3dDevice);
        if(!FAILED(hr))
        {
            return true;
        }
        else
        {
            switch(hr)
            {
            case D3DERR_INVALIDCALL:
                OutputDebugString(L"函数的参数为一个无效值\n");
                break;
            case D3DERR_NOTAVAILABLE:
                OutputDebugString(L"当前设备不支持所设类型\n");
                break;
            case D3DERR_OUTOFVIDEOMEMORY:
                OutputDebugString(L"没有足够的显存执行操作\n");
                break;
            default:
                OutputDebugString(L"未知错误\n");
                break;
            }
        }
    }
    return false;

以上代码设备能初始化成功运行正常,后面的画图都没问题。
可是我只要把自动深度缓冲选项打开(d3dpp.EnableAutoDepthStencil=TRUE;),pD3D->CreateDevice函数就调用失败,返回D3DERR_INVALIDCALL错误。
我的显卡是Geforce 540M。
尝试修改各种参数还是不行,哪位大哥知道为什么啊?
搜索更多相关主题的帖子: DirectX 接口 
2013-02-27 16:15
hahayezhe
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:湖南张家界
等 级:贵宾
威 望:24
帖 子:1386
专家分:6999
注 册:2010-3-8
得分:20 
深度和格式的匹配不见得正确。
看看这帖子 http://hi.baidu.com/sunstar1989/item/ff16140ed2cacf153b53eeda
先获取下设备的格式吧
2013-02-27 16:51
七绝梦天
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2013-2-27
得分:0 
回复 2楼 hahayezhe
感谢 hahayezhe
    我将设置 d3dpp.AutoDepthStencilFormat=D3DFMT_D24X8 属性后接口创建成功了!
不过我还有个疑问:
    设备表面的支持类型有好多种,有
        D3DFMT_D32——表示32位深度缓冲

        D3DFMT_D24S8——表示24位深度缓冲并保留8位模版缓冲(stencil buffer)

        D3DFMT_D24X8——表示24位深度缓冲

        D3DFMT_D24X4S4——表示24位深度缓冲并保留4位模版缓冲

        D3DFMT_D16——表示16位深度缓冲

    如果我要检测设备支持哪一种深度缓冲,需要用m_pD3D->CheckDeviceFormat函数来遍历检测每一种类型吗?如果设备支持多种深度缓冲的话,我又该如何选择一个比较合适的类型呢?
2013-02-28 09:40



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-399312-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.443011 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved