DirectX9.0 入门手册(2)

·创建IDirect3D接口

DirectX是一组COM组件,COM是一种二进制标准,每一个COM里面提供了至少一个接口,而接口就是一组相关的函数,我们使用DirectX,其实就是使用那些函数。COMC++中的类有点像,只不过COM使用自己的方法来创建实例。创建COM实例的一般方法是使用coCreateInstance函数。有关coCreateInstance的使用方法,可以参考有关COM方面的资料,这里暂时不详细说明了,因为DirectX提供了更简洁的方法来创建DirectX组件的实例。这一章我要讲的就是Direct3D组件的使用方法。

       为了使用D3D中的函数,我们得先定义一个指向IDirect3D9这个接口的指针,顺便说明一下,其实接口也是一个指针,所以我们定义的就是一个指向指针的指针,也即二重指针,为什么要使用二重指针呢,我暂时还不是很懂,所以先留着这个疑问吧^_^。定义完这个接口指针后,例如IDirect3D9 *g_pD3D;现在我们使用Direct3DCreate9这个函数来创建一个D3D接口:

       g_pD3D = Direct3DCreate9( D3D_SDK_VERSION );

       Direct3DCreate9这个函数只有一个参数,它表明要创建接口的版本。如果你想创建一个老的接口版本当然也可以,不过没有人会那样做吧。

       创建接口后就可以创建D3D设备了,什么是D3D设备?你可以想象为你机上的那块显卡!什么?你有几块显卡!!没关系,那就创建多几个D3D设备接口吧。创建D3D设备需要的参数很多,如果把那些参数都挤在一个函数里面,那就太长了,所以就把一些参数放进结构体里面,只要先设定好这些结构体,再把这些结构体当作参数传给创建D3D设备的函数,那就清晰多了。首先要讲的就是D3DPRESENT_PARAMETERS这个结构。下面是它的定义:

struct D3DPRESENT_PARAMETERS{

   UINT                BackBufferWidth;

   UINT                BackBufferHeight;

   D3DFORMAT           BackBufferFormat;

   UINT                BackBufferCount;
   D3DMULTISAMPLE_TYPE MultiSampleType;

   DWORD               MultiSampleQuality;
   D3DSWAPEFFECT       SwapEffect;

   HWND                hDeviceWindow;

   BOOL                Windowed;

   BOOL                EnableAutoDepthStencil;

   D3DFORMAT           AutoDepthStencilFormat;

   DWORD               Flags;
   UINT                FullScreen_RefreshRateInHz;

   UINT                PresentationInterval;

};

 

 

 

       BackBufferWidthBackBufferHeight后备缓冲的宽度和高度。在全屏模式下,这两者的值必需符合显卡所支持的分辨率。例如(800600),(640480)。

       BackBufferFormat后备缓冲的格式。这个参数是一个D3DFORMAT枚举类型,它的值有很多种,例如D3DFMT_R5G6B5,这说明后备缓冲的格式是每个像素16位,其实红色(R)占5位,绿色(G)占6位,蓝色(B)占5位,为什么绿色会多一位呢?据说是因为人的眼睛对绿色比较敏感。DX9只支持16位和32位的后备缓冲格式,24位并不支持。如果对这D3DFORMAT不熟悉的话,可以把它设为D3DFMT_UNKNOWN,这时候它将使用桌面的格式。

       BackBufferCount后备缓冲的数目,范围是从03,如果为0,那就当成1来处理。大多数情况我们只使用一个后备缓冲。使用多个后备缓冲可以使画面很流畅,但是却会造成输入设备响应过慢,还会消耗很多内存。

       MultiSampleTypeMultiSampleQuality这两个参数可以使你的渲染场景变得更好看,但是却消耗你很多内存资源,而且,并不是所有的显卡都支持这两者的所设定的功能的。在这里我们分别把它们设为D3DMULTISAMPLE_NONE0

       SwapEffect交换缓冲支持的效果类型。它是D3DSWAPEFFECT枚举类型,可以设定为以下三者之一:D3DSWAPEFFECT_DISCARDD3DSWAPEFFECT_FLIPD3DSWAPEFFECT_COPY。如果设定为D3DSWAPEFFECT_DISCARD,则后备缓冲区的东西被复制到屏幕上后,后备缓冲区的东西就没有什么用了,可以丢弃(discard)了。如果设定为D3DSWAPEFFECT_FLIP,则表示在显示和后备缓冲之间进行周期循环。设定D3DSWAPEFFECT_COPY的话,我也不太清楚有什么作用*^_^*。一般我们是把这个参数设为D3DSWAPEFFECT_DISCARD

       hDeviceWindow显示设备输出窗口的句柄

       Windowed如果为FALSE,表示要渲染全屏。如果为TRUE,表示要渲染窗口。渲染全屏的时候,BackBufferWidthBackBufferHeight的值就得符合显示模式中所设定的值。

       EnableAutoDepthStencil如果要使用Z缓冲,则把它设为TRUE

       AutoDepthStencilFormat如果不使用深度缓冲,那么这个参数将没有用。如果启动了深度缓冲,那么这个参数将为深度缓冲设定缓冲格式(和设定后备缓冲的格式差不多)

       Flags可以设置为0D3DPRESENTFLAG_LOCKABLE_BACKBUFFER。不太清楚是用来做什么的,看字面好像是一个能否锁定后备缓冲区的标记。

       FullScreen_RefreshRateInHz显示器的刷新率,单位是HZ,如果设定了一个显示器不支持的刷新率,将会不能创建设备或发出警告信息。为了方便,一般设为D3DPRESENT_RATE_DEFAULT就行了。

       PresentationInterval如果设置为D3DPRENSENT_INTERVAL_DEFAULT,则说明在显示一个渲染画面的时候必要等候显示器刷新完一次屏幕。例如你的显示器刷新率设为80HZ的话,则一秒内你最多可以显示80个渲染画面。另外你也可以设置在显示器刷新一次屏幕的时间内显示14个画面。如果设置为D3DPRENSENT_INTERVAL_IMMEDIATE,则表示可以以即时的方式来显示渲染画面,虽然这样可以提高帧速(FPS),但是却会产生图像撕裂的情况。

·创建IDirect3DDevice接口

       当你把D3DPRESENT_PARAMETERS的参数都设置好后,就可以创建一个D3D设备了,和创建D3D接口一样,先定义一个接口指针IDirect3DDevice9 * g_pD3DDevice;然后使用D3D接口里面的CreateDevice函数来创建设备。CreateDevice的声明为:

       HRESULT CreatDevice(

              UINT Adapter,

              D3DDEVTYPE DeviceType,

              HWND hFocusWindow,

              DWORD BehaviorFlags,

              D3DPRESENT_PARAMETERS *pPresentationParameters,

              IDirect3DDevice9** ppReturnedDeviceInterface

       };

       第一个参数说明要为哪个设备创建设备指针,我之前说过一台机可以有好几个显卡,这个参数就是要指明为哪块显卡创建可以代表它的设备指针。但是我怎么知道显卡的编号呢?可以使用D3D接口里面的函数来获得,例如GetAdapterCounter可以知道系统有几块显卡;GetAdapterIdentifier可以知道显卡的具体属性。一般我们设这个参数为D3DADAPTER_DEFAULT

       第二个参数指明正在使用设备类型。一般设为D3DEVTYPE_HAL

       第三个参数指明要渲染的窗口。如果为全屏模式,则一定要设为主窗口。

       第四个参数是一些标记,可以指定用什么方式来处理顶点。

       第五个参数就要用到上面所讲的D3DPRESENT_PARAMETERS

       第六个参数是返回的接口指针。

·开始渲染

       有了设备接口指针,就可以开始渲染画面了。渲染是一个连续不断的过程,所以必定要在一个循环中完成,没错,就是第一章讲的那个消息循环。在渲染开始之前我们要用IDirect3DDevice9::Clear函数来清除后备缓冲区。

HRESULT Clear(

   DWORD Count,

   const D3DRECT *pRects,

   DWORD Flags,

   D3DCOLOR Color,

   float Z,

   DWORD Stencil

);

 

 

 

       Count说明你要清空的矩形数目。如果要清空的是整个客户区窗口,则设为0

       pRects这是一个D3DRECT结构体的一个数组,如果count中设为5,则这个数组中就得有5个元素。

       Flags一些标记组合。只有三种标记:D3DCLEAR_STENCIL , D3DCLEAR_TARGET , D3DCLEAR_ZBUFFER

       Color清除目标区域所使用的颜色。

       float设置Z缓冲的Z初始值。小于或等于这个Z初始值的Z值才会被改写,但它的值只能取01之间。如果还不清楚什么是Z缓冲的话,可以自己找相关资料看一下,这里不介绍了,呵呵。

       Stencil设置模板缓冲的初始值。它的取值范围是02n次方减1。其中n是模板缓冲的深度。

       清除后备缓冲区后,就可以对它进行渲染了。渲染完毕,使用Present函数来把后备缓冲区的内容显示到屏幕上。

HRESULT Present(

   const RECT *pSourceRect,

   const RECT *pDestRect,

   HWND hDestWindowOverride,

   const RGNDATA *pDirtyRegion

);

 

 

 

       pSourceRect你想要显示的后备缓冲区的一个矩形区域。设为NULL则表示要把整个后备缓冲区的内容都显示。

       pDestRect表示一个显示区域。设为NULL表示整个客户显示区。

       hDestWindowOverride你可以通过它来把显示的内容显示到不同的窗口去。设为NULL则表示显示到主窗口。

       pDirtyRegion高级使用。一般设为NULL

相关推荐
DirectX 9 3D游戏设计入门》 1 第一部分 必备的数学知识 (Mathematical Prerequisites) 10 目标 10 三维空间中的向量 11 向量相等 13 计算向量大小(向量的模) 14 标准化向量 14 向量相加 15 向量相减 16 标量与向量的乘积 16 点积 17 叉积 17 矩阵 18 相等、数乘矩阵以及相加 19 乘法 19 单位矩阵 20 逆转 21 矩阵的转置 21 D3DX 矩阵 22 基本变换 24 矩阵平移 25 矩阵旋转 26 矩阵缩放 28 综合变换 29 一些向量变换函数 30 平面 31 D3DX平面 31 点和平面的空间关系 32 创建平面 32 标准化平面 33 变换平面 34 点到平面上最近的点 34 射线(可选的) 35 射线 35 线/面相交 35 摘要(略) 36 第二部分 Direct3D基础 (Direct3D Fundamentals) 37 第一章 初始化Direct3D (Direct3D Initialization) 37 目标 37 1.1 Direct3D概述 37 1.1.1 REF设备 38 1.1.2 D3DDEVTYPE 38 1.2 COM 38 1.3 一些准备工作 38 1.3.1 表面 39 1.3.2 Multisampling 40 1.3.3像素格式 41 1.3.4 内存池 41 1.3.5 交换链和页面切换 41 1.3.6 深度缓冲 42 1.3.7 顶点处理 43 1.3.8 设备能力 43 1.4 初始化Direct3D 44 1.4.1获得IDirect3D9接口 44 1.4.2 检测硬件顶点处理 45 1.4.3 填充D3DPRESENT_PARAMETERS结构 46 1.4.4 创建IDirect3DDevice9对象 47 1.5 初始化Direct3D实例 48 1.5.1 d3dUtility.h/cpp 49 1.5.2 实例框架 50 1.5.3 D3D Init实例 51 1. 6摘要(略) 53 第二章 渲染管线 (The Rendering Pipeline) 54 目标 54 2.1表现模型 54 2.1.1 顶点格式 55 2.1.2 三角形 56 2.1.3 索引 57 2.2虚拟照相机 57 2.3 渲染管线 58 2.3.1自身坐标系(Local Space) 59 2.3.2世界坐标系(World Space) 59 2.3.3视图坐标系(View Space) 60 2.3.4背面拣选(Backface Culling) 61 2.3.5光源(Lighting) 62 2.3.6裁剪(Clipping) 63 2.3.7投影(Projection) 63 2.3.8视口变换(Viewport Transform) 65 2.3.9光栅化(Rasterization) 66 2.4 摘要() 66 第三章 在Direct3D中绘制 (Drawing in Direct3D) 67 目标 67 3.1顶点/索引缓存 67 3.1.1创建一个顶点和索引缓存 67 3.1.2 访问缓冲内存 69 3.1.3 找回顶点和索引缓存信息 70 3.2 渲染状态 70 3.3 绘制准备 71 3.4用顶点/索引缓存绘制 71 3.4.1 IDirect3DDevice9::DrawPrimitive 72 3.4.2 IDirect3DDevice9::DrawIndexedPrimitive 72 3.4.3 开始/结束场景 73 3.5 D3DX几何物体 73 3.6 实例程序:三角形、立方体、茶壶、D3DXCreate* 75 3.7 摘要(略) 79 第四章 色彩 (Color) 80 目标 80 4.1 颜色表示法 80 4.2 顶点颜色 82 4.3 着色处理 83 4.4 实例程序:彩色三角形 83 4.5 摘要() 85 第五章 灯光 (Lighting) 86 目标 86 5.1灯光的组成 86 5.2材质 87 5.3顶点法线 88 5.4光源 90 5.5实例程序:灯光 93 5.6附加实例 95 5.7摘要() 96 第六章 纹理 (Texturing) 97 目标 97 6.1 纹理坐标 97 6.2创建并赋予材质 99 6.3过滤器 99 6.4 Mipmaps 100 6.4.1 Mipmaps过滤器 101 6.4.2 Direct3D中使用Mipmaps 101 6.5 寻址模式 101 6.6实例程序:有纹理的方块 103 5. 7摘要() 105 第七章 混合 (Blending) 106 目标 106 7.1混合因素 106 7.2混合要素 108 7.3透明度 108 7.3.1Alpha通道 108 7.3.2指定Alpha资源 109 7.4使用DirectX纹理工具创建Alpha通道 109 7.5实例程序:透明度 111 7.6摘要() 113 第八章 模版 (Stenciling) 114 目标 115 8.1使用模版缓存 115 8.1.1请求一个模版缓存 115 8.1.2模版测试 115 8.1.3控制模版测试 116 8.1.3.1模版参考值(Reference Value) 116 8.1.3.2模版掩码 116 8.1.3.3模版值(Stencil Value) 116 8.1.3.4比较运算 116 8.1.3更新模版缓存 117 8.1.4模版写掩码 118 8.2实例程序:镜子 118 8.2.1反射数学 118 8.2.2镜面实现流程 120 8.2.3代码和解释 121 8.2.3.1第一部分 121 8.2.3.2第二部分 122 8.2.3.3第三部分 122 8.2.3.4第四部分 123 8.2.3.5第五部分 123 8.3实例程序:平面阴影 124 8.3.1平行光阴影 125 8.3.2点光源阴影 126 8.3.3阴影矩阵 126 8.3.4用模版缓存防止双倍混合 127 8.3.5代码和解释 128 8.4摘要() 129 第三部分 实用的Direct3D (Applied Direct3D) 130 第九章 字体 (Fonts) 130 目标 130 9.1 ID3DXFont 130 9.1.1创建一个ID3DXFont 130 9.1.2绘制文本 131 9.1.3计算每秒的渲染帧数 131 9.2 CD3DFont 132 9.2.1创建一个CD3DFont 132 9.2.2绘制文本 133 9.2.3 清除 133 9.3 D3DXCreateText 133 9.4摘要() 135 第十章 网格模型I (Meshes Part I) 136 目标 136 10.1 几何信息 136 10.2 子集和属性缓存 137 10.3 绘制 138 10.4 优化 138 10.5 属性表 140 10.6 邻接信息 141 10.7 复制 142 10.8 创建一个Mesh(D3DXCreateMeshFVF) 143 10.9 实例程序:创建和渲染Mesh 144 10.10 摘要() 148 第十一章 网格模型II (Building a Flexible Camera Class) 149 目标 149 11.1 ID3DXBuffer 149 11.2 X文件 150 11.2.1读取X文件 150 11.2.2 X文件的材质 151 11.2.3 实例程序:X文件 151 11.2.4 产生顶点法线 154 11.3渐进网格(Progressive Meshes) 155 11.3.1 产生一个渐进网格 156 11.3.2 顶点品质权重 156 11.3.3 ID3DXPMesh方法 157 11.3.4实例程序:渐进网格 158 11.4 界线容积(Bounding Volumes) 160 11.4.1一些新的特殊常量 162 11.4.2界线容积类型 162 11.4.3实例程序:界线容积 163 11.5 摘要() 165 第十二章 创建灵活的摄像机类 (Building a Flexible Camera Class) 166 目标 166 12.1 摄像机设计 166 12.2 执行详细资料 168 12.2.1计算视图矩阵 168 12.2.1.1 第一部分:平移 168 12.2.1.2 第二部分:旋转 169 12.2.1.3 将两部分合并 169 12.2.2围绕任意轴旋转 170 12.2.3 Pitch、Yaw和Roll 171 12.2.4 Walking、Strafing和Flying 173 12.3实例程序:摄像机 174 12.4 摘要 176 第十三章 地形渲染基础 (Basic Terrain Rendering) 177 目标 177 13.1 Heightmaps(高度图) 177 13.1.1 创建高度图(Heightmap) 178 13.1.2 读取RAW文件 179 13.1.3 访问与修改Heightmap 180 13.2 生成地形几何数据 180 13.2.1 计算顶点 182 13.2.2 计算索引-定义三角形 184 13.3 纹理 186 13.3.1 程序上的处理方法 186 13.4 光照 189 13.4.1概览(OVERVIEW) 189 13.4.2 计算方格的阴影(Shade) 190 13.4.3 地形阴影(Shading) 191 13.5 在地形上“行走” 192 13.6 例子程序: Terrain 194 13.7 一些改进 196 13.8 摘要 197 第十四章 粒子系统 (Particle Systems) 198 目标: 198 14.1 粒子和点精灵(Point Sprite) 198 14.1.1 结构的格式 198 14.1.2点精灵(Point Sprite)渲染状态 199 14.1.3 粒子和他们的属性 200 14.2 粒子系统的组成 201 14.2.1 绘制粒子系统 205 14.2.2 随机 209 14.3 具体的粒子系统:雪、火、粒子枪 209 14.3.1 例子程序:雪 210 14.3.2 例子程序:火 212 14.3.3 例子程序:粒子枪 214 14.4 摘要 216 第十五章 选取 (Picking) 217 概览(OVERVIEW) 217 目标 218 15.1 屏幕到投影窗口的转换 218 15.2 计算射线 220 15.3 变换射线 220 15.4 射线-对象 交点 221 15.5 例子程序:选取 223 15.6 摘要 224 第四部分 着色器和特效 (Shaders and Effects) 225 第十六章 高级着色器语言入门 (Introduction to the High-Level Shading Language) 225 目标 225 16.1 编写HLSL 着色器 226 16.1.1 全局变量 227 16.1.2 输入和输出结构 227 16.1.3 函数的入口点 228 16.2 编译HLSL 着色器 229 16.2.1 常量表 229 16.3 变量类型 233 16.3.2 向量类型 234 16.3.3 矩阵类型 235 16.3.4 数组 236 16.3.5 结构 236 16.3.6 typedef关键字 237 16.4关键字、语句和强制转换 238 16.4.1 关键字 238 16.4.2 基本程序流程 238 16.4.3 强制转换(casting) 239 16.5 操作符 239 16.6 用户定义函数 241 16.7内建函数 242 16.8 摘要 244 第十七章 顶点着色器入门 (Introduction to Vertex Shaders) 245 概览 245 目标 246 17.1顶点声明 246 17.1.1 描述顶点声明 246 17.1.2 创建顶点声明 248 17.1.3 使用一个顶点声明 249 17.2顶点数据用途 249 17.3使用顶点着色器的步骤 250 17.3.1 编写并编译顶点着色器 251 17.3.2 创建顶点着色器 251 17.3.3 建立顶点着色器 251 17.3.4 销毁顶点着色器 252 17.4样例应用程序:散射光照 252 17.5 卡通渲染 257 17.5.1 卡通着色 258 17.5.2 卡通着色的顶点着色器代码 259 17.5.3轮廓勾勒 260 17.5.4 轮廓边顶点着色器代码 263 17.6 摘要 265 第十八章 像素着色器入门 (Introduction to Pixel Shaders) 266 目标 266 18.1多纹理化概览 266 18.1.1 允许多个纹理 268 18.1.2 多纹理坐标 269 18.2像素着色器输入和输出 269 18.3使用像素着色器的步骤 270 18.3.1 编写并编译像素着色器 270 18.3.2 创建像素着色器 271 18.3.3 建立像素着色器 271 18.3.4 销毁像素着色器 271 18.4 HLSL采样器对象 272 18.5 例子程序:Multitexturing in a Pixel Shader 273 18.6 摘要 280 第十九章 效果架构 (The Effects Framework) 281 概览 281 目标 281 19.1 技术与传递(Techniques and Passes) 281 19.2 更多HLSL内置对象( More HLSL Intrinsic Objects) 282 19.2.1 纹理对象 283 19.2.2 采样器对象与采样器状态 283 19.2.3 顶点与像素着色器对象(Vertex and Pixel Shader Objects) 283 19.2.4 字符串 284 19.2.5 注解 (Annotations) 285 19.3 效果文件的设备状态( Device States in an Effect File) 285 19.4 创建效果 286 19.5 设置系数(Setting Constants) 287 19.6 使用效果 289 19.6.1 获得效果句柄( Obtaining a Handle to an Effect) 289 19.6.2 激活一个效果( Activating an Effect) 289 19.6.3 启动效果 290 19.6.4 设置当前的渲染传递(Setting the Current Rendering Pass) 290 19.6.5 结束效果(Ending an Effect) 290 19.6.6 例子 290 19.7 例子程序: Lighting and Texturing in an Effect File 291 19.8例子程序: Fog Effect 296 19.9例子程序: Cartoon Effect 298 19.10 效果编辑(EffectEdit) 299 19.11摘要 300 略 300 相关文章: 301 AGP内存 301 Direct3D中实现图元的鼠标拾取 303 1、什么是拾取,拾取能做什么? 303 2、拾取操作的步骤和实现 303 3、结束及声明 309 4、参考文献 310 克莱姆(Cramer)法则 311 一、线性方程组 311 三、齐次线性方程组 313 四、例子 314
©️2020 CSDN 皮肤主题: 技术工厂 设计师:CSDN官方博客 返回首页