《DirectX 9.0 3D游戏开发编程基础》 第二章 绘制流水线 读书笔记

模型的表示

场景:物品或模型的集合

任何物品都可以用三角形网络逼近表示。我们经常用以下术语描述三角形网络:多边形(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) //包含了位置、法线、纹理坐标。

灵活顶点格式约定:标记指定顺序与顶点结构中相应类型数据保持一致

三角形单元

三角形单元包含了我们所希望绘制的每个独立三角形的数据。如下图所示产,并指定每个三角形单元的顶点。

image

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表示。为了实现这一目标实施的一系列去算统称为绘制流水线

image

DirectX坐标变换:IDirect3DDevice9->SetTransform(变换类型,变换矩阵)。例如为了实现自局部坐标系到世界坐标系的变换,我们可以这样写

Device->SetTransform(D3DTS_WORD, & worldMatrix)

局部坐标系:、

定义:用于定义构成物品三角形列表的坐标系。如下图是在自身坐标系中定义的茶壶

image

世界坐标系

位于局部坐标系中的物品通过一个称为世界变换的去算过程到世界坐标系。通常包括平移、旋转等。

假如我们想让一个立方体位于世界坐标系中的点(-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.  
  6. //set the cub's transformation
  7. Device->SetTransform(D3DTS_WORLD,&cubeWorldMatrix);
  8. drawCube();
  9.  
  10. Device->SetTransform(D3DTS_WORLD,&sphereWorldMatrix);
  11. drawSphere();
观察坐标系

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

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

image

 

假如摄像机们于(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 默认值。

光照
裁剪

image

投影

观察坐标系中我们的任务是获取3d场景的2d表示。从n维变为n-1维的过程称为投影。实现投影有多多种方式 ,我们只对其中一种感兴趣,即透视投影。透视投影会产生“透视缩短”的效果,即近大远小。我们将使用以下函数其功能是依据视域体的描述信息创建一个投影矩阵。

视口变换

定义:将顶点坐标从投影窗口投影窗口转换到屏幕的一个矩形区域中。

光栅化

为了绘制每一个三形单元 ,如何计算构成三角形单元的每个像素的颜色值。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/264805.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

西安周边旅游

http://www.51766.com/scenery5/listtravel.jsp?cust_idxabl http://travel.163.com/05/0517/13/1JV57K4J00061DQU.html http://www.tourq.cn/pro/scenery/scenery_more.php?bh1|24|317 http://www.tourq.cn/pro/scenery/scenery_intro.php?bhS06082914981&type1 http:/…

CocosCreator2.1.0渲染流程与shader

CocosCreator2.1.0版本正式支持导入3D模型 对于2.5D游戏的开发来说有着重要意义 自己此前在写捕鱼游戏时了解过自定义shader 并实现了4种不同的水波效果 但经过CocosCreator版本的不断升级 尤其是1.10和2.0两个版本 旧的渲染器被抛弃了 因此老的shader特效也全都不能用了 直到最…

《Linux多线程服务端编程——使用muduo C++网络库》读书笔记

第一章 线程安全的对象生命期管理 第二章 线程同步精要 第三章 多线程服务器的适用场合与常用编程模型 第四章 C多线程系统编程精要 1.(P84)11个常用的最基本Pthreads函数: 2个:线程的创建和等待结束(join)…

MVC之前的那点事儿系列(4):Http Pipeline详细分析(上)

文章内容 继续上一章节的内容,通过HttpApplicationFactory的GetApplicationInstance静态方法获取实例,然后执行该实例的BeginProcessRequest方法进行执行余下的Http Pipeline 操作,代码如下: // Get application instance IHttpH…

Java开发人员的十大戒律

对Java开发者来说,有许多的标准和最佳实践。本文列举了每一个开发人员必须遵从的十大基本法则;如果有了可以遵从的规则而不遵从,那么将导致的是十分悲惨的结局。1. 在你的代码里加入注释每个人都知道这点,但不知何故…

c++学习书籍推荐《Advanced C++》下载

百度云及其他网盘下载地址:点我 作者简介 James Coplien先在威斯康星大学获得电气与计算机工程学士学位,后又在该大学获得计算机科学硕士学位。他在贝尔实验室的软件产品研发部门工作,在这个部门从一开始就使用C程序设计语言。近年来致力于大…

Centos 编译安装nodejsexpress框架

一. 下载nodejs 版本 wget http://nodejs.org/dist/v0.10.28/node-v0.10.28.tar.gz 二. 编译安装 cp node-v0.10.28.tar.gz /usr/src/ cd /usr/src tar zxvf node-v0.10.28.tar.gz cd node-v0.10.28/ ./configuration --prefix/usr/local/node make&make install 设置环境变…

Spring Boot 2 实践记录之 条件装配

实验项目是想要使用多种数据库访问方式,比如 JPA 和 MyBatis。 项目的 Service 层业务逻辑相同,只是具体实现代码不同,自然是一组接口,两组实现类的架构比较合理。 不过这种模式却有一个问题,如果 Bean 是按实现类装配…

通过简易的前台代码实现无限二级域名转向(来自无忧 biyuan老矣)

只要空间支持泛域名解析&#xff0c;无须服务端脚本语言和DNS&#xff0c;通过前台代码便可实现无限二级域名的构造&#xff1a; <html> <head> <title>碧原网络免费二级域名</title> <head> </head> <body> <scrīp…

MySQL入门-3:安装与客户端工具

大纲1、安装 MySQL2、检索数据3、数据过滤一、安装环境CentOS-6.5-i386mysql 5.1.73为了方便&#xff0c;这里采用yum方式安装&#xff0c;对于学习实验环境完全没问题&#xff0c;注意下面的操作都以root身份操作。除非对MySQL需要定制化或者安装多个实例&#xff0c;建议使用…

实验吧-web-天下武功唯快不破(Python中byte和str的转换)

题目&#xff1a;看看响应头 打开网站&#xff0c;既然已经提示我们看响应头了&#xff0c;那我们就看看呗(习惯bp&#xff0c;也可直接F12查看) 可以看到&#xff0c;响应头部分有个FLAG&#xff0c;而且有提示&#xff1a;please post what you find with parameter:key 所以…

一个弹出页面的徐徐升起的js效果

<HTML><HEAD><title>提醒信息</title><base target"_blank"><SCRIPT language"JavaScript"> window.resizeTo(220,210); var windowW220 // wide var windowH210 // high var Yoffset0 // in pixels, ne…

我国域名***日均58起 高安全DNS防御系统建设刻不容缓

日前&#xff0c;国家互联网应急中心发布的《2013年中国互联网网络安全报告》显示&#xff0c;作为互联网运行的关键基础设施&#xff0c;我国域名系统面临安全漏洞和拒绝服务***等多种威胁&#xff0c;是影响网络稳定运行的薄弱环节。中心监测报告显示&#xff0c;2013年针对我…

P4592 [TJOI2018]异或 (可持久化Trie)

[题目链接] https://www.luogu.org/problemnew/show/P4592 题目描述 现在有一颗以\(1\)为根节点的由\(n\)个节点组成的树&#xff0c;树上每个节点上都有一个权值\(v_i\)。现在有\(Q\)次操作&#xff0c;操作如下&#xff1a; \(1\;x\;y&#xff1a;\)查询节点xx的子树中与\(y\…

xml与数据库略解

1.0 简介 本论文简要的探讨了XML和数据库之间的关系&#xff0c;同时列出一些可以使用数据库处理XML文档的软件。虽然这里不打算详尽地介绍这些软件&#xff0c;但是笔者希望它能够描述使用数据库处理XML文档中的主要部分。这里有点偏向与关系数据库&#xff0c;…

魔方阵

①问题描述 魔方阵是一个古老的智力问题&#xff0c;它要求在一个mm的矩阵中填入1&#xff5e;m2的数字&#xff08;m为奇数&#xff09;&#xff0c;使得每一行、每一列、每条对角线的累加和都相等&#xff0c;如图1所示。 15 8 1 24 17 16 14 7 5 23 22 20 13 6…

专题训练5总结

这个专题学习了两种算法 1.稳定婚姻匹配问题 2.最大团问题 稳定婚姻匹配问题&#xff1a; 1.Stable Match 关于信号站匹配 多了一个容量的权值 如果距离相同看容量大小 数据处理较麻烦&#xff01; 2.marriage 稳定婚姻匹配问题入门题 3.The Stable Marriage problem 和入门题…

CodeSmith实用技巧(八):生成的代码输出到文件中

在CodeSmith中&#xff0c;要把生成的代码文件输出到文件中&#xff0c;你需要在自己的模版中继承OutputFileCodeTemplate类。<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" /><% CodeTemplate Language"C#"TargetL…

python 3的33个保留字列表_python 33个保留字是什么意思

and 用于表达式运算&#xff0c;逻辑与操作as 用于类型转换assert 断言&#xff0c;用于判断变量或条件表达式的值是否为真break 中断循环语句的执行class 用于定义类continue 继续执行下一次循环def 用于定义函数或方法del 删除变量或者序列的值elif 条件语句 与if else 结合使…

SSH整合jar包下载

2019独角兽企业重金招聘Python工程师标准>>> http://blog.sina.com.cn/s/blog_8a3d83320100zhmp.html svn使用 spring 下载 http://maven.springframework.org/release/org/springframework/spring/4.0.5.RELEASE/ http://repo.spring.io/libs-release-local/org/sp…