《DirectX 9.0 3D游戏开发编程基础》 第二章 绘制流水线 读书笔记
模型的表示
场景:物品或模型的集合
任何物品都可以用三角形网络逼近表示。我们经常用以下术语描述三角形网络:多边形(polygons)、图元(primitives)、网络几何单元(mesh geometry)。
描述三角形:指定三个顶点
描述物品:三角形单元列表
顶点格式
可以创建我们所希望包含的顶点信息,如位置,颜色等,如下所示
- struct ColorVertex{
- float _x,_y,_z;
- DWORD color;
- };
- struct NormalTexVertex{
- float _x,_y,_z;
- float _nx,_ny,_nz;
- float _u,_v;
- };
顶点结构定义好之后,就需要用灵活顶点格式(FVF)标记组合来描述顶点的组织结构。如下所示
#define FVF_COLOR (D3DFVF_XYZ | DEDFVF_DIFFUSE) //包含了位置信息和漫反射信息
#define FVF_NORMAL_TEX (D3DFVF_XYZ | D3dFVF_NORMAL | D3DFVF_TEX1) //包含了位置、法线、纹理坐标。
灵活顶点格式约定:标记指定顺序与顶点结构中相应类型数据保持一致
三角形单元
三角形单元包含了我们所希望绘制的每个独立三角形的数据。如下图所示产,并指定每个三角形单元的顶点。

Vertex rect[6] = {v0,v1,v2,v0,v2,v3}
索引
原理:顶点列表包含了全部独立的顶点,索引包含了指向顶点列表的索引,这些索引规定了为构建三角形单元,各顶点应按何种方式来组织。上图中的例子可以这样创建
Vertex vertexList[4] = {v0,v1,v2,v3}
WORD indexList[6] = {0,1,2,0,2,3} //其中0,1,2 都上vertexlist的下标。
虚拟摄像机
那些位于视域体之外的物品是不可见的,在进一步处理时就应将其丢弃。丢弃这类数据运算过程称为裁剪。
绘制流水线
定义:建立了3d场景的几何描述,并设置好虚拟摄像机,我们下面的任务就是在显示器中建立该场景的2d表示。为了实现这一目标实施的一系列去算统称为绘制流水线

DirectX坐标变换:IDirect3DDevice9->SetTransform(变换类型,变换矩阵)。例如为了实现自局部坐标系到世界坐标系的变换,我们可以这样写
Device->SetTransform(D3DTS_WORD, & worldMatrix)
局部坐标系:、
定义:用于定义构成物品三角形列表的坐标系。如下图是在自身坐标系中定义的茶壶

世界坐标系
位于局部坐标系中的物品通过一个称为世界变换的去算过程到世界坐标系。通常包括平移、旋转等。
假如我们想让一个立方体位于世界坐标系中的点(-3,2,6)上,让一个球体位于(5,2,-1) 上,可以如下实现
- D3DMATRIX cubeWorldMatrix;
- D3DXMatrixTranslation(&cubeWorldMatrix,-3.0f,2.0f,6.0f);
- D3DXMATRIX sphereWorldMatrix;
- D3DXMatrixTranslation(&sphereWorldMatrix,5,0f,0.0f,-2.0f);
- //set the cub's transformation
- Device->SetTransform(D3DTS_WORLD,&cubeWorldMatrix);
- drawCube();
- Device->SetTransform(D3DTS_WORLD,&sphereWorldMatrix);
- drawSphere();
观察坐标系
为简化运算将摄像机变换至至世界坐标系原点,并使其光阵与z轴同向。同时空间中的所有几何体都随着摄像机一同进行变换,以保证摄像机视场恒定 。这种变换称为取景变换。我们称变换后的几何体位于观察坐标系中。
取景变换矩阵可以用如下函数得到

假如摄像机们于(5,3,10),其观察点为世界坐标系原点。我们可以这样创建取景变换矩阵
- D3DXVECTOR3 position(5.0f,3.0f,-10.0f);
- D3DXVECTOR3 targetPoint(0.0f,0.0f,0.0f);
- D3DXVECTOR3 worldUp(0.0f,1.0f,0.0f);
- D3DXMATRIX V;
- D3DXMatrixLookAtLH(&V,&position,&targetPoint,&worldUp);
取景变换需要用IDirect3DDevice9:: SetTransform来设定,其中用于变换的类参数需要指定为D3DTS_VIEW;
Device->SetTransform(D3DTS_VIEW,&V)
背面消隐
通俗来讲就是看不见物体的背面,我们将背面加以剔除,这称为背面消隐。
哪些是背面朝向:默认状态下Dirct3d认为顶点顺时针(观察坐标系中)的三角形单元是正面朝向的。顶点排列顺序为逆时针的是背面朝向的
如果某些原因导致背面消隐方式不能满足应用要求,我们可以修改绘制状态来达到目的
Devoce->SetRenderState(D3DRS_CULLMODE,Value)
其中 Value可取以下值:D3DCULL_NONE 完全禁用背面消隐。 D3DCULL_CW 只用顺时针绕序的三角形进行消隐。 D3DCULL_CCW 默认值。
光照
裁剪

投影
观察坐标系中我们的任务是获取3d场景的2d表示。从n维变为n-1维的过程称为投影。实现投影有多多种方式 ,我们只对其中一种感兴趣,即透视投影。透视投影会产生“透视缩短”的效果,即近大远小。我们将使用以下函数其功能是依据视域体的描述信息创建一个投影矩阵。
视口变换
定义:将顶点坐标从投影窗口投影窗口转换到屏幕的一个矩形区域中。
光栅化
为了绘制每一个三形单元 ,如何计算构成三角形单元的每个像素的颜色值。
《DirectX 9.0 3D游戏开发编程基础》 第二章 绘制流水线 读书笔记的更多相关文章
- 【笔记】《DirectX 9.0 3D游戏开发编程基础》:Direct3D初始化
Direct3D初始化大概分为4个步骤: 1.获取接口IDirect3D9的指针.(Direct3DCreate9函数调用). 该接口用户获取系统中物理硬件设备的信息并创建接口IDirect3DDev ...
- 《DirectX 9.0 3D游戏开发编程基础》必备的数学知识 读书笔记
最近在看游戏导航源码,但是看了几天感觉看不懂.里面全是一些几何运算,以及一些关于3d方面的知识.发现自己缺少3d这方面的知识,正好也想研究一下3d游戏开发的基本原理,于是决定买本书看看了,后来在ope ...
- 《DirectX 9.0 3D游戏开发编程基础》 第一章 初始化Direct3D 读书笔记
REF设备 参考光栅设备,他能以软件计算方式完全支持Direct3D Api.借助Ref设备,可以在代码中使用那些不为当前硬件所支持的特性,并对这此特性进行测试. D3DDEVTYPE 在程序代码中, ...
- DirectX12 3D 游戏开发与实战第二章内容
矩阵代数 学习目标 理解矩阵及其相关运算的定义 探究为何能把向量和矩阵的乘法视为一种线性组合 学习单位矩阵.转置矩阵.行列式以及矩阵的逆等概念 逐步熟悉DirectXMath库中提供的关于矩阵计算的类 ...
- DirectX12 3D 游戏开发与实战第九章内容(上)
仅供个人学习使用,请勿转载. 9.纹理贴图 学习目标: 学习如何将局部纹理映射到网格三角形上 探究如何创建和启用纹理 学会如何通过纹理过滤来创建更加平滑的图像 探索如何使用寻址模式来进行多次纹理贴图 ...
- 自己在完第一遍STL和Directx 9.0 游戏开发编程基础书后的体会
如果一本书看一遍就能看懂,说明书对自己相对容易,没有必要在去看第二遍,但是对于大多数书籍,都有自己陌生的知识,看完一遍无法理解的地方,说明就是自己知识点最薄弱的,最需要去理解的地方,一旦自己理解了这些 ...
- DirectX12 3D 游戏开发与实战第一章内容
DirectX12 3D 第一章内容 学习目标 1.学习向量在几何学和数学中的表示方法 2.了解向量的运算定义以及它在几何学中的应用 3.熟悉DirectXMath库中与向量有关的类和方法 1.1 向 ...
- DirectX12 3D 游戏开发与实战第九章内容(下)
仅供个人学习使用,请勿转载.谢谢! 9.纹理贴图 学习目标 学习如何将局部纹理映射到网格三角形中 探究如何创建和启用纹理 学会如何通过纹理过滤来创建更加平滑的图像 探索如何使用寻址模式来进行多次贴图 ...
- 【0】python核心编程,第二章
1.print语句也支持将输入重定向到文件,示例: logfile = open('/tmp/mylog.txt', 'a') print >> logfile, 'Fatal error ...
随机推荐
- 只用120行Java代码写一个自己的区块链-3挖矿算法
在本系列前两篇文章中,我们向大家展示了如何通过精炼的Java代码实现一个简单的区块链.包括生成块,验证块数据,广播通信等等,这一篇让我们聚焦在如何实现 PoW算法. 大家都无不惊呼比特币.以太坊及其他 ...
- mongodb复制集搭建
注:mongodb当前版本是3.4.3 1.准备三个虚拟机做服务器 192.168.168.129:27017 192.168.168.130:27017 192.168.168.131:27017 ...
- HDU 2102 A计划【三维BFS】
A计划 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submissio ...
- scrapy中Selector的使用
scrapy的Selector选择器其实也可以用来解析,今天主要总结下css和xpath的用法,其实我个人最喜欢用css 以慕课网嵩天老师教程中的一个网页为例,python123.io/ws/demo ...
- 【bzoj2763】[JLOI2011]飞行路线 (分层图最短路)(优先队列dij)
[bzoj2763][JLOI2011]飞行路线 2014年3月25日1,7260 Description Alice和Bob现在要乘飞机旅行,他们选择了一家相对便宜的航空公司.该航空公司一共在n个城 ...
- vijos P1234口袋的天空(Kruskal)(最小生成树)
P1234口袋的天空 小杉坐在教室里,透过口袋一样的窗户看口袋一样的天空. 有很多云飘在那里,看起来很漂亮,小杉想摘下那样美的几朵云,做成棉花糖. 描述 给你云朵的个数N,再给你M个关系,表示哪些云朵 ...
- [Baltic2003] Gem
[Baltic2003]Gem Time Limit: 2 Sec Memory Limit: 64 MBSubmit: 501 Solved: 320[Submit][Status][Discu ...
- python3开发进阶-Django框架的ORM常用字段和参数
阅读目录 常用字段 字段合集 自定义字段 字段参数 关系参数 多对多的关联关系的三种方式 一.常用字段 AutoField int自增列,必须填入参数 primary_key=True.当model中 ...
- Problem Y: 零起点学算法21——摄氏温度转换
#include<stdio.h> int main() { float f,c; while(scanf("%f",&f)!=EOF) c=*(f-); pr ...
- 【OpenJudge8464】【序列DP】股票买卖
股票买卖 总时间限制: 1000ms 内存限制: 65536kB [描述] 最近越来越多的人都投身股市,阿福也有点心动了.谨记着“股市有风险,入市需谨慎”,阿福决定先来研究一下简化版的股票买卖问题. ...