Direct 3d游戏编程
文章平均质量分 82
Jaz_Chu
热爱编程,热爱生活 此心用度八千遍 不嫌厌倦,那曲虚唱几流年 却已忘念 Copyright 伴随 All Right Reserved
展开
-
D3D游戏编程第一帖: 关于.x文件的MAX插件安装与导出
今天开始写关于D3D游戏编程的帖子了,因为放下一段时间.可能有些地方会出现一些纰漏.主要目的还是在于大家共同探讨,同时也鞭策下自己,学过的东西别全忘了,呵呵.转入正题吧,首先的问题是插件的得到.这个一般大家上网都应该能找到的:第二步:在3DSMAX创建好物体及UVW贴图,选择File->Export...会多出*.x File项,如果你创建的是Character Studi原创 2012-03-10 13:15:50 · 320 阅读 · 0 评论 -
用3DMAX+DirectPanda插件导出.X文件
用3DMAX+DirectPanda插件导出.X文件1.下载DirectPanda插件:先到http://www.andytather.co.uk/Panda/directxmax_downloads.aspx去下载DirectPanda插件(www.GameRes.com上面也有下载).2.加载插件:解压后得到一个.dle文件,将.dle文件复制到3dmax/stdplugs目录中,再进原创 2012-03-10 13:14:15 · 460 阅读 · 0 评论 -
D3D编程必备的数学知识(2)
向量相加我们能够通过分别把两个向量的各个分量相加得到向量之和,注意在相加之前必须保证它们有相同的维数。u + v = (ux+vx, uy+vy, uz+vz)图5显示的是几何学上的向量相加。两个向量相加的代码,我们使用重载的加法操作符:D3DXVECTOR3 u(2.0f, 0.0f, 1.0f);D3DXV翻译 2012-04-10 17:44:40 · 276 阅读 · 0 评论 -
初始化Direct3D(2)
1.3.2 Multisampling由于使用像素矩阵来表示图像,在显示时会出现锯齿状,Multisampling就是使其变得平滑的技术。它的一种最普通的用法即为——全屏抗锯齿(看图1.3)。D3DMULTISAMPLE_TYPE枚举类型使我们可以指定全屏抗锯齿的质量等级:D3DMULTISAMPLE_NONE——不使用全屏抗锯齿。D3DMULTISAMPLE_1_SAMPLE翻译 2012-04-10 18:02:33 · 327 阅读 · 0 评论 -
D3D中的颜色
颜色表示法在Direct3D中,颜色是使用RGB三部分来描述的。也就是说,我们要分别指定红、绿和蓝三种颜色的值。混合这三个颜色决定最终的颜色。利用这三种颜色我们能够表现数万种颜色。我们使用两种不同的结构来存储RGB数据。这第一种是D3DCOLOR,它实际上是一个DWORD类型即32位。在D3DCOLOR类型中的这些位按照8-bit被分为4个部分,每一部分存储的是该色的亮度值。如图4.1所示翻译 2012-04-10 19:04:48 · 186 阅读 · 0 评论 -
D3D中的光照(3)
平行光示例:The GetAsyncKeyState function determines whether a key is up or down at the time the function is called, and whether the key was pressed after a previous call toGetAsyncKeyState. Syntax翻译 2012-04-11 13:34:14 · 214 阅读 · 0 评论 -
D3D中的纹理映射(3)
该例程演示了怎样对一个立方体映射板条纹理。截图:vertex.h: #ifndef __VERTEX_H__#define __VERTEX_H__class cTextureVertex{public:float m_x, m_y, m_z;float m_nx, m_ny, m_nz;float m_u, m_v;// texture coo翻译 2012-04-11 13:39:44 · 167 阅读 · 0 评论 -
D3D中的Alpha融合技术(2)
7.4使用DirectX纹理工具创建Alpha通道 绝大多数普通图象文件格式没有存储alpha信息,在这一部分我们给你演示怎样使用DirectX纹理工具来创建一个带alpha通道的DDS文件。DDS文件是一个为DirectX应用程序和纹理设置的图象格式。DDS文件能够利用D3DXCreateTextureFromFile函数读进纹理中,就象bmp和jpg文件一样。DirectX纹理翻译 2012-04-11 13:46:11 · 225 阅读 · 0 评论 -
D3D中的模板缓存(2)
8.2实例程序:镜子在自然界中的很多表面象镜子一样允许我们通过它的反射来看物体,我们来看看怎样用3D应用程序来模拟镜子,为了简单起见我们只模拟平面镜。举个例子,一辆擦亮的小汽车能够反射;然而车的车身是光滑的圆的,不是一个平面。我们渲染的是那些光滑的大理石地板、挂在墙上的镜子的反射,换句话说就是在一个平面的镜子。实现镜子的程序需要我们解决两个问题。第一,我们必须学习沿着一个面怎样反射一个物体翻译 2012-04-11 13:48:34 · 200 阅读 · 0 评论 -
D3D中的模板缓存(3)
8.3实例程序:平面阴影在场景中被灯光照射的地方会产生阴影,这将使场景变的更真实。在这一部分我们将演示怎样实现平面阴影,即在平面上的阴影(如图8.5)。使用这种阴影只是一种权宜之计,虽然它增强了场景的真实效果,但是这并不是现实中的阴影。为了实现平面阴影,我们首先必须找到物体投射到平面上的阴影并进行几何建模以便我们能够渲染它,用一些3D数学就能很容易的实现它,然后我们用50%透明度的翻译 2012-04-11 13:49:54 · 194 阅读 · 0 评论 -
D3D中的模板缓存(4)
该示例演示了如何利用D3D中的模板缓存技术同时显示物体的镜像和阴影。主程序:/************************************************************************************** Demonstrates mirrors and shadows with stencils. Use the arro翻译 2012-04-11 13:51:44 · 172 阅读 · 0 评论 -
D3D中的网格模型(2)
10.4 优化Mesh的顶点和索引能够被重组以便能更有效的渲染mesh。当我们这样做时,我们说我们优化了一个mesh。我们可以使用下面的方法来进行优化:HRESULT ID3DXMesh::OptimizeInplace( DWORD Flags, CONST DWORD* pAdjacencyIn, DWORD* pAdja翻译 2012-04-11 14:02:55 · 242 阅读 · 0 评论 -
D3D中的网格模型(4)
11.1 ID3DXBufferID3DXBuffer接口是一个很普通的数据结构, D3DX用它将数据存储到连续内存块中。它只有两个方法:LPVOID GetBufferPointer()——返回一个指向开始数据的指针。DWORD GetBufferSize()——返回在缓存中的字节大小。为了保持该接口的通用性,它使用一个void类型的指针。也就是说它让我们知道被存储的数据的类型。翻译 2012-04-11 14:05:30 · 187 阅读 · 0 评论 -
D3D编程必备的数学知识(3)
矩阵在这一部分我们关注的焦点是数学中的矩阵。它们在3D图形学中的应用将在下一部分讲解。一个m×n的矩阵是由m行和n列的数字组成的矩阵列。行和列的数字就是这个矩阵的维数。我们通过写在下方的数字识别矩阵清单,数字中的第一个表示行第二个表示列。例如下边的M是3×3矩阵,B是2×4矩阵,C是3×2矩阵。我们使用加粗的大写字母表示矩阵。有时一个矩阵只包含一行或者一列。我们用行矩阵和列矩阵翻译 2012-04-10 17:46:24 · 197 阅读 · 0 评论 -
初始化Direct3D(1)
1.1 Direct3D概述Direct3D是一种低层图形API,它能让我们利用3D硬件加速来渲染3D世界。我们可以把Direct3D看作是应用程序和图形设备之间的中介。例如通知图形设备清空屏幕,应用程序将调用Direct3D的IDirect3DDevice9::Clear方法。图1.1显示了应用程序、Direct3D和图形设备之间的关系。图1.1中Direct3D所表示的是Direc翻译 2012-04-10 18:00:57 · 412 阅读 · 0 评论 -
初始化Direct3D(4)
1.5初始化Direct3D实例在本例程中,初始化了一个Direct3D应用程序并用黑色填充显示窗口(如图1.7)。 图1.7所有的应用程序都包含了d3dUtility.h和d3dUtility.cpp这两个文件,它们所包含的函数实现了所有Direct3D应用程序都要去做的一些常见的功能。例如:创建翻译 2012-04-10 18:17:03 · 156 阅读 · 0 评论 -
Direct3D中的绘制(5)
这个程序创建并渲染几种不同的能够使用D3DXCreate*函数创建的3D物体。Uses a left-handed coordinate system to create a mesh containing an axis-aligned box.HRESULT D3DXCreateBox( LPDIRECT3DDEVICE9 pDevice, FLOAT Width, FLO翻译 2012-04-10 19:03:03 · 185 阅读 · 0 评论 -
D3D中的光照(2)
5.4光源Direct3D支持三种类型的光源。点光源——这种光源在世界坐标中有一个位置且向所有方向上都照射光线。方向光源——这种光源没有位置但是向指定方向发出平行光线。聚光灯——这种类型的光源和手电筒的光类似;它有位置并且发出的光在指定方向上按照圆锥形照射。这个圆锥形有两个角度,θ和φ。角度θ描述内圆锥,φ描述外圆锥。在代码中一个灯光资源是通过D3DLIGHT9结构翻译 2012-04-10 19:07:53 · 190 阅读 · 0 评论 -
D3D中的光照(5)
聚光灯示例,截图:源代码: /************************************************************************************** Demonstrates using a spot light with D3DX objects. You can move the spotlight arou翻译 2012-04-11 13:36:13 · 162 阅读 · 0 评论 -
D3D中的网格模型(1)
ID3DXMesh接口的主要功能继承自ID3DXBaseMesh父接口,了解这些是很重要的,其它一些mesh接口如ID3DXPMesh也是继承自ID3DXBaseMesh。10.1 几何信息ID3DXBaseMesh接口包含一个用来存储网格顶点的顶点缓存和一个用来定义这些顶点怎样连接在一起组成网格三角形的索引缓存。我们使用下面的方法来得到这些缓存的指针:HRES翻译 2012-04-11 14:01:49 · 210 阅读 · 0 评论 -
D3D中的网格模型(5)
11.2.4 产生顶点法线一个X文件不包含顶点法线数据,这是很有可能的。假如是这种情况,那么手动计算顶点法线以便我们能够使用灯光这是很有必要的。现在知道了ID3DXMesh接口和它的父接口ID3DXBaseMesh,我们能够使用下面的函数来产生任何mesh的顶点法线:Computes unit normals for each vertex in a mesh. Provided to s翻译 2012-04-11 14:06:25 · 236 阅读 · 0 评论 -
D3D编程必备的数学知识(1)
三维空间中的向量几何学中,我们用有向线段表示向量,如图1。向量的两个属性是他的长度和他的顶点所指的方向。因此,可以用向量来模拟既有大小又有方向的物理模型。例如,以后我们要实现的粒子系统。我们用向量来模拟粒子的速度和加速度。在3D计算机图形学中我们用向量不仅仅模拟方向。例如我们常常想知道光线的照射方向,以及在3D世界中的摄象机。向量为在3维空间中表示方向的提供了方便。向量与位置无关。有同翻译 2012-04-10 17:42:30 · 199 阅读 · 0 评论 -
D3D编程必备的数学知识(5)
平面D3DX平面在代码中描述一个平面:仅仅需要一个法向量n和常数d就可以了。因此我们就使用一个4D向量(我们记录成(n,d))来实现它。D3DX库中用如下的结构来定义一个平面:typedef struct D3DXPLANE{#ifdef __cpluspluspublic: D3DXPLANE() {} D3DXPLANE( CONST FLO翻译 2012-04-10 17:57:01 · 197 阅读 · 0 评论 -
绘制流水线(1)
这次主题是渲染管线。它是用来创建为3D世界进行几何描述的2D图形并设定一个虚拟照相机确定这个世界中哪一部分将被透视投影到屏幕上。\2.1表现模型一个场景是多个物体或模型的集合。一个物体可以用三角形网格(triangle mesh)来近似表示,如图2.2所示。由三角形网格建立一个物体,我们称之为建模。3D世界中最基本的图元就是三角形,但是Direct3D也支持点图元和线图元但我们都不常用翻译 2012-04-10 18:50:29 · 199 阅读 · 0 评论 -
绘制流水线(2)
2.3 渲染管线一旦我们描述几何学上的3D场景和设置了虚拟照相机,我们要把这个场景转换成2D图象显示在显示器上。这一系列必须完成的操作就叫做渲染管线。图2.7展示了一个简化的渲染管线,随后将详细解释图中的每一部分。渲染管线中的许多级都是从一个坐标系到另一个坐标的几何变换。这些变换都通过矩阵变换来实现。Direct3D为我们进行变换计算并且如果显卡支持硬件变换的话那就更有利了。使用Dir翻译 2012-04-10 18:51:30 · 189 阅读 · 0 评论 -
绘制流水线(3)
2.3.5光照(Lighting)光照定义在世界坐标系中,但必须变换到视图坐标系才可使用。视图坐标系中光源给物体施加的光照大大增加了场景中物体的真实性。2.3.6裁剪(Clipping)我们删除那些超出了可视体范围的几何图形的过程就叫做裁剪。这会出现三种情况:完全包含——三角形完全在可视体内,这会保持不变,并进入下一级。完全在外——三角形完全在可视体外部,这将被删除。部分在翻译 2012-04-10 18:52:15 · 177 阅读 · 0 评论 -
Direct3D中的绘制(1)
3.1顶点/索引缓存 顶点和索引缓存有相似的接口并且共享相似的方法;因此我们把它们合在一起讲解。一个顶点缓存是一块连续的存储了顶点数据的内存。同样的,一个索引缓存是一块连续的存储了索引数据的内存。我们使用顶点和索引缓存保存我们的数据是因为它们能被放置在显存中。渲染显存中的数据要比渲染系统内存中的数据快的多。 在代码中,一个顶点缓存是通过IDirect3DVertex翻译 2012-04-10 18:53:49 · 166 阅读 · 0 评论 -
D3D中的光照(1)
为了提高场景的真实性,我们可以为其加入灯光。灯光也能帮助表现物体的立体感以及物体的实体形状。当使用灯光时,我们不再自己指定顶点的颜色;Direct3D中每个顶点都通过灯光引擎来计算顶点颜色,该计算是基于定义的灯光资源,材质以及灯光资源关心的表面方向。通过灯光模型计算顶点颜色会得到更真实的场景。5.1灯光的组成 在Direct3D灯光模型中,灯光是通过灯光资源的三个成员之一来照射翻译 2012-04-10 19:06:52 · 154 阅读 · 0 评论 -
D3D中的光照(4)
点光源示例,截图:源代码: /************************************************************************************** Demonstrates using a point light with D3DX objects. You can orbit the scene using翻译 2012-04-11 13:35:15 · 186 阅读 · 0 评论 -
D3D中的字体绘制(2)
9.3 D3DXCreateText最后的函数是被用来创建一个3D 文字网格,图9.1显示了实例“D3DXCreateText”所绘制的3D文本网格。该函数的原型是:HRESULT D3DXCreateText( LPDIRECT3DDEVICE9 pDevice, HDC hDC, LPCTSTR pText,翻译 2012-04-11 14:00:00 · 248 阅读 · 0 评论 -
D3D编程必备的数学知识(4)
基本变换当用Direct3D编程时,我们使用4×4矩阵来进行矩阵变换。用它的原因是:我们设置一个4×4矩阵X是为了更精确的描述矩阵变换。同样我们设置一个相匹配的点或者把向量的分量放置到一个1×4的行矩阵V中。VX的乘积返回一个新的向量V’。例如:让X沿着x轴平移10个单位同时V= [2, 6, –3, 1],乘积VX = V’= [12, 6, –3, 1]。有一些东西需要阐明。我们使翻译 2012-04-10 17:55:10 · 208 阅读 · 0 评论 -
初始化Direct3D(3)
1.4 初始化Direct3D下面几点说明怎样初始化Direct3D。根据下边的步骤你能初始化Direct3D:1.获得一个IDirect3D9接口指针。这个接口用于获得物理设备的信息和创建一个IDirect3DDevice9接口,它是一个代表我们显示3D图形的物理设备的C++对象。2.检查设备能力(D3DCAPS9),搞清楚主显卡是否支持硬件顶点处理。我们需要知道假如它能支持,我们就翻译 2012-04-10 18:15:53 · 191 阅读 · 0 评论 -
Direct3D中的绘制(2)
3.2 渲染状态Direct3D提供了多种渲染状态,它影响几何物体怎样被渲染。渲染状态有默认值,因此假如你的应用程序需要不同于默认设置的渲染时,你仅仅改变它即可。一种渲染效果会一直起作用,直到你下一次改变渲染状态为止。为了设置一个渲染状态,我们使用下面的方法:Sets a single device render-state parameter.HRESULT SetRenderSta翻译 2012-04-10 18:54:59 · 251 阅读 · 0 评论 -
Direct3D中的绘制(3)
立方体——只比三角形稍微复杂一点,这个程序渲染一个线框立方体。这个简单的绘制和渲染立方体的程序的运行结果如下图所示:源程序:/************************************************************************************** Renders a spinning cube in wireframe mo翻译 2012-04-10 18:56:37 · 169 阅读 · 0 评论 -
Direct3D中的绘制(4)
这个程序使用D3DXCreateTeapot函数创建并用DrawSubset函数渲染一个纺纱茶壶。Uses a left-handed coordinate system to create a mesh containing a teapot.HRESULT D3DXCreateTeapot( LPDIRECT3DDEVICE9 pDevice, LPD3DXMESH * ppM翻译 2012-04-10 18:59:31 · 209 阅读 · 0 评论 -
D3D中的纹理映射(1)
纹理映射是一种允许我们为三角形赋予图象数据的技术;这让我们能够更细腻更真实地表现我们的场景。例如,我们能够创建一个立方体并且通过对它的每个面创建一个纹理来把它变成一个木箱(如图6.1)。在Direct3D中一个纹理是通过IDirect3DTexture9接口来表现的。一个纹理是一个类似像素矩阵的表面它能够被映射到三角形上。6.1 纹理坐标Direct3D使用一个纹理坐标系统,它是由翻译 2012-04-11 13:37:36 · 199 阅读 · 0 评论 -
D3D中的纹理映射(2)
6.4 Mipmaps就象6.3节所说的,在屏幕上的三角形和纹理三角形通常是不一样大的。为了使这个大小差异变小,我们为纹理创建mipmaps链。也就是说将一个纹理创建成连续的变小的纹理,但是对它们等级进行定制过滤,因此对我们来说保存细节是很重要的(如图6.4)。6.4.1 Mipmaps过滤器 mipmap过滤器是被用来控制Direct3D使用mipmaps的。设置mi翻译 2012-04-11 13:38:18 · 190 阅读 · 0 评论 -
D3D中的纹理映射(4)
该例程演示了如何设置纹理寻址模式。截图:源程序: /**************************************************************************************Allows the user to switch between the different texture address modes to see翻译 2012-04-11 13:43:53 · 197 阅读 · 0 评论 -
D3D中的Alpha融合技术(1)
我们介绍一种叫做混合(blending)的技术,它允许我们混合像素,我们通常用已经光栅化的像素光栅化同一位置的像素。换句话说就是我们在图元上混合图元,这种技术允许我们完成多种特效。7.1混合因素观察图7.1,我们将一个红色的茶壶绘制在一个木质背景上。假设想让茶壶有一个透明度,以便我们能够透过茶壶看见背景(如图7.2)。我们怎样才能实现这个效果呢?我们只需要在木箱子上光栅化茶翻译 2012-04-11 13:45:06 · 220 阅读 · 0 评论 -
D3D中的模板缓存(1)
模板缓存是一个离屏缓存,我们能够用它来完成一些特效。模板缓存与后台缓存和深度缓存有相同的定义,因此在模板缓存中的像素与后台缓存和深度缓存中的像素是相协调的。就象名字所说,模板缓存就象一个模板它允许我们刷新渲染后缓存的某个部分。 举例,当要实现一个镜子时,我们只需要简单地反射一个物体细节到镜子平面上;然而,我们仅仅想只绘制镜子里的反射结果。我们能用模板缓存来渲染它,图8.1清楚的显示翻译 2012-04-11 13:47:25 · 279 阅读 · 0 评论