首页 > 代码库 > D3DPRESENT_PARAMETERS详解
D3DPRESENT_PARAMETERS详解
翻译自:http://msdn.microsoft.com/en-us/library/windows/desktop/bb172588(v=vs.85).aspx
Describes the presentationparameters.
定义后台缓存表面的参数(包括深度模板缓存是否定义和像素格式).
typedef structD3DPRESENT_PARAMETERS {
UINT BackBufferWidth; // 窗口模式可以为0,全屏模式是EnumAdapterModes的一个返回值
UINT BackBufferHeight;//同上
D3DFORMAT BackBufferFormat;//窗口模式可用D3DFMT_UNKNOWN,全屏模式是CheckDeviceType的返回值
UINT BackBufferCount;//赋值0将是1,D3DSWAPEFFECT_COPY交换表现只能是一个后台缓存,一般为1
D3DMULTISAMPLE_TYPE MultiSampleType;// D3DWAPEFFECT_DISCARD下才能用多重采样,否则都是D3DMULTSAMPLE_NONE
DWORD MultiSampleQuality;//要用CheckDeviceMultiSampleType,值[0,CheckDeviceMultiSampleType-1]
D3DSWAPEFFECT SwapEffect;// D3DSWAPEFFECT_COPY只能在后台缓存个数是1,一般用D3DSWAPEFFECT__DISCARD
HWND hDeviceWindow;//窗口模式下可以为NULL,全屏模式下是CreateDevice的hFocusWindow
BOOL Windowed;//窗口模式,还是全屏模式
BOOL EnableAutoDepthStencil;// depth-stencil Buffer会自动设置为渲染目标,reset时自动重新创建
D3DFORMAT AutoDepthStencilFormat;//CheckDepthStencilMatch的返回值
DWORD Flags;//一般用D3DPRESENTFLAG__DISCARD_DEPTHSTENCIL
UINT FullScreen_RefreshRateInHz;// FPS,窗口模式下必须为0(会添加),全屏模式是EnumAdapterModes返回值
UINT PresentationInterval;//一般用D3DPRESENT_INTERVAL_DEFAULT也就是D3DPRESENT_INTERVAL_ONE
} D3DPRESENT_PARAMETERS,*LPD3DPRESENT_PARAMETERS;
BackBufferWidth:
交换链的后台缓存的像素宽度。如果是全屏模式那么这个宽度必须是EnumAdapterModes中的一个模式的宽度。
如果是窗口模式,那么可以为0(只要宽度和高度一个是0),后台缓存的大小是当前hDeviceWindow(或hFocusWindow)一致的像素大小。
BackBufferHeight:
交换链的后台缓存的像素高度。全屏模式和窗口模式都和BackBufferWidth一样。
BackBufferFormat:
后台缓存的格式,这个缓存格式必须是CheckDeviceType返回的格式.
窗口模式支持D3DFMT_UNKOWN:
如果是窗口模式那么可以用D3DFMT_UNKNOWN来代替,这个时候用的是显卡适配器的模式,可以避免调用GetDisplayMode,全屏模式不能用D3DFMT_UNKNOWN.
窗口模式支持任何的像素格式(不需要和显示模式GetDisplayMode匹配,但设备可以操作的,设备通常不能操作一个8bits的像素):
因为颜色转换现在可以通过硬件来实现(如果硬件支持颜色转换),一些后台缓存的像素格式是被限制的,
但是运行库将会允许任何将允许任何合法的后台像素格式被提交到任何桌面格式
(有一个额外的要求是设备可以操作的像素格式在桌面上,设备通常不能操作8bit的像素格式)。
全屏模式不支持颜色转换。
BackBufferCount:
后台缓存的个数,这个值可以是0到D3DPRESENT_BACK_BUFFERS_MAX(或者是D3DPRESENT_BACK_BUFFERS_MAX_EX当使用
Direct3D 9Ex的时候)。值是0的时候将会被当做1来处理。如果后台缓存的个数不能被创建的时候,Runtime将会
运行这个函数失败,但会用一个之前创建的后台缓存个数来将其填充。结果是,可以让应用程序再调用一次这个
函数,用相同的D3DPRESENT_PARAMETERS方法,期望它第二次的时候可以运行起来。
这个方法将会失败,如果有一个后台缓存没有被创建的时候。
BackBufferCount的个数会影响D3DSWAPEFFECT的值,特别地,任何D3DSWAPEFFECT_COPY交换表现只能有一个后台缓存。
MutltiSampleType:
一个D3DMULTISAMPLE_TYPE的值,这个值必须为空D3DMULTSAMPLE_NONE,除非SwapEffect被设置为D3DSWAPEFFECT_DISCARD.
只有SwapEffect是D3DWAPEFFECT_DISCARD,多重采用才会被支持的.
MultiSampleQuality:
多重采样的质量水平.合理的值是0到CheckDeviceMultiSampleType返回的质量水平减去1。如果传入大于规定范围内的值
那么返回D3DERR_INVALIDCALL。后台缓存和深度模板缓存表面和D3DMULTISAMPLE_TYPE必须是匹配的。
SwapEffect:
D3DWAPEFFECT的枚举类型。Runtime将会在内部谨慎的保证后台缓存的交换链的表现,比如如果Windowed是True,
且SwapEffect是被设置为D3DSWAPEFECT_FLIP,那么Runtime将会创建一个额外的后台缓存用于拷贝后台缓存,,当后台缓存和前后缓存交换进行渲染的时候。
D3DSWAPEFFECT_COPY只能在后台缓存个数是1个的时候使用。
D3DSWAPEFFECT_DISCARD会在debug模式下填充噪音的信息到一些缓存上,当表面渲染以后。
Direct3D9和Direct3D9Ex下SwapEffect是有差异的。在Direct3DEx下,当采用Flip模式的时候其实是需要指定使用
3DSWAPEFFECT_FLIPEX。这就是为什么应用程序的帧可以直接跳过窗口模式到DWM模式对于Composition。
Flip模式节省了更多的内存带宽和可以从全屏渲染模式得到的统计信息中获益,且不会改变全屏的表现。Flip
模式的优异表现从win7开始是可用的。
COPY:swap时,拷贝后缓冲的内容到前缓冲,后缓冲的内容没有变换(拷贝全屏模式下拷贝比较多,以及传递区域大小不一致时)。
FLIP:swap时,交换指针,完成翻页.之后后缓冲的内容是前缓冲的内容(如果是window swap chain则会有极大的副作用)。
DISCARD:可能是COPY可能是FLIP,由driver来确定适合当前情况的方式,另外,只有这个参数下才能设置MultiSampleType
叫DISCARD是因为既然不是你自己控制交换方式,显然你也不关心也不需要后缓冲的内容,所以每次交换完,后缓冲的内容就丢弃了,即不再管理。
hDeviceWindow:
设备窗口,用于在屏幕上决定后台缓存所在的位置和后台缓存的大小。这是Present调用的时候,Direct3D将后台缓存
拷贝到前台缓存的时候被用上的,但是有别于CreateDevice时候的hFocusWindow.
对于全屏模式,这个窗口句柄是顶层窗口,也就是hFocusWindow.
当应用程序使用多个全屏Device的时候(比如一个多监视器的系统),实际上只有一个hDeviceWindow可以当做hFocusWindow,
其他的设备必须有自己唯一的hDeviceWindow。
对于窗口模式的应用程序,hDeviceWindow可以用NULL,这个时候系统的hFocusWindow将会被设置为默认的目标窗口,
hDeviceWindow也会被设置为这个窗口当在Present的时候。
注意:当用户改变窗口大小的时候,runtime不会为了响应用户的改变而做一些额外的事情。当这个设备窗口被reset
的时候后台缓存不会隐式的也重置掉。然而,这个Present函数会自动的跟踪设备窗口位置的变化,这样就可以渲染到
正确的矩形区域内。
Windowed:
设置为TRUE的时候应用程序是运行在窗口模式,FALSE的时候应用程序是运行在全屏模式。
EnableAutoDepthStencil:
如果这个值是TRUE的话,Direct3D将会为应用程序管理一个自动的深度缓存。当设备被创建的时候将会创建一个depth-stencil
缓存。depth-stencil缓存将会被自动的设置为设备的渲染目标。当设备reset的时候,depth-stencil缓存将会被自动的
释放掉和用新的大小重新创建一个。
如果启用深度模板缓存的话,那么AutoDepthStencilFormat必须被设置为一个合法的depth-stencil像素格式.
AutoDepthStencilFormat:
是一个D3DFORMAT的枚举值。指定设备用的自动depth-stencil表面的像素格式。这个成员将会被忽略,除非Enable
AutoDepthStencil被设置为TRUE.
Flags:
一个D3DPRESENTFLAG的常量,具体见D3DPRESENTFLAG对一些表面创建和操作的指定和限定。
FullScreen_RefreshRateInHz:
指定显卡适配器刷新屏幕的速率(是刷新速度FPS,一帧用的秒数的倒数),这个刷新的频率受到应用程序类型的限定。
如果是窗口模式,这个刷新的频率必须设置为0.
如果是全屏模式,那么刷新的频率必须是一个EnumAdapterModes的返回值。
PresentationInterval:
当交换链中后台缓存切换到前台缓存表现的时候的最大速率。关于支持这个模式和间隔的细节,见D3DPRESENT.
拓展:
参数Flags的D3DPRESENTFLAG常量类型:
翻译自:http://msdn.microsoft.com/en-us/library/windows/desktop/bb172586%28v=vs.85%29.aspx
D3DPRESENTFLAG_DEVICECLIP:
Clip a windowed Present blitinto the window client area, within the monitor screen area of the videoadapter that created the Direct3D device. D3DPRESENTFLAG_DEVICECLIP is notvalid with D3DSWAPEFFECT_FLIPEX.
在Present时候,在Direct3D中创建的显卡设备Device中通过位块传输(blit)裁剪监视器屏幕区域,以适应window窗口区域。
当D3DSWAPEFFECT_FLIPEX时候不能使用该标志。
D3DPRESENTFLAG__DISCARD_DEPTHSTENCIL:
当调用PRESENT提交数据到监视器,或者用SetDepthStencilSurface设置另外一个深度模板表面的时候,丢弃之前的深度模板缓存中的数据。这个选项可以有效的提高性能。
在debugruntime模式下会强制丢弃深度模板缓存之前的数据。
当深度模板缓存被锁定时候(D3DFMT_D16_LOCKABLE, D3DFMT_D32F_LOCKABLE等),不能丢弃深度模板缓存的数据,在CreateDevice时如果同时指定丢弃
深度模板缓存和可以锁定深度模板缓存的时候,创建将会失败。
D3DPRESENTFLAG_LOCKABLE_BACKBUFFER:
这个设置可以让应用程序直接的锁定后台缓存。注意后台缓存不能锁定的除非CreateDevice或者Reset时候指定了
D3DPRESENTFLAG_LOCKABLE_BACKBUFFER。锁定后台缓存会导致一些图形硬件的性能开销,执行锁定操作(或者使用UpdateSurface去写)在一个可以锁定的后台缓存会降低性能,因此在这种情况下考虑使用纹理三角形texturedtriangles去移动数据到后台缓存是一个不错的方法。
在Direct3D9和Direct3D9Ex中是不一样的,在Direct3D9Ex中在D3DSWAPEFFECT中被设置为D3DSWAPEFFECT_FLIPEX时候
是不能使用该标记的,因为在EX中flip模式下是要启用DWM来进入应用程序的后台缓存的,一个跨进程的共享表面是
不能被锁定的。
D3DPRESENTFLAG_NOAUTOROTATE:
在present期间,旋转监视器会自动处理旋转, 但是这不是很高效。这个标记不使用自动旋转,意味着应用程序要自己实现显示的旋转。应用程序可以用自己的旋转通过使用view Matrix矩阵。通过GetDisplayModeEx和GetAdapterDisplayModeEx获取当前的旋转设置,全屏模式下可以用EnumAdapterModesEx来获取旋转设置。Direcet3D9和Direct3D 9Ex会不一样,这个标记只能在Direct3D9Ex中使用。
D3DPRESENTFLAG_UNPRUNEDMODE:
这个标记可以指定显卡对未加工的原始数据渲染的模式(通过EnumAdapterModesEx获得的模式),甚至Direct3D指明这个模式是非法的。
应用程序万一要求的模式是非法的时候,也会强硬的来实现这个功能。
这个标记只能在Direct3D9Ex中使用。
D3DPRESENTFLAG_VIDEO:
这个标识是指示Driver后台缓存可以包含video(视频)数据。
D3DPRESENTFLAG_OVERLAY_LIMITEDRGB:
指示重写是全部RGB还是有限范围RGB的,设置这个标记表示使用有限范围的RGB.在有限的RGB,RGB范围将会被压缩
例如16:16:16是黑色,235:235:235是白色。
这个标记只能在Direct3D9Ex中使用。
D3DPRESENTFLAG_OVERLAY_YCbCr_BT709:
指定重写是BT.601还是BT.709,设置这个标识表明是使用BT.709,给高清电视用的(for HDTV).
这个标记只能在Direct3D9Ex中使用。
D3DPRESENTFLAG_OVERLAY_YCbCr_xvYCC:
指定重写是用传统的(convertional)YCbCr还是扩展的YCbCr(xvYCC),设置这个标记意味着是使用扩展的YCbCr(xvYCC).
这个标记只能在Direct3D9Ex中使用。
D3DPRESENTFLAG_RESTRICTED_CONTENT:
设置这个标记,表明swapchain包含保护的内容,可以自动的引起runtime去限制外部进入访问swapchain,这样只有
Desktop Windows Manager(DWM)可以使用swapchain。
这个标记只能在Direct3D9Ex中使用。
D3DPRESENTFLAG_RESTRICT_SHARED_RESOURCE_DRIVER:
设置这个标记,表明Driver可以限制,任何被创建来和DWM交互的共享资源的进入。调用者获取DWM交互的共享资源,
需要创建一个被Driver认证的权限信息,Driver通过认证决定调用者是否可以访问DWM交互的共享资源。
这个标记只能在Direct3D9Ex中使用。
参数PresentationInterval的D3DPRESENT常量类型:
翻译自:http://msdn.microsoft.com/en-us/library/windows/desktop/bb172585%28v=vs.85%29.aspx
D3DPRESENT是描述显卡适配器的刷新速率和Present函数或者Present操作完成速率之间的关联行为。这些值,可以作为
D3DPRESENT_PARAMETERS的PresentationInterval参数值,同时也是作为D3DCAPS9的PresentationIntervals参数用的。
D3DPRESENT_DONOTFLIP:
指定在渲染期间前台缓存同时作为后台缓存(渲染目标表面)。runtime帧会同步调度但是显示表面是没有改变的。
这个标识只有在全屏模式和D3DSWAPEFFECT_FLIPEX被指定的时候才能用。
这个标识只能在Direct3D9Ex中使用。
D3DPRESENT_DONOTWAIT:
一个提交展示(Present)不能用HAL Device调度。如果设置了这个值调用Present的时候,硬件在繁忙运算或等待
一个顶点的同步间隙的时候,Present将会返回D3DERR_WASSTILLDRAWING表明位块的传输操作是还没有完成的,这样
GPU Present提交的时候不用等待,不会被阻塞,应该可以提高swapchain的present提交效率。
D3DPRESENT_FLIPRESTART:
保留用的Reserved.
D3DPRESENT_FORCEIMMEDIATE:
D3DPRESENT_INTERVAL_IMMEDIATE会被强行执行的当在Present调用的时候。
这个标记只有在D3DSWAPEFFECT_FLIPEX时候才能使用。
窗口模式和全屏模式的表现都是一样的。
这个指定对于media视频应用程序是特别有用的,当应用程序需要抛弃前面的帧,继续播放后面的帧的时候。当连贯
consecutive的帧使用了D3DPRESENT_FORIMEDIATE在Present的地方进行排队的时候,只有最后的帧可以被渲染出来,
对于窗口模式或者全屏模式都一样。
这个标记只有在Direce3D9Ex在Win7上或者新的window版本的上可以使用。
当使用D3DSWAPEFFECT_FLIPX,任何一个帧使用D3DPRESENT_INTERVAL_IMMIDIATE或D3DPRESENT_INTERVAL_FORCEIMMEDIATE
将会覆盖前面的帧在Present排队期间。
例如:
frameA(D3DPRESENT_INTERVAL_ONE),
frameB(D3DPRESENT_INTERVAL_ONE),
frameC(D3DPRESENT_INTERVAL_ONE),
frameD(D3DPRESENT_INTERVAL_FORCEIMMEDIATE)
在排队的时候,提交的顺序将会是:A-B-D.
D3DPRESENT_INTERVAL_DEFAULT:
这是基本相等于D3DPRESENT_INTERVAL_ONE.
D3DPRESENT_INTERVAL_ONE:
driver将会等待之前的顶点回溯的渲染完(runtime将会"beam follow"发送跟随防止画面破裂tearing)。
Present操作的一次的时间,将不会少于一次屏幕的刷新的时间;runtime将会保证一个显卡刷新的时候至少一个Present操作完成。
这个标识通常对于窗口模式和全屏模式的swap chain都是可行的。
D3DPRESENT_INTERVAL_TWO:
driver将会等待之前的顶点回溯渲染完。
Present操作一次的时间,将不会少于2次屏幕刷新的时间。需要通过D3DCAPS9检查是否driver支持D3DPRESENT_INTERVAL_TWO
。
D3DPRESENT_INTERVAL_THREE:
driver将会等待之前的顶点回溯渲染完。
Present操作一次的时间,将不会少于3次屏幕刷新的时间。需要通过D3DCAPS9检查是否driver支持D3DPRESENT_INTERVAL_THREE
。
D3DPRESENT_INTERVAL_THREE:
driver将会等待之前的顶点回溯渲染完。
Present操作一次的时间,将不会少于4次屏幕刷新的时间。需要通过D3DCAPS9检查是否driver支持D3DPRESENT_INTERVAL_FOUR
。
D3DPRESENT_INTERVAL_IMMEDIATE:
设置这个标识,runtime将会马上客户窗口,且在显卡刷新期间可能不止一次更新(可能无限制的刷新)。Present操作将会马上发生。
这个标识通常在窗口模式和全屏模式下都是可用的。
D3DPRESENT_LINEAR_CONTENT:
指示后台缓存的内容显示是在线性的颜色空间的。
1)显示时候线性颜色空间将会隐式的转换为sRGB(gamma=2.2).这是这个标识支持的唯一转换。
2)因为这个标记表示后台需要一个合适的后台缓存内容,这个可以在调用present期间被指定。也就是说,应用程序
可以在一帧中显示线性颜色内容的,然后下一帧切换到到正确的内容。
3)这个标记在全屏模式下是被忽略的(注意到这个标记只有在Present的显示swap chain中可用,且Present方法不能
包含一个标记的参数)。
4)这个标记通常是可以接受的,但是只有在driver exposes>D3DCAPS3_LINEAR_TO_SRGB_PresentATION时候是有效的。
5)只有在D3DFORMAT是X8R8G8B8的时候才是支持的。
D3DPRESENT_VIDEO_RESTRICT_TO_MONITOR:
裁剪monitor/device监视器屏幕区域内容,以适应window窗口区域。在Flip3D view中或者监视器的任务栏中显示缩略图。
这个标识只有在Direct3D9Ex中才能用。
如果没有使用DWM模式(desktopcomposition模式),这个标识和D3DPRESENTFLAG_DEVICECLIP是一样的。
D3DPRESENT_UPDATEOVERLAYONLY:
直接更新重写的位置或colorkey数据,而不需要真正的flip交换表面和不会改变图片的显示持续时间。
这个标识只有在Direct3D9Ex中可用。
D3DPRESENT_HIDEOVERLAY:
关闭overlay hardware硬件支持的覆盖。
这个标识只有在Direct3D9Ex中可用。
D3DPRESENT_UPDATECOLORKEY:
重新画colorkey数据。
这个标识只有在Direct3D9Ex中可用。
D3DPRESENT_PARAMETERS详解