[C++-Direct3D]D3DPRESENT_PARAMETERS

原型

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

后台缓冲区的宽度和高度,以像素为单位

1.在窗口模式下,可默认使用0,也可以指定其他大小。

2.在全屏模式下,这两者的值必需符合显卡所支持的分辨率,如800*600,640*480等,可用 DisplayModeCollection  EnumAdapterModes  获取显止支持的分辨率。(对这两个函数还有疑问)

BackBufferFormat

后台缓冲区的像素格式,即颜色深度和格式

1.此值必须是经过Manager的CheckDeviceType确认的像素格式之一。使用Device的DisplayMode可获得当前使用的像素格式。

2.在窗口模式下,必须指定为当前窗口所使用的颜色模式。可以使用D3DFMT_UNKOWN,通知运行库使用当前显示模式的像素格式,也可调用Device的DisplayMode来获取。

3.在全屏模式下,可以使用设备支持的任何颜色模式。用CheckDeviceType方法可以进行检查。(对于窗口应用程序,由于颜色转换可由硬件完成(前提是硬件支持颜色转换),因此后台缓冲区格式不需要匹配显示模式格式。但全屏模式下则无法执行颜色转换,因此在全屏模式下不应该直接获取当前的显示模式,而是指定一个设备支持的显示格式。

BackBufferCount

后台缓冲区的数目

1.可以为0,1,2,3。指定为0时会被视为1。通常该参数设置为1,表示只使用一个后台缓冲区。

2.(不知道有没有道理)通常来说,窗口模式的游戏,我们设置为1,全屏模式的游戏,我们设置为0,原因是,窗口模式游戏下,我们的游戏窗口有可能被其他的窗口遮挡住,此时我们需要多设置一个后台缓冲来存放之前的图象,当遮挡的窗口移开后,我们将不必重新绘制后台缓冲区,仅将记忆中的那个缓冲区放到前台就可以恢复我们的游戏窗口了,而全屏模式下,我们不必要去考虑这一点,设置为0,并不是说没有后台缓冲,系统会默认给我们一个的,设置为1,是我们在系统给我们的后台缓冲之外,再重新设置一个后台缓冲。

MultiSampleType 和 MultiSampleQuality

多重采样类型和质量,即全屏抗锯齿的类型和级别

1.这两个参数可能使你的渲染场景变得更好看,但是却消耗你很多内存资源,而且,并不是所有的显卡都支持这两者所设定的功能的。因此在使用时要先检查硬件是否支持。

2.只有当SwapEffect的值为D3DSWAPEFFECT_DISCARD,即交换效果为Discard时,才支持多重采样。所以如果SwapEffect的值不是D3DSWAPEFFECT_DISCARD,此值要设为NONE。

3.MultiSampleType一般设为D3DMULTISAMPLE_NONE:不进行多重采样(不使用抗锯齿),也可使用D3DMULTISAMPLE_1_SAMPLE ~ D3DMULTISAMPLE_16_SAMPLE参数,指定16个不同的重采样级别,每个级别都对应不同的效果(1X – 16X)。

4.MultiSampleQuality的值位于0到1之间,只有当MultiSampleType有设定时该分量才有效。

SwapEffect

用来指定交换链中的缓冲区如何进行交换(即缓冲区的交换方式,当前后台缓冲区交换后,换下来的那块缓冲区的数据该怎么处理?可以复制,或者丢弃,不同的值效果也不同

1.如果Windowed被设置为true且SwapEffect被设置为Flip,则无论哪个缓冲区在呈现时成为前台缓冲区,运行库都将创建一个额处的后台缓冲区并进行复制。Copy设置要求BackBufferCount被设置为1。此设置是在调试运行库中强制执行的,调试运行库在任何缓冲区呈现后在其中填入噪音。

(叫DISCARD(丢弃)是因为既然不是你自己控制交换方式,显然你也不关心也不需要后台缓冲的内容,所以每次效换完,后缓冲的内容就“丢弃”了,即不再管理。因此,在需要实现一些特殊效果的时候可能需要多个缓冲区,然后将缓冲区当中的图形进行处理,这个时候就不能使用自动抛弃的方式了。)

2.D3DSWAPEFFECT类型的枚举值:

D3DSWAPEEFECT_COPY :swap时,拷贝后缓冲区的内容到前缓冲区,后缓冲区的内容不变。

D3DSWAPEEFECT_FLIP :swap时,交换前后缓冲区指针,完成翻页,之后后缓冲区的内容是前缓冲区的内容

D3DSWAPEEFECT_DISCARD:可能是COPY也可能是FLIP,由设备来确定最适合当前情况的方式。

D3DSWAPEFFECT_DISCARD:清除后台缓存的内容

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

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

(一般情况下使用D3DSWAPEFFECT_DISCARD)

hDeviceWindow

指定渲染的窗口的句柄,若为NULL,表示使用当前窗口

Windowed

指定窗口/全屏模式,为true时,程序将在窗口模式下运行,为false时,程序将在全屏模式下运行。

EnableAutoDepthStencil

是否开启深度缓存和模板缓存。true表示开启并创建深度及模板缓冲区并由DirectX自动管理。为false时表示不开启。在3D场景中应该开启。

AutoDepthStencilFormat

指定深度缓冲及模板缓冲区的格式,如果不使用深度模板缓冲,那么这个参数将没有用,可设为NULL。通常会使用D3DFMT_D16格式,即深度值用16位二进制表示。位数越多,场景绘制得越精确,相应内存消耗也会更多。

D3DFMT_D32:指定一个32位的深度缓冲区

D3DFMT_D24S8:指定一个32位的深度/模板缓冲区,其中24位用于深度缓冲区,8位用于模板缓冲区

D3DFMT_D24X8:指定一个32位的深度/模板缓冲区,其中24位用于的度缓冲区,8位空闲

D3DFMT_D24X4S4:指定一个32位的深度/模板缓冲区,其中24位用于深度缓冲区,4位用于模板缓冲区,4位空闲

D3DFMT_D16:指定一个16位的深度缓存区

D3DFMT_D15S1:指定一个16位的深度/模板缓冲区,其中15位用于深度缓冲区,1位用于模板缓冲区

Flags

其他的附加特性标志(通常指定为0或NULL)

D3DPRESENTFLAG_LOCKABLE_BACKBUFFER:表示后缓冲区可以被锁定,需要注意的是这样缓冲区会降低程序的运行效率。

D3DPRESENTFLAG_DISCARD_DEPTHSTENCIL:指定深度缓冲区和模板缓冲区在后一个缓冲区被渲染(即调用Present方法后)的时候将被放弃。这里的“放弃”指的是深度缓冲区和模板缓冲区被释放或者变为无效,从而加快程序运行的速度,提升性能。

FullScreen_RefreshRateInHz

指定屏幕的刷新频率(在全屏模式下可指定屏幕支持的任意刷新率(使用EnumAdapterModes获取)

但如果使用了不支持的刷新率,将会不能创建设备或发出警告信息。在窗口模式下,必须指定为0或D3DPRESENT_RATE_DEFAULT(即默认的),表示使用与当前屏幕相同的刷新率)

D3DPRESENT_RATE_DEFAULT:表示使用默认刷新率,即与屏幕刷新率相同。

D3DPRESENT_RATE_UNLIMITED:表示图形绘制结束后立刻将内容复制到前台缓冲区。

PresentationInterval

D3DPRESENT标志集合的一个成员。用于指定屏幕的翻转模式,即前后台缓冲区的交换频率。在窗口模式下,其取值为0,只能选用D3DPRESENT_INTERVAL_DEFAULT。

(SDK推荐一般情况下应使用D3DPRESENT_INTERVAL_DEFAULT,可避免垂直同步,窗口模式下一定要使用该选项。但我们会发现,当游戏卡的时候, 屏幕是一跳一跳的,跳帧现象就是因为我们的后台缓冲还没有渲染完,系统不允许放置到前台,而导致前台缓冲迟迟换不下来,等更替时,我们可能已经进 行了很多操作的原因。)

D3DPRESENT_INTERVAL_DEFAULT:D3D选择交换频率,通常等同于屏幕刷新率

D3DPRESENT_INTERVAL_IMMEDIATE:立即显示更新(或立即交换),不推荐

D3DPRESENT_INTERVAL_ONE:等待一个垂直扫描周期才更新,有助于减少剪断和撕裂效果(其实DEFAULT和ONE完全无区别)

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

原文链接:https://blog.csdn.net/setflvet/article/details/6987532

发表回复