模型的表示

场景:物品或模型的集合

任何物品都可以用三角形网络逼近表示。我们经常用以下术语描述三角形网络:多边形(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. Nodejs调用Aras Innovator服务,处理AML并返回AML

    公司已经布署了Aras Innovator服务器,如果需要与Aras Innovator进行交互,需要进行自主开发程序,例如使用C#.VB.Java等,都是可以与它进行交互的 C#:调用Aras In ...

  2. JS—正则表达式

    正则表达式的元字符是包含特殊含义的字符,它们有一些特殊的功能,可以控制匹配模式的方式,反斜杠后的元字符失去其特殊含义. 单个字符和数字 .表示匹配除换行符外的单个字符,两个.就表示匹配两个字符 var ...

  3. Codeforces 180C. Letter

    题目链接:http://codeforces.com/problemset/problem/180/C 题意: 给你一个仅包含大写字母和小写字母的字符串,你可以将让小写字母转化为大写字母,大写字母转化 ...

  4. 线段树+Dfs序【p2982】[USACO10FEB]慢下来Slowing down

    Description 每天Farmer John的N头奶牛(1 <= N <= 100000,编号1-N)从粮仓走向他的自己的牧场.牧场构成了一棵树,粮仓在1号牧场.恰好有N-1条道路直 ...

  5. java应用高cpu占用

    一个应用占用CPU很高,除了确实是计算密集型应用之外,通常原因都是出现了死循环 排查故障如下: 1.根据top命令,发现PID为28555的Java进程占用CPU高达200%,出现故障 2.通过ps ...

  6. luogu P1095 守望者的逃离

    题目描述 恶魔猎手尤迪安野心勃勃,他背叛了暗夜精灵,率领深藏在海底的娜迦族企图叛变.守望者在与尤迪安的交锋中遭遇了围杀,被困在一个荒芜的大岛上.为了杀死守望者,尤迪安开始对这个荒岛施咒,这座岛很快就会 ...

  7. 【费马小定理】HDU4704-Sum

    #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #d ...

  8. 1.4(Spring MVC学习笔记)JSON数据交互与RESTful支持

    一.JSON数据交互 1.1JSON简介 JSON(JavaScript Object Notation)是一种数据交换格式. 1.2JSON对象结构 {}代表一个对象,{}中写入数据信息,通常为ke ...

  9. [Interview] 程序员如何制作一份漂亮的面试简历

    简历模板 *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; ...

  10. Entity Framework part1

    First Demo实体框架Entity Framework,简称EFEF是微软推出的基于Ado.Net的数据库访问技术,是一套ORM框架底层访问数据库的实质依然是ado.net是一套orm框架,即框 ...