【Visual C++】游戏开发笔记三十四 浅墨DirectX提高班之三 起承转合的艺术:Direct3D渲染五步曲

 

本系列文章由zhmxy555(毛星云)编写,转载请注明出处。  

文章链接: http://blog.csdn.net/zhmxy555/article/details/8223965

作者:毛星云(浅墨)    邮箱: [email protected]    

 

 

------------------------------------------------------------------------------------------------------------------------------

浅墨历时一年为游戏编程爱好者锻造的著作《逐梦旅程:Windows游戏编程之从零开始》

如果你喜欢浅墨写的【Visual C++】游戏开发系列博客文章,那么你一定会爱上这本书。

这是浅墨专门为热爱游戏编程的朋友们写的入门级游戏编程宝典。



------------------------------------------------------------------------------------------------------------------------------

这篇文章里,我们将迈出精通Direct3D的坚实步伐,先透彻理解Direct3D中动画显示方面的交换链技术的原理,然后看看GDI与Direct3D编程习惯的一些思想上的关联,接着简单学习Direct3D中二维文本的绘制方法,然后按照“五步曲”的思路,系统地学习Direct3D绘制的套路,且文章最后进行了相关源代码的赏析以及源代码的下载。看完这篇文章,也许你会豁然开朗,哦,原来Direct3D交换链技术可以这样来理解,原来Direct3D和GDI的编程套路其实差不多,原来Direct3D的绘制渲染过程是这样的按部就班,容易掌握。 需要说明的是,渲染过程暂时不考虑光照,矩阵变换等等,因为这是后面专门来展开细讲的内容。

 

 

由于文章比较长,浅墨依然在这里给大家配一个目录。这篇文章大体分为以下六个部分:

 

 

一、深入理解Direct3D动画显示技术——交换链:六道轮回

二、Direct3D中的“绘制金钥匙”——Direct3D设备接口

三、Direct3D中二维文本的绘制

四、起承转合的艺术——Direct3D渲染五步曲

Ⅰ.Direct3D渲染五步曲概述

Ⅱ. Direct3D渲染五步曲之一:清屏操作

Ⅲ.Direct3D渲染五步曲之二:开始绘制

Ⅳ. Direct3D渲染五步曲之三:正式绘制

Ⅴ. Direct3D渲染五步曲之四:结束绘制 

Ⅵ. Direct3D渲染五步曲之五:翻转显示

Ⅶ.Direct3D渲染五步曲代码整体赏析

五、获取每秒帧数(FPS)函数的写法

六、详细注释的源代码欣赏

 

 

 

 

 

 

一、深入理解Direct3D动画显示技术——交换链:六道轮回

 

 

Direct3D的工作模式与电影的播放原理类似。当播放电影图像时,影片图像以每秒24帧的速度连续地闪动,由于这些图像之间的差别很小,以及人眼的滞留作用,所以实际看到的就好像是连续的动作画面。

Direct3D中,使用了一种称作交换链(Pape Flipping)的技术,来让画面能够平滑的过渡。交换链由两个或者两个以上的表面组成,而每个表面都是存储着2D图形的一个线性数组,其中每个元素都表示着屏幕上的一个像素。

刚刚我们讲到的只是2D图形,而对于三维物体呢,我们还需要一个称作深度的信息,Direct3D则使用深度缓冲区为最终绘制的图像的每个像素都存储一个深度信息,深度缓冲区只单单包含了特定像素的深度信息而不含图像数据的表面信息(表面信息上面讲过,由表面信息来存储,就是一个存储着2D图形的线性数组)。

前台缓冲区和后台缓冲区是位于系统内存或显存里的内存块,对应于将要显示的二维显示区域。前台缓冲区是显示在显示屏上的,我们可以看到的内容。而后台缓冲区则主要用于图形绘制的准备工作,属于我们熟知的“幕后”(想要上演一出完美而杰出的表演,幕后准备工作肯定是要准备充分的)。这样我们的图像在经过在后台缓冲区中的打理后,变得光鲜和毫无瑕疵,在后台缓冲区打理完成后,也就是后台缓冲区中的内容准备好之后,就可以和前台缓冲区进行一个交换操作,这就是我们所说的交换链页面翻转。通过前台缓冲区和后台缓冲区的配合,运用交换链技术,就可以流畅而高效地绘制出漂亮无瑕的动画图像来。

下面我们通过一幅图来具体看看这神奇的交换链翻转操作到底是怎样完成的:

 

 

对这幅多后台缓冲区编码翻转演示图,我们可以这样理解:

在Direct3D中,通常是通过在一系列后台缓冲区中生成动画帧(也就是一幅图像),然后再将他们通过交换链技术,逐个提交到前台来显示,实现华丽的动画效果。其中,这一系列的后台缓冲区被组织成交换链。所以我们可以这样说,交换就链是按顺序逐个提交到前台来显示的多个后台缓冲区的集合。

在Direct3D中创建的每一个渲染设备至少要有一个交换链,在我们的Direct3D初始化四步曲中的第三步里面,我们填充了D3DPRESENT_PARAMETERS结构体,其中我们设置的BackBufferCount            成员会告诉Direct3D我们创建的Direct3D设备对象的交换链中,有多少个后台缓冲区,图中我们就有两个后台缓冲区,就是这段代码:

 


  • 73
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 51
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 51
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值