天行健 君子当自强而不息

■ DirectX 9 Program

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

posted @ 2008-05-07 18:08 lovedday 阅读(3795) | 评论 (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 阅读(1552) | 评论 (0)  编辑

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

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

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

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

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

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

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

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

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

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

【ZT】D3DFVF_XYZ和D3DFVF_XYZRHW的区别

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

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

posted @ 2008-04-29 15:45 lovedday 阅读(1904) | 评论 (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 阅读(1065) | 评论 (0)  编辑

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

posted @ 2007-10-11 14:50 lovedday 阅读(868) | 评论 (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 阅读(1333) | 评论 (0)  编辑

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

D3D中公告板的使用示例
     摘要: 公告板(billboard)是一种允许在2D对象出现在3D中的很酷的技术,公告板的原理就是通过使用世界矩阵,根据观察点来排列多边形,因为观察的角度已知(或能够获得一个观察变换矩阵),就只需要使用相反的观察角来构造矩阵。创建公告板世界矩阵的方法是从Direct3D获取当前的观察矩阵并将此矩阵转置。这个转置矩阵会将所有的东西进行恰当的定位,以朝向观察点。接着就只需应用网格的平移矩阵,在世界中正确地确定网格的位置。  阅读全文

posted @ 2007-07-03 22:37 lovedday 阅读(2893) | 评论 (0)  编辑

D3D中的字体绘制示例
     摘要: 字体的绘制需要使用ID3DXFont对象和 D3DXCreateFontIndirect函数。

DirectX SDK文档对ID3DXFont做了简要的说明:

The ID3DXFont interface encapsulates the textures and resources needed to render a specific font on a specific device.

The ID3DXFont interface is obtained by calling D3DXCreateFont or D3DXCreateFontIndirect.  阅读全文

posted @ 2007-07-03 19:33 lovedday 阅读(3384) | 评论 (1)  编辑

光照示例
     摘要: 在设置可变顶点格式时加入法线和漫反色,如下所示:

// The 3D vertex format and descriptor
typedef struct
{
float x, y, z; // 3D coordinates
float nx, ny, nz; // normals
D3DCOLOR diffuse; // color
} VERTEX;

#define VERTEX_FVF (D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_DIFFUSE)  阅读全文

posted @ 2007-07-03 01:10 lovedday 阅读(252) | 评论 (0)  编辑

ALPHA混合示例
     摘要: 设置可变顶点格式时增加一个D3DCOLOR类型的漫反射分量,其中的alpha值指定了alpha混合因子。

// The 2D vertex format and descriptor
typedef struct
{
float x, y, z; // 2D coordinates
float rhw; // rhw
D3DCOLOR diffuse; // diffuse color component
} VERTEX;  阅读全文

posted @ 2007-07-02 22:56 lovedday 阅读(432) | 评论 (0)  编辑

D3D中用3D方法绘制2D图象的例子
     摘要: 思路与"一个用D3D绘制2D图形的例子"相差不多,主要的区别在顶点的数据结构定义不一样。

2D的VERTEX结构定义为:

// The 2D vertex format and descriptor
typedef struct
{
float x, y, z; // 2D coordinates
float rhw; // rhw
float u, v; // texture coordinates
} VERTEX;

#define VERTEX_FVF (D3DFVF_XYZRHW | D3DFVF_TEX1)  阅读全文

posted @ 2007-07-02 19:50 lovedday 阅读(2409) | 评论 (0)  编辑

一个用D3D绘制2D图形的例子
     摘要: 思路如下:

(1)函数Do_Init初始化D3D,D3D设备,顶点缓冲,纹理;主要调用这几个函数:
Direct3DCreate9,GetAdapterDisplayMode,CreateDevice,CreateVertexBuffer, Lock,Unlock,D3DXCreateTextureFromFile。

(2)函数Do_Frame绘制一帧,主要调用这几个函数:
Clear,BeginScene,EndScene,SetStreamSource,SetFVF,SetTexture, DrawPrimitive。

(3)函数Do_Shutdown释放D3D资源。  阅读全文

posted @ 2007-07-01 23:06 lovedday 阅读(4521) | 评论 (0)  编辑

【ZT】D3D中的骨骼动画
     摘要: 相信这里没有人没玩过采用骨骼动画技术的游戏,看看那些热门的动作游戏,例如《波斯王子》、《分裂细胞》和《战神》,你就知道骨骼动画的威力了(我承认是猜的)。骨骼动画技术用来使我们的3D模型在屏幕上动起来,通过和动作捕捉技术结合,可以让模型做出非常逼真的动作。而这样一个极具威力的技术,其原理却相当简单。

假设我们要让游戏主角做出一个动作,例如波斯王子拿弯刀往前一劈。最简单的方法,就是让模型师建一个动画序列,然后在程序中逐帧播放,就像放电影一样。不过这样一来工作量就太大了,玩家也需要N个G的硬盘来安装这个游戏。与此不同,骨骼动画技术采用了一种很聪明的方式。首先,建模师完成一个标准姿势的3D模型,通常是双手沿着肩的方向伸展平放,双脚打开。所有的后继动作将由这个基础动作演变得到。  阅读全文

posted @ 2007-05-24 00:03 lovedday 阅读(5175) | 评论 (8)  编辑

运行DxTex.exe碰到的问题

posted @ 2007-05-15 15:49 lovedday 阅读(1761) | 评论 (0)  编辑

D3D中的材质和光照处理
     摘要: 物体表面光泽是由于表面的反射光刺激人的眼睛视网膜而引起的一种视官感觉,这种色觉实际上是由光的波长决定的。每种波长的光在光谱中占据一定的位置,具有特定的色泽和亮度。

对于任意波长为s的光,由于s可分解为s = aR + bG + cB,其中R,G,B为红色光,绿色光和蓝色光的波长,于是在RGB为基底的情况下,光波长由三元数(a, b, c)来决定。因此光的颜色值量化可以这样来进行:首先用颜色值(1, 0, 0)表示红色R,用颜色值(0, 1, 0)表示绿色G,用(0, 0, 1)表示蓝色B,而任意波长的光的颜色值C则可用(r, g, b)表示,以表明颜色s = aR + bG + cB 是用RGB三色通过混色而得来的,其中r, g和b取区间的浮点数。  阅读全文

posted @ 2007-05-12 23:28 lovedday 阅读(2948) | 评论 (0)  编辑

【ZT】D3D中简单的截图方法

posted @ 2007-05-11 21:36 lovedday 阅读(2843) | 评论 (0)  编辑

D3D中基本立体面的绘制
     摘要: 在世界空间中,面向摄影机的三维物体的剖分三角形面为前面,是可视的;背向摄影机的三角形面称为背面,是不可视的。对于可视的前面进行渲染显示,对于不可视的背面则不进行渲染处理,这就是所谓的背面剔除。

为了省去繁杂的前面和背面的计算判断,DirectX将依据写入顶点缓冲区的三角形面3个顶点的顺(逆)时针方向来定义该面为前面或背面,以直接规定三角形面是否显示。在DirectX的默认情形下,如果写入顶点缓冲区的三角形面的3个顶点为顺时针方向,那么这3个顶点构成的三角形面被认为是前面,必须进行渲染显示。相反,如果3个顶点的顺序为反时针,则为背面三角形,不需要渲染处理。  阅读全文

posted @ 2007-05-11 17:02 lovedday 阅读(4602) | 评论 (0)  编辑

D3D中基本三角形面的绘制
     摘要: DirectX Graphics提供的编程接口包括Direct3D组件和D3DX扩展组件,利用DirectX Graphics可以一致地处理二维和三维的图形渲染,而不再需要应用早期DirectX版本下的DirectDraw组件进行二维图形的显示处理。

首先来看看三维物体的成像过程。三维物体可通过建模的微分方法,把弯曲的表面切分为一个个的三角形面,这样三维物体表面的绘制,就转化为物体表面中所有三角形面的绘制。要渲染由众多三维物体组成的三维场景,需要先引入局部坐标系,为场景中的各个三维物体进行三角形顶点的坐标量化。  阅读全文

posted @ 2007-05-09 18:36 lovedday 阅读(6762) | 评论 (0)  编辑

游戏中时间的封装
     摘要: 时钟类GE_TIMER可用来取得游戏已进行的时间,计算出两个时间点之间的时间片大小,从而可在某一时间点处,自动更新某些游戏状态。此外,还可用来获取程序的帧频FSP(Frame Per Second)大小,检验3D渲染的速度,即游戏速度。  阅读全文

posted @ 2007-05-07 21:33 lovedday 阅读(911) | 评论 (0)  编辑

主窗口和DirectInput的封装
     摘要: 注:GE是GameEngine的缩写。

GE_APP类解决应用程序的窗口创建问题,为了突出消息处理,这个类并没有更抽象地将窗口程序地消息循环体代码进行封装。因此,这里的应用程序架构是创建窗口(包括注册窗口类,创建窗口,显示窗口,设置窗口回调函数的默认处理),然后继续使用消息循环体,读取键盘和鼠标的输入等,进行一帧的渲染或其他处理。  阅读全文

posted @ 2007-05-07 01:42 lovedday 阅读(1627) | 评论 (0)  编辑

【ZT】DirectInput 鼠标编程入门
     摘要: 前回同大家简单介绍了如何用 DirectInput 来进行键盘编程,本回所要讲述的就该是关于如何使用 DirectInput 来对另一个非常重要的输入设备----鼠标的编程问题。

  鼠标的编程同键盘编程的过程是非常相似的,有了上次的基础,你很快就能看出两者在形式上其实完全是大同小异的。  阅读全文

posted @ 2007-05-06 19:34 lovedday 阅读(663) | 评论 (0)  编辑

【ZT】DirectInput里的键盘鼠标的应用
     摘要: 设计一个PC游戏,键盘鼠标的输入是绝不能少。Windows也提供了诸如 WM_LBUTTONDOWN、WM_RBUTTONUP等鼠标消息以及WM_KEYDOWN、WM_KEYUP等键盘输入消息。但是 DirectInput中仍然提供了对鼠标键盘的支持,其原因就是DirectInput提供一个更直接更快捷的对输入设备的访问方法。就象我们在DOS 下直接接管键盘中断,而不是去用什么讨厌的INT16来处理键盘输入一样。  阅读全文

posted @ 2007-05-06 17:17 lovedday 阅读(624) | 评论 (0)  编辑

【ZT】DirectInput 键盘编程入门
     摘要: 游戏编程可不仅仅是图形程序的开发工作,实际上包含了许多方面,本文所要讲述的就是关于如何使用 DirectInput 来对键盘编程的问题。

在 DOS 时代,我们一般都习惯于接管键盘中断来加入自己的处理代码。但这一套生存方式在万恶的 Windows 社会下是行不通的,我们只能靠领 API 或者 DirectInput 的救济金过活。

在 Windows 的 API 中,有一个 GetAsyncKeyState() 的函数可以返回一个指定键的当前状态是按下还是松开。这个函数还能返回该指定键在上次调用 GetAsyncKeyState() 函数以后,是否被按下过。虽然这个函数听上去很不错,但现在领这种救济金的程序员是越来越少了。原因无它,只因为 DirectInput 的救济金比这丰厚,而且看上去似乎更专业?  阅读全文

posted @ 2007-05-06 16:30 lovedday 阅读(441) | 评论 (0)  编辑

DirectInput8初探 - 键盘篇
     摘要: DirectInput是Directx的一个组件接口,提供了大量的接口函数处理用户在键盘,鼠标,游戏杆以及力反馈等游戏装置上的输入,而且 DirectInput是直接与硬件驱动程序打交道,因此DirectInput可较快的处理用户的输入。另一方面,正是由于DirectInput直接与驱动程序进行通信,所以在控制面板上所作的任何键盘和鼠标的属性设置(如键盘按键的延迟重复率和鼠标的左右手习惯等),都不会对应用 DirectInput的程序起作用,除非是修改由驱动程序提供的属性设置。  阅读全文

posted @ 2007-05-05 01:33 lovedday 阅读(5743) | 评论 (0)  编辑

DirectX 9的坐标系统变换
     摘要: 摄影坐标系的原点为世界坐标系中的观察位置eye点,z轴与观察方向(从eye点出发到at点的向量)一致。
由于仅由一个坐标原点的位置和一个z坐标轴的方向不足以完全确定一个坐标系,因此,还需要指定一个up向量来定位摄影坐标系的y轴方向。这个在世界坐标系中给出的up向量是不必与观察方向垂直的,只是指明摄影坐标系应该以向上的方向还是以向下的方向作为y轴。  阅读全文

posted @ 2007-05-04 02:09 lovedday 阅读(3710) | 评论 (0)  编辑

DirectX 9的一些数学计算函数:平面
     摘要: 将三维物体表面剖分为一系列的三角形面,物体的光照亮度处理就转化为对这些平面三角形的照明处理,从而可简单地通过平面三角形的法向量与光的入射方向的夹角,来确定各种入射光对平面上每一点说贡献的亮度值。

对于三角形3个顶点p0,p1,p2构成的平面,选取一个垂直于该平面的法向量n。假设点p为平面上的任意一点,由于n . (p - p0) = 0,从而n . p - n . p0 = 0,由此展开向量的点积运算可知,平面程序具有如下的一般形式:ax+by+cz+d=0。如果要具体求出平面的方程,可取n=(p1-p0) x (p2 - p0)计算出来。  阅读全文

posted @ 2007-05-04 01:18 lovedday 阅读(1899) | 评论 (1)  编辑

【ZT】Direct3D几何流水线
     摘要: 大家都知道,一个3D 场景中,我们见到的任何光辉灿烂的物体,都是由一个一个面片组成的。而装载面片位置信息的就是其各个定点的三维坐标。这是用来在模型中存储的,而要把物体显示在屏幕上,还需要将它们转换成显示器上的二维坐标。这就需要对每个点实施一套 3 to 2 的转换公式,在Direct3D中叫做“几何流水线”(Geometry Pipeline)。  阅读全文

posted @ 2007-05-03 23:20 lovedday 阅读(1180) | 评论 (1)  编辑

DirectX 9的一些数学计算函数:矩阵,坐标变换。
     摘要: 向量的运算已超了传统意义上的数的运算,因为向量并不是一般的数字。这意味着一切可用符号表示出来的事物,都可以对其进行各种关系运算,而不必关心事物的本身。这种符号运算的观点,推动了近代数学对一般的集合元素进行的抽象代数方面的研究。

在线性方程组的求解上,变元较少的方程组(如仅有两个未知数x和y的方程组)的解很容易表达出来,但是推广到较为复杂的更多变元的情形,如何推测方程组的解以及如何用确定的式子表达出来,引发了对行列式的提出和研究。行列式实质上是方阵数据的一种运算,由此自然地想到,可对一般行列数据定义代数运算,就像对向量定义运算一样,这就是矩阵运算的产生历史。  阅读全文

posted @ 2007-04-27 20:04 lovedday 阅读(2349) | 评论 (0)  编辑

DirectX 9的一些数学计算函数:向量篇
     摘要: 首先来看看向量,向量的坐标表示对于DirectX游戏开发来说是必须的,在世界坐标系或投影坐标系下的三角形面的法线,光线的方向和观察者的方向等都是通过向量的坐标形式来准确给出的。

DirectX的头文件D3DX9Math.h给出了两个结构体来支持向量的计算:  阅读全文

posted @ 2007-04-27 18:53 lovedday 阅读(1776) | 评论 (0)  编辑

找不到d3dx9_25.dll
     摘要: 今天在学习DirectX 9 SDK的时候,碰到了一个问题,提示我:

This application has failed to start because d3dx9_25.dll was not found.

上网查了下,找到了原因,英文就不翻译了,再也找不到英文比我还烂的人了 ^_^  阅读全文

posted @ 2007-04-26 13:01 lovedday 阅读(3839) | 评论 (2)  编辑

公告

导航

统计

常用链接

随笔分类(178)

3D游戏编程相关链接

搜索

最新评论