【Visual C++】游戏开发笔记三十八 浅墨DirectX提高班之六 携手迈向三维世界 四大变换展身手

分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

               

 

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

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

作者:毛星云(浅墨)    邮箱: happylifemxy@163.com   

 

 

本篇文章里,我们首先对Direct3D中固定功能渲染流水线相关概念进行了深入的剖析,然后介绍了创建三维游戏世界的四大变换的概念和使用的方方面面,最后依旧是提供文章配套的详细注释的demo源代码的欣赏,并在文章末尾提供了源代码下载。

 

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

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

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

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



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

 

从本篇文章开始我们就来开始来学习固定渲染流水线这套渲染体系。

其实固定渲染流水线和之后我们要学习的可编程渲染流水线体系有很多异曲同工之妙,所以先学习固定功能渲染流水线体系,再学可编程渲染流水线体系,就可以循序渐进,步步为营地掌握好DirectX。

 

空间中的物体需要使用三维坐标来描述,而我们的显示器是显然是二维的,所以在屏幕上渲染一个三维场景时,首先需要将物体描述空间物体的三维坐标变换为二维坐标(也就是世界坐标到屏幕坐标),这在Direct3D中称为顶点坐标变换。顶点坐标变换通常通过矩阵来完成。我们之前的几个demo中,演示的是如何显示一个二维的平面图形,它的顶点是以屏幕坐标系的二维值表示的,也是经过顶点坐标变换之后的顶点坐标数据,可以把顶点坐标变换想象成摄像的过程,三维世界的景物通过摄像机拍摄显示在二维的相片之上,有所不同的是把相片换成了屏幕。

文章开头,我们先来看一下固定功能渲染流水线这套渲染体系的核心思想。

 

 

一、固定功能渲染流水线概述

 

在固定功能渲染流水线这套体系中,大体分为两个阶段,第一阶段我们将它称为坐标变换和光照处理阶段(Transforming &Lighting,简称T&L阶段)。在这个阶段中,每个对象的顶点从一个抽象的、浮点坐标变换到基于像素的屏幕空间当中。这里需要注意的是,坐标变换不仅包含物体顶点位置,它还可能包括顶点的法线、纹理坐标等等。并根据场景中光源和物体表面的材质对物体顶点应用不同类型的光照效果。还有其他一些比较重要的任务,比如视口的设置和裁剪也是在第一阶段进行的。讲完第一阶段,我们再来看看第二阶段,第二阶段称为光栅化处理阶段。顶点在经过第一阶段也就是变换与光照阶段的“洗礼”之后,已经略有雏形,在第二阶段,Direct3D将这些已经完成变换和光照阶段的顶点组织为以点、线、面为基础的图元,应用纹理贴图和物体顶点的颜色属性,并根据相关渲染状态的设置(比如着色模式等)

,决定每个像素最终的颜色值,并且在屏幕上显示出来。为了大家更宏观和更深入的理解,浅墨依然是配了一幅图。通过这幅图,大家可以对固定功能渲染流水线的结构脉络做到一目了然。

 

需要注意的是,渲染流水线中的步骤并不一定都要有的,根据实际情况可以省略一些。比如之前我们给出的几个demo,都是省略了变换和光照阶段,直接将顶点作为屏幕坐标输出显示。因为我们在定义顶点的属性的时候,给我们的顶点定的“标签”是D3DFVF_XYZRHW,表示包含经过坐标变换的顶点坐标值,这样Direct3D就知道这些顶点坐标不需要再经过顶点坐标变换了,他们的坐标值就是最终显示屏幕上的坐标值了。

 

目前我们重点介绍坐标变换和光照处理阶段(Transforming &Lighting,简称T&L阶段),也就是T&L阶段。在这个过程中,未经过变换和光照的顶点从一端进入,在流水线内部这些顶点将完成几个连续的操作,这几个操作按顺序分别为世界变换,取景变换,光照处理,投影变换以及视口变换。经过这些处理之后的顶点从另一端出来,表示已经完成坐标变换和光照处理了。我们的应用程序是通过指定几个矩阵、视口以及所使用的光线来建立T&L流水线的,然后应用程序将顶点送入流水线,并对这些顶点在流水线中进行坐标变换、照明以及裁剪,将其投影到屏幕空间当中,并根据视口的规定对其进行缩放。顶点在T&L流水线中进过“涅槃”之后,就可以去到第二阶段——光栅化处理阶段去完成新的试炼了。

关于变换和光照渲染流水线阶段,也就是T&L阶段,浅墨也配了一幅图,方便大家的记忆与理解:

 

 

 

 

 

 

二、携手迈向三维世界:四大变换显身手

 

 

首先来讲讲周边的概念。

在Direct3D中,如果我们未进行任何空间坐标变换而来绘制图形的话,图形将始终处于应用程序窗口的中心位置,在默认情况下这个位置就会成为世界坐标系的原点(0,0,0)。另外,我们也不能改变观察图形的视角方向。默认情况下的观察方向是世界坐标系的z轴正方向,也就是垂直程序窗口并向里观察的方向。之前我们的几个demo都是默认的z轴正方向为观察方向的。

而为了迈向三维世界,为了能够随心所欲地在三维世界中绘制和观察游戏画面,就是四大变换的show time了。

所谓四大变换,其实是浅墨自己在学习Direct3D的时候自己归纳的一个东西- -,也就是世界变换,取景变换,投影变换和视口变换的总称。

 

下面我们先来大致概括一下这四大变换的用途。

 

1.     为了能在世界空间中的指定位置来绘制图形,就需要在绘制图形前进行四大变换之一的世界变换运算。

2.     为了以不同的视角观察图形,就需要用到四大变换之二的取景变换运算。

3.     为了将相对较远的图形投影到同一个平面上并体现出“近大远小”的真实视觉效果,就需要用到四大变换之三的投影变换。

4.     为了控制显示图形的窗口的大小,比例以及深度等等信息,就要用到四大变换之四的视口变换。

 

 

 

下面我们就开始分别展开讲解这四大变换的细节知识。在讲解之前,有必要先跟大家说明一下。这里的四大变换的前三都是以矩阵作为载体的。这四大变换相关知识中或多或少会涉及到矩阵、向量,平面和射线等相关的数学知识,这些数学知识浅墨不准备专门花篇幅讲,因为讲起来都是概念,漫无目的,而且篇幅很长或许会花费几次更新的时间,况且写出来的东西肯定没新意而且没劲,所以没有写出来的必要。如果去学习Direct3D这款API的话,大可不必去纠结那么多数学概念。对矩阵和向量稍微有些了解就足够了,余下的高中数学(高中数学中没有矩阵相关的知识,所以矩阵相关概念需要另外学习)完全可以对付。如果实际过程中有不理解的地方再有的放矢地去查书和资料,这样学习起来会轻松很多,学习效率也会高得多。关于这方面数学知识的查阅资料,可以参看Direct3D 9龙书《Direct3D 9.0 3D游戏开发编程基础》的第一部分,Frank Luna已经为我们讲解得非常到位了。

好了,下面就开始依次讲解吧。

 

 

Ⅰ.四大变换之一:世界变换

 

根据物体模型的大小、方向以及其他模型之间的相对关系,世界变换将物体模型从自身的局部坐标系中转换到时间坐标系中,并将所有的物体模型组织为一个场景,如下图:

 

 

 

 

就像这个世界上有很多不同的个体,我们每个个体都有自己独特的局部坐标系,而我们每个个体仅仅是这个世界中的一份子而已。就像那句英文名言的前半句一样,to the world,you maybe one person。

 

世界变换包括平移、旋转和缩放变换,我们可以通过D3DX库中D3DXMatrixTranslation、D3DXMatrixRotation*和D3DXMatrixSaling函数来进行变换,并得到一个世界变换矩阵。

其中D3DXMatrixTranslation用于矩阵的平移操作,D3DXMatrixRotation*用于矩阵的旋转操作,D3DXMatrixSaling用于矩阵的缩放操作(稍后会分别介绍)。这三种变换是矩阵的最常用的变换。

 

调用这些函数将我们矩阵调整好之后,接着我们就调用IDirect3DDevice9接口的SetTransform方法来运用世界变换矩阵,表示认定某某矩阵就是我们的世界变换矩阵了。

我们可以在DirectX SDK中查到SetTransform方法的原型如下:

 

HRESULT SetTransform(  [in]  D3DTRANSFORMSTATETYPE State,  [in]  const D3DMATRIX *pMatrix);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值