模型的表示

场景:物品或模型的集合

任何物品都可以用三角形网络逼近表示。我们经常用以下术语描述三角形网络:多边形(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. cogs 服务点设置

    3. 服务点设置 ☆   输入文件:djsa.in   输出文件:djsa.out   简单对比时间限制:1 s   内存限制:128 MB 问题描述为了进一步普及九年义务教育,政府要在某乡镇建立一所 ...

  2. ZOJ 2112 Dynamic Rankings (动态第 K 大)(树状数组套主席树)

    Dynamic Rankings Time Limit: 10 Seconds      Memory Limit: 32768 KB The Company Dynamic Rankings has ...

  3. 24、Django实战第24天:讲师列表页

    1.复制teracher-list.html到templates目录下 2.编辑teacher-list.html,继承base模板 3.编辑organization.views.py ... fro ...

  4. centos7 启用iptables

    在centos 7下启用iptables systemctl stop firewalld.service systemctl disable firewalld.service yum instal ...

  5. 闪迪U3利用工具U3-Pwn

    闪迪U3利用工具U3-Pwn   闪迪U3是闪迪公司为Sandisk Cruzer系列U盘提供的一个功能.该模块支持数据加密和CD启动功能.U3-Pwn就是针对U3的一个利用工具.渗透测试人员可以通过 ...

  6. [BZOJ 3157] 国王奇遇记

    Link: BZOJ 3157 传送门 Solution: 题意:求解$\sum_{i=1}^n m^i \cdot {i^m}$ $O(m^2)$做法: 定义一个函数$f[i]$,$f[i]=\su ...

  7. small test on 5.30 night T2

    (题面写错了,应该是一条从b -> a 的边) 让我们设状态 (a,b,c) 表示存在一个点k,使得  dist(k,b) - dist(k,a) * 2 + 3 = c,显然这里的第三维可以压 ...

  8. [UOJ300]吉夫特

    直接上lucas定理,可以得到$\binom nm=1$等价于$m$是$n$的子集(二进制) 因为数字两两不同,所以设$f_i$表示以$i$开头的满足要求的序列有多少个,转移就是$f_i\gets f ...

  9. [luogu3455]ZAP-Queries

    有时候我们会遇到一类问题:求$f(n)$,当然它是不好直接计算的,但如果$F(n)=\sum\limits_{d|n}f(d)$或$F(n)=\sum\limits_{\substack{n|d\\d ...

  10. Exercise03_12

    import java.util.Scanner; public class Palindrome { public static void main(String[] args){ int a; S ...