swap chain- IDirect3DSwapChain9
交换链,对应的接口是IDirect3DSwapChain9,是整个Directx 3D中最核心的接口。D3d程序至少包含一个swap chain,在调用CreateDevice时自动创建,
其中的D3DPRESENT_PARAMETERS * pPresentationParameters参数设置将要创建的IDirect3DSwapChain9的属性。首先我们看看这个接口提供的函数,我们
可以找到Present函数,
其实不难猜到IDirect3DDevice9::Present函数内部就是调用了默认IDirect3DSwapChain9的Present函数。
进一步讲,IDirect3DDevice9中GetBackBuffer,GetFrontBufferData等函数都调用了IDirect3DSwapChain9的接口,所以一般有一个UINT iSwapChain参数来指示调用哪个
swap chain,0代表默认CreateDevice时创建的IDirect3DSwapChain9。
IDirect3DSwapChain9::GetBackBuffer |
Retrieves a back buffer from the swap chain of the device. |
IDirect3DSwapChain9::GetDevice |
Retrieves the device associated with the swap chain. |
IDirect3DSwapChain9::GetDisplayMode |
Retrieves the display mode's spatial resolution, color resolution, and refresh frequency. |
IDirect3DSwapChain9::GetFrontBufferData |
Generates a copy of the swapchain's front buffer and places that copy in a system memory buffer provided by the application. |
IDirect3DSwapChain9::GetPresentParameters |
Retrieves the presentation parameters associated with a swap chain. |
IDirect3DSwapChain9::GetRasterStatus |
Returns information describing the raster of the monitor on which the swap chain is presented. |
IDirect3DSwapChain9::Present |
Presents the contents of the next buffer in the sequence of back buffers owned by the swap chain. |
Front buffer
A graphics adapter holds a pointer to a surface that represents the image being displayed on the monitor, called a front buffer.其中的内容会直接发送给显示器显示,
其大小等于screen size,可以通过下面代码来获取。首先我们必须创建一个Cpu的IDirect3DSurface9,然后通过GetFrontBufferData填充其内容。如果直接绘制到Front buffer上,会使画面不连续
,撕裂(tearing)等等。当显示器(monitor)刷新时,显卡把front buffer的内容发送给显示器。一般的显示器刷新频率在60Hz到100Hz之间,这跟计算机其他部件的工作频率相差甚远。如果程序在显示器
刷新的过程中更新了front buffer,那么显示出来的上半部分画面是旧的,下半部分画面是新的,这就是撕裂(tearing).
D3DDISPLAYMODE dm;
g_pD3D->GetAdapterDisplayMode( D3DADAPTER_DEFAULT,&dm );
IDirect3DSurface9* pSurface;
g_pd3dDevice->CreateOffscreenPlainSurface( dm.Width, Height,
D3DFMT_A8R8G8B8, D3DPOOL_SCRATCH, &pSurface, NULL);
g_pd3dDevice->GetFrontBufferData(, pSurface);
D3DXSaveSurfaceToFile(
_T("Desktop.bmp"),D3DXIFF_BMP,pSurface, NULL, NULL );
pSurface->Release();
解决这个问题有两种方案:
1,只在垂直回扫(vertical retrace)时允许更新front buffer,在每一次刷新,显示器从上到下,从左到右的移动光头(light pin),一直到右下角为止。然后光头又移动回
显示器的
左上角(vertical retrace),为下一次刷新做准备。这样可以避免撕裂,但是垂直回扫(vertical retrace)时间往往不足以绘制复杂场景。 2, 后台缓存(back buffering) 。
Back buffering is the process of drawing a scene to an off-screen surface, called a back buffer. Note that any surface
other than the front buffer is called an off-screen surface because it is never directly viewed by the monitor. By using a back buffer, an application
has the freedom to render a scene whenever the system is idle (that is, no windows messages are waiting) without having to consider the monitor's refresh
rate. Back buffering brings in an additional complication of how and when to move the back buffer to the front buffer.解决方法是在垂直回扫(vertical retrace)
时把数据从back buffer移动到front buffer,两种移动方式,直接copy或者Flipping Surfaces,这可以通过D3DPRESENT_PARAMETERS的SwapEffect参数来指定。
swap chain- IDirect3DSwapChain9的更多相关文章
- 【D3D12学习手记】The Swap Chain and Page Flipping
为了避免动画中的闪烁,最好将整个动画帧绘制到称为后台缓冲区的屏幕外纹理(off-screen texture)中.一旦整个场景被绘制到给定动画帧的后缓冲区,它就作为一个完整的帧呈现给屏幕;以这种方式, ...
- DirectX 总结和DirectX 9.0 学习笔记
转自:http://www.cnblogs.com/graphics/archive/2009/11/25/1583682.html DirectX 总结 DDS DirectXDraw Surfac ...
- DirectX Graphics Infrastructure(DXGI):最佳范例 学习笔记
今天要学习的这篇文章写的算是比较早的了,大概在DX11时代就写好了,当时龙书11版看得很潦草,并没有注意这篇文章,现在看12,觉得是跳不过去的一篇文章,地址如下: https://msdn.micro ...
- DXGI 1.5新特性
为了支持更具弹性和的输出设定和副本机制,DXGI1.5添加了下面这些功能: 高动态范围(HDR)和宽色域(WCG) 可变刷新率显示 复制输出 奉献和再生资源 高动态范围(HDR)和宽色域(WCG) H ...
- Windows8.1画热度图 - 坑
想要的效果 如上是silverlight版本.原理是设定一个调色板,为256的渐变色(存在一个png文件中,宽度为256,高度为1),然后针对要处理的距离矩阵图形,取图片中每个像素的Alpha值作为索 ...
- Direct3D11学习:(二)基本绘图概念和基本类型
转载请注明出处:http://www.cnblogs.com/Ray1024 一.概述 在正式开始学习D3D11之前,我们必需首先学习必要的基础知识. 在这篇文章中,我们将介绍一下Direct3D ...
- D3D的内存类型
一.对D3D中AGP显存.内存.显存三种内存的解释 三种内存AGP内存(非本地显存),显存(本地内存),系统内存,其中我们都知道系统内存就是咱那内存条,那这AGP内存是个啥玩意啊?其实是因为在以前显卡 ...
- [百度空间] [转]关于Direct3D多窗口编程的一篇翻译
Introduction In DirectX 8, support for rendering to multiple windows is provided through the creatio ...
- 最简单的视音频播放示例3:Direct3D播放YUV,RGB(通过Surface)
上一篇文章记录了GDI播放视频的技术.打算接下来写两篇文章记录Direct3D(简称D3D)播放视频的技术.Direct3D应该Windows下最常用的播放视频的技术.实际上视频播放只是Direct3 ...
随机推荐
- 文档生产工具 Doxygen
Doxygen是一种开源跨平台的,类似JavaDoc风格描述的文档系统,支持C.C++.Java.Objective-C等语言.可以从一套归档源文件开始,生成HTML,XML,pdf等不同风格的格式. ...
- Servlet、Filter 生命周期
Servlet作为JavaEE必须掌握的内容,Struts2通过使用Filter的功能实现了一个MVC的框架.因此掌握这Servlet以及Filter的生命周期显得非常重要. 1. Servlet的生 ...
- RHEL6.3 ftp服务器参数的戏说——不看白不看,看了不白看
大家都知道ftp服务器的应用何止广,简直就是无处不在,配置简单的ftp服务谁都会,无外乎就是刚安装好ftp服务,一启动就ok了:或是达到简单的上传下载修改下/var/ftp/pub的权限,配合配置文件 ...
- ASP.Net MVC中JSON处理。
实体数据Model [Serializable] public class UserModel { //public UserModel(string name, string classname, ...
- C# winfrom中的布局 控件Anchor和Dock的区别
c#中的布局问题 http://hi.baidu.com/whzpower/item/57e3179cca21e1cab725317a
- unity3d 延迟处理方法
Invoke("方法名", 多少秒后执行); InvokeRepeating("方法名", 多少秒后执行,开始执行后隔多长时间再次执行一次); CancelIn ...
- Javacript 客户端保存数据[ locaStorage ]
1.通常程序员们会使用Cookie进行一些小量的数据储存在客户端浏览器,但孰不知这样会造成不必要的带宽浪费 ,可使用 js 中的 locaStorage 来替代cookie进行存储,但不支持IE8以下 ...
- VC++入门精通视频教程
1.1.Windows程序运行原理-1 上传日期:2012-03-19 09:18:50 相关摘要: - 在关闭一个windows窗口时,也关闭另一个吗 - 对纯面向对象的PHP程序有何看法? - ...
- 【postgresql】创建自增SEQUENCE
CREATE SEQUENCE circlefence_id_seq START WITH 1 INCREMENT BY 1 NO MINVALUE NO MAXVALUE CACHE 1; alte ...
- iOS的view翻转动画实现--代码老,供参考
新建一个view-based模板工程,在ViewController文件中添加下面的代码,即可实现翻转效果: - (void)viewDidLoad { [super viewDidLoad]; // ...