模型的表示

场景:物品或模型的集合

任何物品都可以用三角形网络逼近表示。我们经常用以下术语描述三角形网络:多边形(polygons)、图元(primitives)、网络几何单元(mesh geometry)。

描述三角形:指定三个顶点

描述物品:三角形单元列表

顶点格式

可以创建我们所希望包含的顶点信息,如位置,颜色等,如下所示

Code Snippet
  1. struct ColorVertex{
  2.     float _x,_y,_z;
  3.     DWORD color;
  4. };
  5. struct NormalTexVertex{
  6.     float _x,_y,_z;
  7.     float _nx,_ny,_nz;
  8.     float _u,_v;
  9. };

顶点结构定义好之后,就需要用灵活顶点格式(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) 上,可以如下实现

Code Snippet
  1. D3DMATRIX cubeWorldMatrix;
  2. D3DXMatrixTranslation(&cubeWorldMatrix,-3.0f,2.0f,6.0f);
  3. D3DXMATRIX sphereWorldMatrix;
  4. D3DXMatrixTranslation(&sphereWorldMatrix,5,0f,0.0f,-2.0f);
  5. //set the cub's transformation
  6. Device->SetTransform(D3DTS_WORLD,&cubeWorldMatrix);
  7. drawCube();
  8. Device->SetTransform(D3DTS_WORLD,&sphereWorldMatrix);
  9. drawSphere();

观察坐标系

为简化运算将摄像机变换至至世界坐标系原点,并使其光阵与z轴同向。同时空间中的所有几何体都随着摄像机一同进行变换,以保证摄像机视场恒定  。这种变换称为取景变换。我们称变换后的几何体位于观察坐标系中。

取景变换矩阵可以用如下函数得到

 

假如摄像机们于(5,3,10),其观察点为世界坐标系原点。我们可以这样创建取景变换矩阵

Code Snippet
  1. D3DXVECTOR3 position(5.0f,3.0f,-10.0f);
  2. D3DXVECTOR3 targetPoint(0.0f,0.0f,0.0f);
  3. D3DXVECTOR3 worldUp(0.0f,1.0f,0.0f);
  4. D3DXMATRIX V;
  5. 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游戏开发编程基础》 第二章 绘制流水线 读书笔记的更多相关文章

  1. 【笔记】《DirectX 9.0 3D游戏开发编程基础》:Direct3D初始化

    Direct3D初始化大概分为4个步骤: 1.获取接口IDirect3D9的指针.(Direct3DCreate9函数调用). 该接口用户获取系统中物理硬件设备的信息并创建接口IDirect3DDev ...

  2. 《DirectX 9.0 3D游戏开发编程基础》必备的数学知识 读书笔记

    最近在看游戏导航源码,但是看了几天感觉看不懂.里面全是一些几何运算,以及一些关于3d方面的知识.发现自己缺少3d这方面的知识,正好也想研究一下3d游戏开发的基本原理,于是决定买本书看看了,后来在ope ...

  3. 《DirectX 9.0 3D游戏开发编程基础》 第一章 初始化Direct3D 读书笔记

    REF设备 参考光栅设备,他能以软件计算方式完全支持Direct3D Api.借助Ref设备,可以在代码中使用那些不为当前硬件所支持的特性,并对这此特性进行测试. D3DDEVTYPE 在程序代码中, ...

  4. DirectX12 3D 游戏开发与实战第二章内容

    矩阵代数 学习目标 理解矩阵及其相关运算的定义 探究为何能把向量和矩阵的乘法视为一种线性组合 学习单位矩阵.转置矩阵.行列式以及矩阵的逆等概念 逐步熟悉DirectXMath库中提供的关于矩阵计算的类 ...

  5. DirectX12 3D 游戏开发与实战第九章内容(上)

    仅供个人学习使用,请勿转载. 9.纹理贴图 学习目标: 学习如何将局部纹理映射到网格三角形上 探究如何创建和启用纹理 学会如何通过纹理过滤来创建更加平滑的图像 探索如何使用寻址模式来进行多次纹理贴图 ...

  6. 自己在完第一遍STL和Directx 9.0 游戏开发编程基础书后的体会

    如果一本书看一遍就能看懂,说明书对自己相对容易,没有必要在去看第二遍,但是对于大多数书籍,都有自己陌生的知识,看完一遍无法理解的地方,说明就是自己知识点最薄弱的,最需要去理解的地方,一旦自己理解了这些 ...

  7. DirectX12 3D 游戏开发与实战第一章内容

    DirectX12 3D 第一章内容 学习目标 1.学习向量在几何学和数学中的表示方法 2.了解向量的运算定义以及它在几何学中的应用 3.熟悉DirectXMath库中与向量有关的类和方法 1.1 向 ...

  8. DirectX12 3D 游戏开发与实战第九章内容(下)

    仅供个人学习使用,请勿转载.谢谢! 9.纹理贴图 学习目标 学习如何将局部纹理映射到网格三角形中 探究如何创建和启用纹理 学会如何通过纹理过滤来创建更加平滑的图像 探索如何使用寻址模式来进行多次贴图 ...

  9. 【0】python核心编程,第二章

    1.print语句也支持将输入重定向到文件,示例: logfile = open('/tmp/mylog.txt', 'a') print >> logfile, 'Fatal error ...

随机推荐

  1. Nvidia 的新显卡架构 Maxwell 性能相比开普勒提升了多少?

    作者:喵西和熊链接:https://www.zhihu.com/question/22630075/answer/29041618来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注 ...

  2. NOIP2018提高组模拟题(五)

    字符串(string) Description 小林与亮亮正在做一个游戏.小林随意地写出一个字符串,字符串只由大写 字母组成,然后指定一个非负整数 m,亮亮可以进行至多 m 次操作,每次操作 为交换相 ...

  3. RabbitMQ (二) 简单队列

    参考:https://blog.csdn.net/vbirdbest/article/details/78583480 简单队列的模型: P : 生产者,即 Producer C : 消费者,即 Co ...

  4. [Codeforces 23D] Tetragon

    Brief Intro: 给3条相同长度的边的中点,问是否存在一个严格凸四边形 Algorithm: 明显只要求出一个点就能利用对称性算出其他点的坐标 设中点K,L,M分别在边AB,BC,CD上,易知 ...

  5. 【kruscal】【最小生成树】poj2421 Constructing Roads

    SB题,求最小生成树,其中有些边已经给您建好啦. 随意暴力即可. #include<cstdio> #include<algorithm> #include<cstrin ...

  6. 微服务之SpringCloud实战(一):SpringCloud简介

    什么是微服务架构 微服务架构就是系统架构设计的一种风格,它主旨将一个独立的系统,拆分成各个微服务,各个微服务独立运行,他们之间通过Http的Restful API进行通信,拆分出来的微服务是根据原系统 ...

  7. DataSnap Session expired处理。

    测试环境:RAD 10.2.3 建立DataSet Server服务端连接oracle数据库. 1.客户端用FDConnection连接服务端,协议为TCP/IP时,当服务端重启,不用再重启客户端. ...

  8. Android 架构 1.架构

    项目分为了四个层级:模型层.接口层.核心层.界面层.模型层定义了所有的模型:接口层封装了服务器提供的API:核心层处理所有业务逻辑:界面层就处理界面的展示.几个层级之间的关系如下图所示: 层级关系:模 ...

  9. Maven设置snapshot无法在远程仓库下载的问题解决

    检查步骤如下: 1.检查nexus是否纳入public版本中: 2.配置中是否启用snapshots功能.以下方法两种设置都可以,任选一个即可. 一种是在项目pom.xml使用: <reposi ...

  10. IntelliJ IDEA控制台输出中文乱码问题解决

    如果还不行,那么再极端的设置,在IDEA启动的时候强制设置为UTF-8: 打开增加-Dfile.encoding=UTF-8,重启Intellij IDEA 再或者直接在项目运行的时候加入UTF-8的 ...