读书笔记《DirectX实时渲染技术详解》一
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
读书笔记《DirectX实时渲染技术详
解》一
前几个月真的是郁闷到极点,严重怀疑自己是不是更年期提早发作....为了阻止自已乱放毒电波和怨念,一直不敢乱写东东......其实也与某人懒有关啦还好新年期间被喜气冲了一下,虽然现状没什么改变,但是起码恢复了驼鸟的状态,继续过54着坏事的生活....我什么也不知道,烦事退散.....
下面是久违的读书笔记~~重庆大学出版社的《DirectX实时渲染技术详解》,Kelly Dempski著的,个人觉得写得还不错啦,前面的基础部分我这种
程度的人都能看懂,不过有点小厚,一本砖头,不容易啃啊,觉得结合dx的文档来看也是不错的,就是用的是dx8版,有点老,不过大概原理说通就行啦~~相应的练习还是要动手做做的,反正我比较笨,不试过的话记不住.....
doc版的话等把第一part渲染全部写完再上....
第1章:创建和管理Direct3D设备
1.1 什么是Direct3D设备
每个图形API都有一个维持绘图功能整体状态的实体。
如Windows GDI用的是DC,Java用的是Graphics对象,而DirectX用的就是IDirect3DDevice9(这个数字表版本)。
Direct3D设备管理并维护从分配纹理内存到变换矩阵再到混合状态的一切事情。
它有3种基本类型:
∙
∙
∙
1.2 如何使用Direct3D设备
∙
∙
∙
∙
∙
1.3 使用Direct3D设备进行渲染
∙
∙
∙
第2章:一切从顶点开始
2.1 什么是顶点
顶点可以被定义为空间中的点,作为渲染点、线和面的构造单元。
顶点格式定义了顶点的属性。
在DirectX中,可以改变该数据结构的格式以符合特定渲染任务的要求,称之为灵活顶点格式(Flexible Vertex Formats, FVFs)。
要注意,必段按DirectX定义的顺序来列出这些FVF标识。
2.2 创建顶点
∙
实际需要做的是创建顶点缓冲区,图形设备试图将缓冲区放入显存或者是加速图形接口的内存中,能确保显卡可以尽可能快地获得数据。
可以通过CreateVertexBuffer来创建顶点缓冲区。
∙
因为顶点缓存区可以存在于显存或存在于由设备管理的内存中,所以不能直接改变顶点数据的取值。
为了访问这些取值,必须调用Lock函数,它返回指向顶点的指针,可以用它改变顶点数据的值。
一旦设置了
顶点值,可以调用解锁函数Unlock函数,将新的数据返回给设备。
2.3 渲染顶点
∙
∙
∙
2.4 性能考虑
总原则:批处理就是一切。
总是在单次调用中将所做的工作最大化,而将迫使设备切换到新状态的次数最小化。
第3章:使用变换
3.1 变换意味着什么
在3D图形学中,利用世界变换来决定物体在场景中的位置,利用观察变换来决定相机的位置,利用设影变换来决定相机“镜头”的特性,用视口将信息
映射到实际的像素。
∙
世界矩阵最基本的用法是在一个虚拟空间中简单地移动一个预定义的物体,但是还有一个好处,可以很容易地利用它通过使用一个顶点缓
冲和几个不同的变换矩阵来绘制同一个物体的多个实例。
虽然硬件必须
多次变换顶点,但是使用一套几何体可以节约内存和显卡的带宽。
∙
鉴于世界变换定义了空间中物体的位置和取向,观察变换定义了在空间中的相机的位置和取向。
经过世界变换以后,被转换为世界坐标的
顶点,被称为经过观察变换后眼中坐标的顶点。
一旦一个物体在眼坐标
中,就可以知道在物体与观察者之间的基本几何关系。
换句话说,可以
使用世界变换在构建一个3D世界,使用观察变换在这个世界中移动相机。
∙
投影矩阵将虚拟相机的特性进行编码,这些属性创建了一个观察截头体,它是相机可观察的空间体积。
远平面和近平面定义了物体的可见
距离,太远或太近的物体不会被包括到最终的渲染中。
视野(FOV)角度定
义了观察的宽度和高度。
D3DX库中包含了创建投影矩阵的10个不同的
函数。
5种类型中的每一类都有左手系和右手系两个版本。
3.2 变换与3D设备
一旦具有变换矩阵,就可以通过SetTransform来设置变换,它的第一个参
数指定应该被设置的变换,有三种:D3DTS_PROJECTION,D3DTS_VIEW,
D3DTS_WORLD。
可以使用D3DX库中的ID3DXMatrixStack的帮助接口来实现一个
矩阵堆栈,从而管理一个复杂的变换。
3.3 视口
一旦三个变换步骤完成以后,设备仍需要决定数据最终是如何被映射到每个象素上的,这时要定义一个视口来帮助设备完成这项工作。
在正常情况下,视口由窗口模式应用中的窗口大小来定义,或者由全屏模式应用中的屏幕分辨率来定义,因此在很多时候并不需要明显地设置视口。
然而,DirectX允许程序员指定窗口的一部分作为视口,当在同一窗口中渲染多个场景时这样的指定是有用的。
视口用D3DVIEWPORT结构来定义,该结构定义了在窗口或屏幕之内视口的矩形部分,以及近Z平面和远Z平面。
可以用SetViewport来设置一个新的视口,此时,常常用GetViewport来保存旧视口的一个拷贝。
要注意的是,视口的维度比例应该符合投影矩阵的特征比例,如果不符合,物体看起来就会像压扁一样。