专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅
对象剔除是图形编程中一个重要的方面。渲染那些看不见的物体是十分耗时的。然而,就目前来说当务之急是优化剔除算法本身。因为通常剔除算法会消耗大量的处理时间。 传统的算法对于一般情况的处理已经提升得很快了也改进得足够多了,但还是留下了些许遗憾。一些算法剔除了太多的物体,而另一些剔除的数量却不够多。遮盖剔除的原理告诉我们一个事实,那就是一个物体即便在视锥内,仍有可能被遮住而看不见。这里,如图1.1所示,有五个多边形被显示在屏幕上。然而,在最后的渲染结果中(如图1.2所示),实际只有三个物体可以看得见。简单的视锥剔除算法会导致所有的物体都被渲染,原因是它们都在视锥内... [阅读全文] [PDF]
第十章 使用助手类(Using the Helper Classes)绘制直线  在第四章里我们就讨论过关于绘制直线的问题:使用基本图元里的line list或line strip绘制直线。但是这两种直线都不能改变宽度,也没有抗锯齿功能(除非整个场景都使用了抗锯齿)。  对于不同类型的应用程序来说,绘制直线可能是最普通常见的操作,也可能根本不需要绘制他们。无论如何,有一个方便的Line类能在任何时候满足我们的需要。为了展现绘制线条是多么方便,我们将快速写一个程序来随即绘制一些线条。创建一个新工程,为编写Dir... [阅读全文] [PDF]
Rendering to Surfaces  你是否玩过那种可以打开一个倒视镜的赛车游戏?或者可以在屏幕表面显示当前赛道的赛车游戏。这些效果都是通过把同一个场景(通常使用不同的摄像机)渲染为一个纹理来实现的。事实上,这虽然听起来很复杂,却相当容易实现。再从第五章的例子开始。首先自然先声明将用来渲染的纹理,添加代码:private Texture renderTexture = null;private Surface renderSurface = null;private&n... [阅读全文] [PDF]
第十一章 可编程渲染管道以及高级着色语言入门  至今为止,我们都在使用固定功能的管道(fixed-function pipeline)进行渲染。回到那段古老的日子(DirectX 8.0之前),这是唯一渲染物体的方法。固定功能的渲染管道本质上就是一系列用来控制如何渲染特定类型数据的规则以及行为。虽然在某些方面这已经够用了,但却限制了许多开发人员使用高级功能的能力。举个例子,使用固定功能的管道,灯光是根据每个顶点而不是每个象素来计算的。由于渲染管道是“固定”的,因此根本没欧办法来改变许多渲染选项,刚才说的灯光就是一个例子。  Dire... [阅读全文] [PDF]
使用可编程管道渲染Mesh  简单三角形例子唯一的特点就是:简单。你不可能只使用一个顶点程序和一个三角就完成一个游戏,因此,这一节我们将渲染整个mesh。删除文件里关于顶点和顶点缓冲的声明,添加mesh对象:private Mesh mesh = null;对于渲染mesh来说,有一个方便的地方就是在渲染时会自动设置vertex declaration。自然,删除所有处理顶点声明和顶点缓冲的代码。同时,更新InitializeGraphics创建mesh。创建了mesh和effect对象之后,添加代码:mesh&nb... [阅读全文] [PDF]
使用纹理资源  Managed DirectX中所有的纹理资源都继承于BaseTexture类,而BaseTexture类又是从Resource类继承而来的。下面列出了BaseTexture对象中的几个新方法。LevelCount   This read-only property specifies the number of levels this texture has. For example, a mipmapped&n... [阅读全文] [PDF]
第九章 使用其它Mesh类型简化Mesh(Simplifying Meshes)  我们花了大量的时间来学习扩展库中的基本Mesh类,但实际上,还有3种其它Mesh类型我们没有讨论过,在这一章中,我们就来看看这几个对象。我们已经知道如何通过使用Mesh类的Simplify方法创建一个简化过的mesh。通常情况下,使用简化mesh只是为了显示低细节的模型,但在任何场景中,都不可能为一个mesh储存太多版本,特别是其中的很多版本你可能根本不会用到。  SimplificationMesh方法可以用来压缩简化mesh的过程。但是,不能直接使用这个... [阅读全文] [PDF]
 现在运行程序,可以看到和原来一样的效果。显示了所有细节的模型不停旋转。现在来处理移动摄像机的键盘事件。这里的代码和之前simplification mesh例子里的很相似。先声明摄像机的位置变量以及每次移动的距离常量。private float cameraPos = 580.0f;private const int MoveAmount = 50;再次修改view transform以显示摄像机位置的更新。device.Transform.View =&nb... [阅读全文] [PDF]
第八章 理解资源(Understanding Resoruces)资源是在Direct3D中渲染复杂对象的重要部分。在这一章的学习中,我们将会讨论关于资源的一些高级特性,包括:  静态和动态的资源  Updating the buffers included in meshes  使用各种锁定标志。  使用不安全代码最优化性能。初识Resource类  Resource是一个很小的类,同时也是Direct3D中其他资源类的基类,因此,先把这个类所有方法及其用途列出来作为本章开始将是一个不错的主意。由于... [阅读全文] [PDF]
(接深入Managed DirectX9(十一))  现在可以正式添加代码来优化mesh了。我们希望同时保留原来的mesh(经过clean的那个)和简化之后的mesh,因此,首先田间一个变量保存简化之后的mesh。private Mesh simplifiedMesh = null;之后,添加创建简化过的mesh。在LoadMesh方法的最后,添加如下代码:simplifiedMesh = Mesh.Simplify(mesh,adj,null,1,MeshFlags.SimplifyVertex);... [阅读全文] [PDF]
更多渲染技术在讨论过了基础渲染方法之后,我们应该把注意力放到一些能提高性能,并且让场景看起来更好的渲染技术上来:渲染各种图元类型至今位置,我们只渲染过一种类型的图元,称为三角形集合。实际上,我们可以绘制很多种不同类型的图元,下边的列表描述了这些图原类型:PointList――这是一个自我描述的图元类型,它把数据作为一系列离散的点来绘制。不能使用这种类型绘制indexed primitives。LineList——把每一对点作为单独的直线来绘制。使用时至少需要有两个顶点。LineStrip——把顶点绘制为一条折线。至少需要两个顶点。TrangleLi... [阅读全文] [PDF]
定义Mesh  虽然有很多时候,你需要手动创建顶点和索引数据,但更普遍的情况是从外部的资源加载已有的顶点数据,比如从一个文件。通常我们使用.X文件来保存这些信息。在前一章里,代码的大部分都用来创建几何体了。对于简单的三角形和立方体来说这似乎是完全可行的,但设想假如用相同的方式来创建拥有上万个顶点的物体将,所花费的时间和努力都将是很可怕的。  幸运的是,Managed DirectX里有一个可以封装并且加载顶点和索引数据的对象,这就是Mesh。Mesh可以用来储存任何类型的图形数据,但主要用来封装复杂的模型。Mesh类同样也有一些用来提高渲染物体性能... [阅读全文] [PDF]
使用Managed DirectX编写游戏选择游戏  虽然很多关于3D游戏编程的高级主题还没有讨论,但我们已经有足够的背景知识来写一个简单游戏了。这一章,我们将使用至今学过的知识,再加上一点点新的东西来创建游戏。  真正开始写游戏之前,最好先拟一份计划。我们需要确定写什么类型的游戏,它将有哪些最基本的特性,等等。考虑到目前的技术限制,自然不能写太复杂的游戏。这将是一个简单的游戏。在MS-DOS环境下,曾经有一个叫做“Donkey”的游戏,玩家控制着车不能撞到路上的donkey。听起来足够简单吧,我们将创建一个三维版本,并且用普通的障碍物来代替don... [阅读全文] [PDF]
特别提示:  为什么需要使用时间呢?为了方便讨论,假设我们每一帧都把赛道移动相同的距离。也许在你的电脑上它运行的很完美,但在其他的系统上呢?找一台比你的系统配置低的系统运行看看吧,赛道看起来会运行的相当缓慢。同样换到配置较高的系统上,赛道又会移动的快很多。原因在于你的计算是基于帧速率(frame rate)。假设在你的系统上,每秒可以跑60帧,那么所有的计算过程都是依赖于这个静态的帧速率而来的。因此,在每秒可以跑40帧或80帧的系统中,自然会得到不同的计算结果。让你的程序在每一个系统下运行都得到同样的结果是我们的基本目标之一,因此无论如何都应该避免... [阅读全文] [PDF]
(接 Managed DirectX9 九)添加障碍物  恭喜,这就是你创建的第一个3D互动程序了。已经完成了模拟赛车的移动。虽然实际上是赛道在移动,但显出的效果确实是赛车在移动。至此,游戏已经完成大半。接下来是添加障碍物的时候了。与添加Car类一样,添加一个名为Obstacle的类。我们将使用不同颜色形状的mesh作为障碍物。通过mesh类创建stock对象可以改变mesh的类型,同时,使用材质来改变障碍物的颜色。添加如下的变量和常量:{详见源码}  第一个常量表示将会有5种不同类型的mesh(球体、立方体、圆环、圆柱以及茶壶)。... [阅读全文] [PDF]
Using Advanced Mesh Features这一章,我们将要调论一些关于Mesh对象的高级特性,包括:    优化(Optimizing)mesh数据    简化(Simplifying)mesh    使用新的顶点数据元素创建mesh    连接(Welding)顶点克隆Mesh数据  终于,你可以在场景里加载并渲染mesh了。虽然场景里只有少量的灯光,而且mesh看起来基本是黑的。观察一下mesh的属性,注意到顶点格式并没有包含计算光照必须的法线数据。我们需要一个简单的方法为现有的顶点数据添加法线信息。如果你猜想Di... [阅读全文] [PDF]
使用简单的渲染技术  至今为止,我们的渲染工作效率都很低。每次渲染场景时,都要分配新的顶点列表,并且所有东西存储在系统内存里。现代显卡集成了足够的显存,把顶点数据存放在显存可以获得大幅的新能提升:存放在系统内存里的数据,渲染每一帧时都要拷贝到显卡,这会带来极大的损失。只有移除每帧时的这种分配才能帮助我们提高性能。使用顶点缓冲(Using Vertex Buffers)  Direct3D已经包含了这种机制:顶点缓冲(vertex buffer)。顶点缓冲,就像他名字的意思一样:一块储存顶点的内存。顶点缓冲的机动性能完美实现共享场景里... [阅读全文] [PDF]
三维化三角形  再来看看我们的程序,看起来并不是那么“三维”。而且我们所做的都能用GDI+轻易完成。So,我们应该怎样在3维空间里绘图,并且给人留下深刻的印象呢?实际上,简单的修改就能达到这样的效果。  如果你还记得,先前在我们创建第一个三角形的时候,我们使用了一个叫做“经过变换的”(transformed)坐标系统。这种坐标是显示器的屏幕区所使用的坐标,也是最容易定义的。如果我们使用未变换过的坐标系统会怎样呢?实际上,未变换过的坐标系统被广泛的用于现代游戏场景。  与屏幕坐标(screem space)相比我们定义这些坐标时,还应在世界坐标(wo... [阅读全文] [PDF]
拖放窗口时自动重置Device  任何曾经使用C++或VB开发DirectX3D的人都知道,在改变窗口大小时,需要重新设置devicd,否则,DirectX3D会按原来的分辨率继续渲染场景,并且把结果拷贝到(通过拉伸)新的窗口。当通过Windows Form控件创建device时,聪明的Mamaged DirectX能发现你改变了窗口的大小,并且重置device。毫无疑问,程序总是能在正常的行为下运行,同时,你也能方便的自己重置device。在自动重置device之前,会引发一个叫做DeviceResizing的事件。捕获这个事件,把Eve... [阅读全文] [PDF]
选择正确的Device  The number of possible permutations when cretion a device is quite staggering. 如今,市场里有大量不同类型的显示卡,记住每种显卡所支持的特性几乎时不可能的。你应该询问device,让它告诉你它所支持的特性。我们接下来将讨论:  枚举系统里所有的适配器(adapter)  枚举每一个device所支持的格式  确定所列举的设备功能枚举系统里的适配器  如今的大多... [阅读全文] [PDF]
1 2 > 共24条 分2页