• D3DPRESENT_PARAMETERS 说明及 DirectX窗口模式和全屏模式的Device创建 冷夜


    typedef struct _D3DPRESENT_PARAMETERS_
    {
        UINT                BackBufferWidth;
        UINT                BackBufferHeight;
        D3DFORMAT           BackBufferFormat;
        UINT                BackBufferCount;
        D3DMULTISAMPLE_TYPE MultiSampleType;
        DWORD               MultiSampleQuality;
        D3DSWAPEFFECT       SwapEffect;
        HWND                hDeviceWindow;
        BOOL                Windowed;
        BOOL                EnableAutoDepthStencil;
        D3DFORMAT           AutoDepthStencilFormat;
        DWORD               Flags; 
    
        /* FullScreen_RefreshRateInHz must be zero for Windowed mode */
        UINT                FullScreen_RefreshRateInHz;
        UINT                PresentationInterval;
    } D3DPRESENT_PARAMETERS;
    复制代码

    成员

    说明

    BackBufferWidth

    BackBufferHeight

    后备缓存区所需要的宽度和高度。

    如果使用全屏模式,则必须使用显示器所支持的分辨率(使用EnumAdapterMode获取各种分辨率)

    如果使用窗口模式,默认使用0。

    BackBufferFormat

    后备缓冲区使用的颜色模式。即颜色深度和格式。

    如果使用全屏模式,可以使用设备支持的任何颜色模式。使用CheckDeviceType方法来检查。

    如果使用窗口模式,则必须使用当前窗口使用的颜色模式。可以使用D3DFMT_UNKOWN,系统会自动获取该值。

    BackBufferCount

    后备缓冲区的数目。可以为0,1,2,3.

    通常一个后备缓冲区就足够了。

    MultiSampleType

    多重采样类别,用于图形反锯齿。使用1X – 16X。

    注意,使用高级别的多重采样类别的话,会消耗更多的图形显存。

    SwapEffect

    指定系统如何将后台缓冲区的内容复制到前台缓冲区,从而在屏幕上显示。它的值有:

    D3DSWAPEFFECT_DISCARD:清除后台缓存的内容

    D3DSWAPEEFECT_FLIP:保留后台缓存的内容。当缓存区>1时。

    D3DSWAPEFFECT_COPY: 保留后台缓存的内容,缓冲区=1时。

    一般情况下使用D3DSWAPEFFECT_DISCARD

    hDeviceWindow

    指定进行渲染的窗口。

    Windowed

    指定窗口模式。True = 窗口模式;False = 全屏模式

    EnableAutoDepthStencil

    指定是否需要DirectX自动管理深度缓冲(用于关于每个像素点的深度信息)。3D场景应该开启深度测试。

    AutoDepthStencilFormat

    深度缓冲的格式。一般使用D3DFMT_D16,即深度值用16位二进制表示。位数越多,场景绘制得越精确,相应内存消耗更多。

    Flags

    D3DPRESENTFLAG_LOCKABLE_BACKBUFFER表示锁定后备缓冲区。一般情况下不使用。默认为0.

    FullScreen_RefreshRateInHz

    指定屏幕刷新率。

    如果使用全屏模式的话,使用屏幕支持的任意频率(使用EnumAdapterModes获取)。值为0表示使用默认刷新率。

    如果使用窗口模式的话,值必须为0,表示使用桌面刷新率。

    FullScreen_PresentationInterval

    指定后备缓冲区与前台缓冲区的交换频率。一般情况下使用D3DPRESENT_INTERVAL_DEFAULT.

    D3DPRESENT_INTERVAL_DEFAULT:  窗口模式一定得用该选项!

    D3DPRESENT_INTERVAL_IMMEDIATE: VSync关闭,立即更新~

    D3DPRESENT_INTERVAL_ONE:等待一个垂直扫描周期才更新,有助于减少剪断和撕裂效果。

    D3DPRESENT_INTERVAL_TWO ~ FOUR:分别等待相应个数周期才更新!

     创建Device代码段:

    bool CApp::InitD3D()
    {
        IDirect3D9 *d3d=0;
        d3d=Direct3DCreate9(D3D_SDK_VERSION);
        if (d3d==NULL)
        {
            MessageBox(m_hwnd,_T("Direct3DCreate9 ERROR!"),_T("ERROR"),MB_OK);
            return false;
        }
    
        D3DDEVTYPE d3dt=D3DDEVTYPE_HAL;
        D3DCAPS9 caps;
        d3d->GetDeviceCaps(D3DADAPTER_DEFAULT,d3dt,&caps);
        int vp=0;
        if (caps.DevCaps& D3DDEVCAPS_HWTRANSFORMANDLIGHT)
        {
            vp=D3DCREATE_HARDWARE_VERTEXPROCESSING;
        }else
        {
            vp=D3DCREATE_SOFTWARE_VERTEXPROCESSING;
        }
        
        D3DPRESENT_PARAMETERS d3dpp;
        d3dpp.AutoDepthStencilFormat=D3DFMT_D24S8;
        
        d3dpp.BackBufferFormat=D3DFMT_A8R8G8B8;
        d3dpp.EnableAutoDepthStencil=true;
        d3dpp.Flags=0;
        d3dpp.hDeviceWindow=m_hwnd;
        d3dpp.Windowed=m_bWindowed;
        d3dpp.MultiSampleQuality=0;
        d3dpp.MultiSampleType=D3DMULTISAMPLE_NONE;
    
        if (m_bWindowed)//窗口模式
        {
            d3dpp.BackBufferCount=1;
            d3dpp.BackBufferHeight=0;    //窗口模式,默认使用0
            d3dpp.BackBufferWidth=0;    //窗口模式,默认使用0
            d3dpp.PresentationInterval=D3DPRESENT_INTERVAL_DEFAULT;    //窗口模式一定得用 D3DPRESENT_INTERVAL_DEFAULT !
            d3dpp.FullScreen_RefreshRateInHz=0;//显示器刷新率,窗口模式该值必须为0
            d3dpp.SwapEffect=D3DSWAPEFFECT_DISCARD;    //指定系统如何将后台缓冲区的内容复制到前台缓冲区 D3DSWAPEFFECT_DISCARD:清除后台缓存的内容
    
        }else
        {
            //全屏模式
            d3dpp.BackBufferCount=2;
            d3dpp.BackBufferHeight=m_height;//可以用 GetSystemMetrics(SM_CXSCREEN) 获得屏幕宽
            d3dpp.BackBufferWidth=m_width;    //可以用 GetSystemMetrics(SM_CYSCREEN) 获得屏幕高
            d3dpp.PresentationInterval=D3DPRESENT_INTERVAL_IMMEDIATE;
            d3dpp.FullScreen_RefreshRateInHz=D3DPRESENT_RATE_DEFAULT;//显示器刷新率,窗口模式该值必须为0
            d3dpp.SwapEffect=D3DSWAPEFFECT_FLIP;    //D3DSWAPEEFECT_FLIP:保留后台缓存的内容。当缓存区>1时。
        }
    
    
        HRESULT hr=0;
        hr=d3d->CreateDevice(D3DADAPTER_DEFAULT,d3dt,m_hwnd,vp,&d3dpp,&m_device);
    
        if (FAILED(hr))
        {
            MessageBox(m_hwnd,_T("CreateDevice ERROR"),_T("ERROR"),MB_OK);
            safe_release(d3d);
            return false;
        }
        return true;
    }

     另外创建窗口的style风格也不一样:

            //创建窗口
            if (m_bWindowed)//窗口模式
            {
                m_hwnd=CreateWindowEx(NULL,_T("DXCLASSNAME"),lpcwTitle,
                    (WS_OVERLAPPEDWINDOW|WS_VISIBLE)&~WS_THICKFRAME,0,0,
                    m_width,m_height,NULL,NULL,hinstance,NULL);
            }else
            {
                //全屏模式
                m_hwnd=CreateWindowEx(NULL,_T("DXCLASSNAME"),lpcwTitle,
                    (WS_EX_TOPMOST|WS_VISIBLE|WS_POPUP),0,0,
                    m_width,m_height,NULL,NULL,hinstance,NULL);
            }
     
  • 相关阅读:
    软件设计师1990年下午试题5(流程图解析)
    保存新浪网首页到本地(使用urllib)
    软件设计师1990年下午试题1(流程图解析)
    1992年高级程序员下午试题6
    Delphi调用JavaScript解析JSON
    判断是否联网
    存储相关基本概念
    马尔科夫算法 awk 实现
    awk 实例练习 (三)
    awk 实例练习(一)
  • 原文地址:https://www.cnblogs.com/gamesky/p/2986919.html
Copyright © 2020-2023  润新知