天行健 君子当自强而不息

■ DirectX 9 Program

网格模型高级技术
     摘要: 在三维图形程序设计中,网格模型占有非常重要的地位,而且也是比较复杂的部分,特别是包含动画和蒙皮信息的网格模型。

.x文件格式最初是为传统的Direct3D保留模式而设计的,在DirectX 6.0问世后,针对立即模式对它作过一次扩展。要想在Direct3D程序中灵活自如地使用网格模型,应当深入理解.x文件格式。   阅读全文

posted @ 2008-06-14 10:25 lovedday 阅读(6796) | 评论 (2)  编辑

高级纹理映射技术
     摘要: 纹理映射在三维图形程序设计中具有非常重要的作用,三维场景中的许多特殊效果都是通过纹理映射来实现的。例如通过纹理映射模拟复杂的光照效果,物体表面对周围环境的反射效果等。

Direct3D最多支持8层纹理,也就是说,在一个三维物体的表面可以同时拥有1~8张不同的纹理贴图。Direct3D能够在一个渲染过程中把这些纹理颜色依次混合,渲染到同一个物体的表面。每一个纹理层对应0~7的索引序号,多层纹理映射能够模拟更为真实的三维世界。   阅读全文

posted @ 2008-05-22 18:12 lovedday 阅读(6560) | 评论 (5)  编辑

Direct3D中的字体与文本显示
     摘要: 图形系统中为了获得当前运行程序的相关信息,往往需要在屏幕上显示文本,Direct3D的功能扩展接口ID3DXFont对此提供了方便的解决方法。

使用接口ID3DXFont绘制文本,首先需要通过函数D3DXCreateFont()创建ID3DXFont字体对象。ID3DXFont接口封装了 Windows字体和Direct3D设备指针,D3DXCreateFont()函数通过Windows字体和Direct3D设备指针创建 ID3DXFont对象。  阅读全文

posted @ 2008-05-11 20:50 lovedday 阅读(2205) | 评论 (0)  编辑

Direct3D中的雾化
     摘要: 雾化效果是计算机图形学中应用最广的效果之一,它不仅能显著地增加视觉效果的真实感,并可以提供一定的深度感。在实时图形程序,特别是游戏设计程序中,为了确保图形系统的运行速度,图形开发人员往往在位于观察点远处的场景使用较为简单的三维模型,甚至不绘制物体,而在近处使用复杂模型,这样就可能造成物体变形、突然出现或突然消失等失真现象,雾化效果可以有效地避免这种失真现象。  阅读全文

posted @ 2008-05-11 18:21 lovedday 阅读(1924) | 评论 (0)  编辑

深度测试与alpha混合
     摘要: 在绘制复杂的三维场景时,不可避免地会出现物体间的相互遮挡,在这种情况下,为了正确地绘制场景需要使用深度测试。半透明物体的绘制不同于不透明物体, Direct3D通过alpha混合实现半透明物体的绘制。深度测试可以简化复杂场景的绘制,alpha混合可以使绘制的三维场景更完整、更逼真。

在复杂的场景中,通常有多个物体需要绘制,这些物体之间通常会存在遮挡关系,离观察点较远的物体会因为近处物体的者的遮挡而不可见或只有部分可见,Direct3D图形系统提供了深度测试功能来实现这种效果。  阅读全文

posted @ 2008-05-10 17:02 lovedday 阅读(3942) | 评论 (0)  编辑

使用.x文件模型
     摘要: 利用.x文件模型渲染三维模型,首先需要将.x文件中的各种数据分别加载到内存中,主要包括顶点数据、材质数据和纹理数据等。

Direct3D扩展实用库定义了多边形网格模型接口ID3DXMesh来表示一个复杂的三维物体模型,它是一个COM接口,继承自ID3DXBaseMesh。

Direct3D扩展实用库函数D3DXCreateMesh()可用于创建一个Direct3D网格模型对象。  阅读全文

posted @ 2008-05-09 15:33 lovedday 阅读(2407) | 评论 (0)  编辑

纹理映射基础
     摘要: 为了使渲染的图形看起来更真实,Direct3D提供了在物体表面绘制纹理的功能。一般说来,纹理是表示物体表面细节的一幅或几幅二维图形,也称纹理贴图(texture)。当把纹理按照特定的方式映射到物体表面的时候,能使物体看上去更加真实。当前流行的图形系统中,纹理绘制已经成为一种必不可少的渲染方法。在理解纹理映射时,可以将纹理看作应用程序在物体表面的像素颜色。在真实世界中,纹理表示一个对象的颜色、图案以及触觉特征。但在Direct3D 中,纹理只表示对象表面的彩色图案,它不能改变对象的几何形式。更进一步说,它只是一种高强度计算行为。   阅读全文

posted @ 2008-05-07 18:08 lovedday 阅读(3714) | 评论 (0)  编辑

深入理解光照计算模型
     摘要: Ambient lighting provides constant lighting for a scene. It lights all object vertices the same because it is not dependent on any other lighting factors such as vertex normals, light direction, light position, range, or attenuation. It is the fastest type of lighting but it produces the least realistic results. Direct3D contains a single global ambient light property that you can use without creating any light. Alternatively, you can set any light object to provide ambient lighting.   阅读全文

posted @ 2008-05-05 11:44 lovedday 阅读(1403) | 评论 (0)  编辑

光照与材质
     摘要: 在三维图形程序中使用光照效果能够有效地增强场景的真实感。在Direct3D中,通过计算场景中的光线和物体表面材质反射光线颜色的数学交互,可使光线模型接近于真实世界的照明系统。

在真实世界中,光线在到达眼睛之前经过了物体表面的多次反射,每次反射时,物体表面都会吸收一些光,有些被随机反射扩散出去,其余的到达下一个物体的表面或眼睛。真实世界中光线反射的效果就是光线跟踪算法需要模拟实现的。尽管光线跟踪算法能够创建非常逼真的与自然界中观察到极为相似的景象,但是还没有实时程序能够完成这些运算。考虑到实时渲染的需要,Direct3D使用更简单的方法进行光照计算。Direct3D光照计算模型包括4种:环境光、漫反射光、镜面反射光和自发光。它们的结合能灵活高效地解决三维图形程序中的光照问题。  阅读全文

posted @ 2008-05-05 09:32 lovedday 阅读(1892) | 评论 (0)  编辑

顶点坐标变换
     摘要: 空间中的物体需要使用三维坐标来描述,而显示器是一个二维的表面,所以在屏幕上渲染一个三维场景时,首先需要将描述空间物体的三维坐标变换为二维坐标(世界坐标到屏幕坐标),这在Direct3D中称为顶点坐标变换。顶点坐标变换通常通过矩阵来完成。可以把顶点坐标变换想象成摄像过程,三维世界的景物通过摄像机的拍摄显示在二维的相片上,所不同的是把相片换成了屏幕。   阅读全文

posted @ 2008-05-02 14:08 lovedday 阅读(2707) | 评论 (6)  编辑

Direct3D中的颜色和资源
     摘要: 颜色在Direct3D中占据比较重要的位置,所有的操作无论是光照还是纹理贴图,其结果最终都归结到如何影响每个顶点或像素的颜色。

Direct3D资源是指用来渲染一个场景的纹理或缓冲区。应用程序需要创建、加载、复制、使用资源。Direct3D所有的资源,包括几何数据资源 IDirect3DIndexBuffer9、IDirect3DVertexBuffer9等,都继承于接口IDirect3DResource9。纹理资源IDirect3DCubeTexture9,IDirect3DTexture9和IDirect3DVolumeTextre9是从接口 IDirect3DResource9的子接口IDirect3DBaseTexture9中继承而来的。  阅读全文

posted @ 2008-05-01 17:16 lovedday 阅读(2785) | 评论 (2)  编辑

坐标系与基本图元
     摘要: 图元(primitives)是Direct3D中定义的基本图形表示,它是组成一个单一实体的一组顶点。最简单的图元是三维坐标系中多个点的集合,称为点列表(point list)。通常,图元是多边形(polygon),一个多边形是由至少三条边组成的封闭图形。最简单的多边形是三角形,Direct3D使用三角形来构成大多数其他多边形,这是因为三角形的三个顶点肯定是共面的,而渲染不共面的顶点效率比较低。通过组合三角形可以形成更大、更复杂的多边形和网格(mesh)。   阅读全文

posted @ 2008-05-01 16:16 lovedday 阅读(1505) | 评论 (0)  编辑

【ZT】D3DFVF_XYZ和D3DFVF_XYZRHW的区别

posted @ 2008-04-30 10:44 lovedday 阅读(5167) | 评论 (5)  编辑

Direct3D程序设计基础
     摘要: Microsoft Direct3D的一种实现方式是通过组件对象模型(Component Object Model, COM)及其接口实现的,在用C++语言和COM接口方式开发的程序中可以直接访问这些接口和对象。Direct3D对象是Direct3D程序中需要创建的第一个对象,也是需要最后一个释放的对象,这里所说的对象是指COM对象。通过Direct3D对象,可以枚举和检索Direct3D设备,这样应用程序就可以在不需要创建设备对象的前提下选择Direct3D渲染设备。  阅读全文

posted @ 2008-04-29 15:45 lovedday 阅读(1832) | 评论 (1)  编辑

【ZT】模拟实现ID3DXSkinInfo::UpdateSkinnedMesh
     摘要: FinalPos = MeshPos + ∑( Difference_i * Weight_i)

= MeshPos + ∑( (NewMeshPos_i - MeshPos) * Weight_i )

= MeshPos + ∑( (MeshPos × OffsetMatix_i × CombinedMatrix_i - MeshPos) * Weight_i ) [1]  阅读全文

posted @ 2008-04-22 15:22 lovedday 阅读(1023) | 评论 (0)  编辑

D3D中的拾取
     摘要: 假设用户点击了屏幕上的点 s (x, y)。 从图15.1我们能看到用户选取了茶壶。无论如何,应用程序无法根据给定的s点就立即确定茶壶是被选取。

我们知道一些知识:关于茶壶和它的关联点s,茶壶投影在围绕s点的区域,更准确的说是:它投影到投影窗口上围绕p点的区域,与它对应的屏幕点是s。因为这个问题依赖于3D物体与它的投影之间的关系,我们看图15.2就可以了解。  阅读全文

posted @ 2008-04-04 16:31 lovedday 阅读(5010) | 评论 (2)  编辑

D3D中的粒子系统
     摘要: 许多自然现象是由很多小的小颗粒组成的,它们有相似的行为。(例如,雪花落下,闪烁的火焰,冲出枪管的“子弹”),粒子系统用来模拟这种现象。

粒子是一个很小的对象,它通常用来模拟数学中的一个点。点元是用来显示粒子的很好的方案,可是点元被光栅化成一个简单的像素。这没给我们多少灵活性,因为我们想有各种大小不同的粒子,并且把整个纹理平滑映射到这些粒子上。在Direct3D 8.0以前,因为点元方法的局限性而完全不使用他们。代替的方法是程序员将使用公告板去显示粒子,一个板是一个方格,世界矩阵用它来确定方向,使它总是朝向照相机。   阅读全文

posted @ 2008-04-04 13:13 lovedday 阅读(2949) | 评论 (0)  编辑

D3D中的地形绘制基础
     摘要: 实际上,地形网格不比三角形网格复杂,图13.1.(a)所示,网络的每个顶点指定了高度,格子模型用这种方式显示从山脉到河流的平滑过渡。图13.1 (b),模拟自然地形。当然,我们可以用漂亮的纹理表现沙石地,绿色的山丘。图13.1.(c)雪山效果。   阅读全文

posted @ 2008-04-02 21:43 lovedday 阅读(3815) | 评论 (1)  编辑

设计一个灵活的Camera类
     摘要: 我们使用D3DXMatrixLookAtLH函数来计算视图空间变换矩阵。这个函数对于在固定位置布置和对准摄像机是非常好用的,不过它的用户接口对于要响应用户输入来实现摄像机移动就不那么好用了。这就激发我们用我们自己的方法来解决,这里我们展示了怎样实现一个Camera类,它使我们能够比 D3DXMatrixLookAtLH函数更好地操作摄像机,并且可以用来作为飞行模拟摄像机和第一人称视角摄像机。   阅读全文

posted @ 2008-03-30 15:19 lovedday 阅读(2099) | 评论 (0)  编辑

D3D中的网格模型
     摘要: ID3DXMesh接口的主要功能继承自ID3DXBaseMesh父接口,了解这些是很重要的,其它一些mesh接口如ID3DXPMesh也是继承自ID3DXBaseMesh。  阅读全文

posted @ 2008-03-29 19:23 lovedday 阅读(1624) | 评论 (0)  编辑

D3D中的字体绘制
     摘要: 在D3DX库中提供了一个ID3DXFont接口,它能被用于在Direct3D应用程序中绘制文字。  阅读全文

posted @ 2008-03-26 18:52 lovedday 阅读(1165) | 评论 (0)  编辑

D3D中的模板缓存
     摘要: 模板缓存是一个离屏缓存,我们能够用它来完成一些特效。模板缓存与后台缓存和深度缓存有相同的定义,因此在模板缓存中的像素与后台缓存和深度缓存中的像素是相协调的。就象名字所说,模板缓存就象一个模板它允许我们刷新渲染后缓存的某个部分。   阅读全文

posted @ 2008-03-25 12:28 lovedday 阅读(2000) | 评论 (0)  编辑

D3D中的Alpha融合技术
     摘要: 我们介绍一种叫做混合(blending)的技术,它允许我们混合像素,我们通常用已经光栅化的像素光栅化同一位置的像素。换句话说就是我们在图元上混合图元,这种技术允许我们完成多种特效。  阅读全文

posted @ 2008-03-18 14:57 lovedday 阅读(1660) | 评论 (1)  编辑

D3D中的纹理映射
     摘要: 纹理映射是一种允许我们为三角形赋予图象数据的技术;这让我们能够更细腻更真实地表现我们的场景。例如,我们能够创建一个立方体并且通过对它的每个面创建一个纹理来把它变成一个木箱(如图6.1)。

在Direct3D中一个纹理是通过IDirect3DTexture9接口来表现的,一个纹理是一个类似像素矩阵的表面它能够被映射到三角形上。  阅读全文

posted @ 2008-03-17 17:50 lovedday 阅读(1336) | 评论 (0)  编辑

D3D中的光照
     摘要: 为了提高场景的真实性,我们可以为其加入灯光。灯光也能帮助表现物体的立体感以及物体的实体形状。当使用灯光时,我们不再自己指定顶点的颜色; Direct3D中每个顶点都通过灯光引擎来计算顶点颜色,该计算是基于定义的灯光资源,材质以及灯光资源关心的表面方向。通过灯光模型计算顶点颜色会得到更真实的场景。   阅读全文

posted @ 2008-03-16 20:47 lovedday 阅读(1429) | 评论 (0)  编辑

D3D中的颜色
     摘要: 在Direct3D中,颜色是使用RGB三部分来描述的。也就是说,我们要分别指定红、绿和蓝三种颜色的值。混合这三个颜色决定最终的颜色。利用这三种颜色我们能够表现数万种颜色。

我们使用两种不同的结构来存储RGB数据。这第一种是D3DCOLOR,它实际上是一个DWORD类型即32位。在D3DCOLOR类型中的这些位按照8-bit被分为4个部分,每一部分存储的是该色的亮度值。如图4.1所示。  阅读全文

posted @ 2008-03-16 10:28 lovedday 阅读(3189) | 评论 (1)  编辑

Direct3D中的绘制
     摘要: 顶点和索引缓存有相似的接口并且共享相似的方法;因此我们把它们合在一起讲解。一个顶点缓存是一块连续的存储了顶点数据的内存。同样的,一个索引缓存是一块连续的存储了索引数据的内存。我们使用顶点和索引缓存保存我们的数据是因为它们能被放置在显存中。渲染显存中的数据要比渲染系统内存中的数据快的多。  阅读全文

posted @ 2008-03-14 18:54 lovedday 阅读(1211) | 评论 (0)  编辑

绘制流水线
     摘要: 这次主题是渲染管线。它是用来创建为3D世界进行几何描述的2D图形并设定一个虚拟照相机确定这个世界中哪一部分将被透视投影到屏幕上。  阅读全文

posted @ 2008-03-14 09:44 lovedday 阅读(1244) | 评论 (0)  编辑

初始化Direct3D
     摘要: Direct3D是一种低层图形API,它能让我们利用3D硬件加速来渲染3D世界。我们可以把Direct3D看作是应用程序和图形设备之间的中介。例如通知图形设备清空屏幕,应用程序将调用Direct3D的IDirect3DDevice9::Clear方法。图1.1显示了应用程序、 Direct3D和图形设备之间的关系。
  阅读全文

posted @ 2008-03-13 13:38 lovedday 阅读(2098) | 评论 (0)  编辑

D3D编程必备的数学知识
     摘要: 几何学中,我们用有向线段表示向量,如图1。向量的两个属性是他的长度和他的顶点所指的方向。因此,可以用向量来模拟既有大小又有方向的物理模型。例如,以后我们要实现的粒子系统。我们用向量来模拟粒子的速度和加速度。在3D计算机图形学中我们用向量不仅仅模拟方向。例如我们常常想知道光线的照射方向,以及在3D世界中的摄象机。向量为在3维空间中表示方向的提供了方便。  阅读全文

posted @ 2008-03-12 14:05 lovedday 阅读(1944) | 评论 (0)  编辑

使用DirectPlay进行网络互联
     摘要: 网络是指多台计算机互联以进行数据传输及通信的系统。除了两个或更多的计算机之外,网路还需要有网络互联软件(或一个网路操作系统)、网络适配器以及电缆。网络适配器有各种形状和大小,但是一般都采用调制解调器的形状。实际上,调制解调器就是一个网路适配器,它能够将一台计算机通过世界上最大的网络-- -互联网连接到数百万台计算机上。

网络互联模型有三种基本类型:服务器端、客户端以及点对点。   阅读全文

posted @ 2007-10-11 14:50 lovedday 阅读(787) | 评论 (0)  编辑

【ZT】DirectX简介
     摘要: DirectX是由微软公司建立的游戏编程接口。由C++编程语言实现,遵循COM。在Windows的平台上影响力超越OpenGL并被多数PC 游戏开发商采用。最新版本DirectX9.0c (2006年12月13日)。另外,Windows Vista第5238版亦包含有 DirectX 10 的 Beta 版。

很多Windows游戏需要DirectX。DirectX包含DirectGraphic、DirectPlay、 DirectSound、DirectInput、DirectSetup等部份。 (Direct3D与DirectDraw已整合成DirectGraphic,而DirectShow亦已自原本的DirectX SDK中移到Windows平台SDK了。 Redist Package 是媒体开发底层API,通过它可以开发游戏和其它媒体应用程序。  阅读全文

posted @ 2007-10-07 13:27 lovedday 阅读(1298) | 评论 (0)  编辑

用DirectX Audio和DirectShow播放声音和音乐
     摘要: 音乐就是一系列的音符,这些音符在不同的时间用不同的幅度被播放或者停止。有非常多的指令被用来播放音乐,但是这些指令的操作基本相同,都在使用各种各样不同的音符。在计算机上进行作曲,实际上是存储了很多组音乐,回放时由音频硬件将这些音符播放出来。  阅读全文

posted @ 2007-09-24 23:38 lovedday 阅读(3638) | 评论 (0)  编辑

使用DirectInput进行交互
     摘要: DirectInput是一些COM对象的集合(和所有DirectX组件相同),这些COM对象描绘了输入系统和各个输入设备。最主要的对象是DirectInput8,它用于初始化系统以及创建输入设备  阅读全文

posted @ 2007-09-20 02:19 lovedday 阅读(1055) | 评论 (0)  编辑

XFile网格的应用
     摘要: 三维物体表面的各个剖分三角形构成了一个所谓的网格(Mesh),使用3D建模软件绘制三维图象,可取得网格的顶点坐标,顶点纹理坐标以及三角形面的材质等数据,并可将这些数据保存到相应的三维图象文件中。此时调用DirectX提供的网格接口函数,读取三维图象文件的顶点数据,就可对三维物体表面进行渲染处理。  阅读全文

posted @ 2007-09-20 02:13 lovedday 阅读(877) | 评论 (0)  编辑

D3D中的Alpha颜色混合
     摘要: 渲染管道流水线通常需要将来自顶点的颜色,纹理像素的颜色,光照颜色以及物体表面材质反射光颜色进行混合,生成计算机屏幕的像素颜色。将多种颜色混合在一起,必须考虑各种颜色的成分比例,这个比例由Alpha因子决定。对于游戏开发来说,利用Alpha颜色混合可产生背景透明的渲染效果。   阅读全文

posted @ 2007-09-20 02:02 lovedday 阅读(1767) | 评论 (0)  编辑

D3D中的纹理贴图
     摘要: 纹理是指物体表面本身所具有的图案,可采用贴图的方法将一张二维图象张贴到一个三维物体的表面,这就是所谓的纹理贴图技术。与材质一样,纹理也是物体表面的一种属性,同时结合材质,光照和纹理技术可对三维场景进行渲染,使渲染出来的三维图形更为逼真。   阅读全文

posted @ 2007-09-20 01:21 lovedday 阅读(2599) | 评论 (0)  编辑

D3D中网格模型的运用
     摘要: 在最底层的层次中,Direct3D并不使用网格模型,而只是使用多边形。D3DX增强了Direct3D系统的功能性,添加了一系列负责处理网格模型的容器和进行渲染的对象。.X文件是微软公司所开发的,高度通用的三维模型存储格式。它是模板驱动并完全可扩展,这就意味着可以使用它来满足文件存储的所有需求。一个.X文件,正如它的文件扩展名所表明的,是非常通用的。它可以是基于文本的,以便更容易进行编辑;或者是基于二进制的,这样可以使文件更小,并且更容易地进行保护以便不被窥视。整个.X文件格式是基于模板的,非常类似于C语言结构。

为了读取并处理一个.X文件,可以利用COM对象的一个小集合来解析从头到尾在.X文件中所遇到的每个数据对象。将数据对象作为一个字节的数组进行处理;仅仅是将数组转换为一种可使用的结构,以便能够容易地访问到包含在对象里的数据。  阅读全文

posted @ 2007-07-22 23:27 lovedday 阅读(4785) | 评论 (2)  编辑

D3D中的Z缓存使用示例
     摘要: 在渲染多边形网格对象到场景中的时候,离观察者越远的对象应该越模糊,同时离观察者越近的物体应该越清楚,这就是深度排序(depth sorting)。深度排序有两种常用的方法。

第一种方法称为画家算法(painter's algorithm)。这种方法将对象划分成不同的多边形,由后往前对这些多边形进行排序,再按照排好的顺序绘制出这些多边形。采用这种方法绘制多边形,能够确保前面的多边形总是在其后多边形之前进行绘制。

深度排序的第二种方法称为z缓冲方法(z-buffer),它是图形硬件设备使用最多的方法。这种方法依赖于像素,每个像素都有一个z值(z值是像素距离观察者的距离)。当每个像素被写入时,渲染器首先检查是否已经存在一个z值更小的像素,如果不存在,这个像素就被绘制出来;如果存在,就跳过该像素。  阅读全文

posted @ 2007-07-04 20:53 lovedday 阅读(1354) | 评论 (0)  编辑

D3D中粒子效果实现示例
     摘要: 大爆炸,烟雾痕迹甚至魔术飞弹尾部发出的微小火花,都是粒子(particle)所制造出来的特殊效果。在适当的时机,启用alpha混合并绘制粒子,这样粒子就能朝向观察点(使用公告板),得到的结果就是混合对象的抽象拼贴,他们可以用于创建一些奇妙的效果。

粒子奇妙的地方就在于粒子的大小实际上是任意的,原因在于可以创建一个缩放矩阵,使其同粒子多边形的世界变换矩阵结合起来。也就是说,除非粒子纹理不同,否则只需要使用一个多边形来绘制所有的粒子,无论如何,多边形的数目都必须同纹理的数目保持一致。  阅读全文

posted @ 2007-07-04 14:52 lovedday 阅读(1802) | 评论 (0)  编辑

Full ■ DirectX 9 Program Archive

公告

导航

统计

常用链接

随笔分类(178)

3D游戏编程相关链接

搜索

最新评论