【阅读笔记之三】《DIRECTX.9.0.3D游戏开发编程基础》:Direct3D初始化

Direct3D初始化

  一、Direct3D初始化预备知识

          1. 表面

            表面是Direct3D主要用于存储2D图像数据的一个像素矩阵。其组成部分如下图:

            表面的宽度(width)和高度(height)都用像素来度量。跨度(pitch)则用字节来度量。代码中我们用接口 IDirect3DSurface9(一种COM类)来描述表面。接口IDirect3DSurface9最重要的方法如下:

            1) LockRect  用于获取指向表面存储区的指针。通过指针运算,可对每一个像素进行操作。

            2) UnlockRect  如果调用了LockRect方法,而且已经执行完访问表面存储区的操作,必须调用该方法解除对表面存储区的锁定。

            3) GetDesc 该方法可以通过填充结构D3DSURFACE_DESC来获取表面的描述信息。

如下代码提供了锁定表面存储区以及将每个像素设为红色的代码段的代码:

// 假设 _surface是指向IDirect3DSurface9接口的指针
// 假设每个像素点是32位像素格式

// 获取表面描述信息
D3DSURFACE_DESC surfaceDesc;
_surface->GetDesc(&surfaceDesc);

// 获取指向表面像素数据的指针
D3DLOCKED_DESC lockedRect;
_surface->LockRect(
					&lockedRect,	//获取锁定数据的指针
					0,				//锁定整个表面
					0);				//无特定锁定标志

// 设置每个像素为红色
DWORD *imagedata = (DOWRD *) lockedRect.pBits;
for(int i=0;i<surfaceDesc.Height;i++)
{
	for(int j=0;j<surfaceDesc.Width;j++)
	{
		int index=i*lockedRect.Pitch/4 + j;
		imagedata[index] = 0xffff0000;			//红色
	}
}

_surface->UnlockRect();


其中,D3DLOCKED_RECT的定义如下

typedef struct _D3DLOCKED_RECT{
    INT Pitch;      //表面跨度
   void *pBits;  //指开表面存储区开始指针
}D3DLOCKED_RECT;
                     

        

         2. 多重采样

         用像素矩阵表示图像时往往会出现块状效应,多重采样是用于平滑块状图像的技术。采样有多种采样级别,用D3DMULTISAMPLE_TYPE枚举类型表示,这些值包括

          D3DMULTISAMPLE_NONE 禁止多重采样

          D3DMULTISAMPLE_1_SAMPLE...D3DUTISAMPLE_16_SAMPLE   1~16级多重采样

          多重采样会大大降低程序运行速度。使用该技术前,需要用IDirect3D9::CheckDeviceMultiSampleType方法来检查图形设备是否支持所希望采用多重采用类型。

 

          3. 像素格式

          创建表面和纹理(texture)需要指定这些Direct3D资源的像素格式。像素格式用D3DFORMAT枚举类型常量来表示。下面是常见格式。

          D3DFMT_R8G8B8,D3DFMT_X9R9G9B9,D3DFMT_A8R8G8B8...

 

          4. 内存池

          表面和其他Direct3D资源可以放入许多类型的内存池中。内存类型用D3DPOOL枚举类型表示。可用内存池包括D3DPOOL_DEFAULT, D3DPOOL_MANAGE等。

          

         5. 交换链和页面置换

         Direct3D维护一个表面集合,该集合通常由两到三个表面组成,称为交换链(Swap Chain)。该集合用接口IDirect3DSwapChain9来表示。交换链和页面置换技术(Page Flipping)主要用于生成更加平滑的动画。

 

         6. 深度缓存

        深度缓存(depth buffer)是只含有一个特定像素的深度信息而不含有图像数据的表面。深度缓存为最终绘制的图像中每一个像素都保存了一个深度项(entry)。

 

        7. 顶点运算

        顶点是3D几何学中的基本元素。在Direct3D中,可用两种不同的方式进行顶点运算(Vertex Processing),即软件顶点运算和硬件顶点运算。

 

        8. 设备性能

        Direct3D所提供的每一项性能都对应于结构D3DCAPS9中的一个数据成员或某一位。我们的想法是,首先某一具体硬件为基础,初始化一个D3DCAPS9类型的实例,然后在应用程序中通过检查该D3DCAPS9实例相应的数据成员或者位来判断设备是否支持某项特性。例如我们发现数据成员 D3DCAPS9::DevCaps 的D3DDEVCAPS_ HWTRANSFORMANDELIGHT位可用来表示该设备是否支持变换和光照的硬件计算。

 

        Direct3D初始化的知识到这里就结束了。下面开始正式地讲解Direct3D的初始化(附代码)。

 

    二、Direct3D初始化

        初始化Direct3D大致步骤如下:

          1. 获取接口 IDirect3D9 的指针。该接口用于获取系统中物理硬件设备的信息并创建接口 IDirect3DDevice9 该接口是一个C++对象,代表我们用来显示3D图形的物理硬件设备。

          2. 检查设备性能(D3DCAPS9),判断主显卡是否支持顶点运算。为了创建IDirect3DDevice9,必须明确显卡是否支持该功能。

          3. 初始化 D3DPRESENT_PARAMETERS 结构的一个实例。该结构由许多数据成员组成,我们可以通过这些变量来指定即将创建的接口IDirect3DDevice9的特性。

          4. 利用已经初始化的D3DPRESENT_PARAMETER结构创建IDirect3DDevice9对象(一个C++对象,代表了我们用来显示3D图形的物理硬件设备)。

         

#ifndef __d3dUtilityH__
#define __d3dUtilityH__

#include <d3dx9.h>
#include <string>

namespace d3d
{
	bool InitD3D(                      //初始化DirectX3D
		HINSTANCE hInstance,       // [in] Application instance.
		int width, int height,     // [in] Backbuffer dimensions.
		bool windowed,             // [in] Windowed (true)or full screen (false).
		D3DDEVTYPE deviceType,     // [in] HAL or REF
		IDirect3DDevice9** device);// [out]The created device.

	int EnterMsgLoop( //消息循环
		bool (*ptr_display)(float timeDelta));

	LRESULT CALLBACK WndProc(
		HWND hwnd,
		UINT msg, 
		WPARAM wParam,
		LPARAM lParam);

	template<class T> void Release(T t)
	{
		if( t )
		{
			t->Release();
			t = 0;
		}
	}
		
	template<class T> void Delete(T t)
	{
		if( t )
		{
			delete t;
			t = 0;
		}
	}
}

#endif // __d3dUtilityH__

       

      详细的Direct3D初始化在下篇文章。给出连接http://blog.csdn.net/chenwu_843402773/article/details/8077935

 

                                                                                                                       ————Josh 2012年10月14日


 


 

目录: 第Ⅰ部分 基础知识 必备的数学知识 3D空间中的向量 向量相等 计算向量的长度 向量的规范化 向量加法 向量减法 数乘 点积 叉积 矩阵 矩阵相等、矩阵数乘和矩阵加法 矩阵乘法 单位矩阵 逆矩阵 矩阵的转置 D3DX矩阵 基本变换 平移矩阵 旋转矩阵 比例变换矩阵 几何变换的组合 向量变换的一些函数 平面(选读) D3DXPLANE 点和平面的空间关系 平面的创建 平面的规范化 平面的变换 平面中到某一点的最近点 射线(选读) 射线 射线与平面的相交 小结    第Ⅱ部分 Direct3D基础 第1章 初始化Direct3D 1.1 Direct3D概述 1.1.1 REF设备 1.1.2 D3DDEVTYPE 1.2 COM(组件对象模型) 1.3 预备知识 1.3.1 表面 1.3.2 多重采样 1.3.3 像素格式 1.3.4 内存池 1.3.5 交换链和页面置换 1.3.6 深度缓存 1.3.7 顶点运算 1.3.8 设备性能 1.4 Direct3D初始化 1.4.1 获取接口IDirect3D9的指针 1.4.2 校验硬件顶点运算 1.4.3 填充D3DPRESENT_PARAMETER结构 1.4.4 创建IDirect3DDevice9 接口 1.5 例程:Direct3D初始化 1.5.1 d3dUtility.h/cpp 1.5.2 例程框架 1.5.3 例程:D3D初始化 1.6 小结 第2章 绘制流水线 2.1 模型表示 2.1.1 顶点格式 2.1.2 三角形单元 2.1.3 索引 2.2 虚拟摄像机 2.3 绘制流水线 2.3.1 局部坐标系 2.3.2 世界坐标系 2.3.3 观察坐标系 2.3.4 背面消隐 2.3.5 光照 2.3.6 裁剪 2.3.7 投影 2.3.8 视口变换 2.3.9 光栅化 2.4 小结 第3章 Direct3D中的绘制 3.1 顶点缓存与索引缓存 3.1.1 创建顶点缓存和索引缓存 3.1.2 访问缓存内容 3.1.3 获取顶点缓存和索引缓存的信息 3.2 绘制状态 3.3 绘制的准备工作 3.4 使用顶点缓存和索引缓存进行绘制 3.4.1 IDirect3DDevice9::DrawPrimitive 3.4.2 IDirect3DDevice9::DrawIndexedPrimitive 3.4.3 Begin/End Scene 3.5 D3DX几何体 3.6 例程:三角形、立方体、茶壶、D3DXCreate* 3.7 小结 第4章 颜色 4.1 颜色表示 4.2 顶点颜色 4.3 着色 4.4 例程:具有颜色的三角形 4.5 小结 第5章 光照 5.1 光照的组成 5.2 材质 5.3 顶点法线 5.4 光源 5.5 例程:光照 5.6 一些附加例程 5.7 小结 第6章 纹理映射 6.1 纹理坐标 6.2 创建并启用纹理 6.3 纹理过滤器 6.4 多级渐进纹理 6.4.1 多级渐进纹理过滤器 6.4.2 使用多级渐进纹理 6.5 寻址模式 6.6 例程:纹理四边形 6.7 小结 第7章 融合技术 7.1 融合方程 7.2 融合因子 7.3 透明度 7.3.1 Alpha通道 7.3.2 指定Alpha来源 7.4 用DirectX Texture Tool 创建Alpha通道 7.5 例程:透明效果 7.6 小结 第8章 模板 8.1 模板缓存的使用 8.1.1 模板缓存格式的查询 8.1.2 模板测试 8.1.3 模板测试的控制 8.1.4 模板缓存的更新 8.1.5 模板写掩码 8.2 例程:镜面效果 8.2.1 成像中的数学问题 8.2.2 镜面效果实现概述 8.2.3 代码解析 8.3 例程:Planer Shadows 8.3.1 平行光阴影 8.3.2 点光源产生的阴影 8.3.3 阴影矩阵 8.3.4 使用模板缓存防止二次融合 8.3.5 代码解析 8.4 小结 第Ⅲ部分 Direct3D的应用 第9章 字体 9.1 ID3DXFont接口 9.1.1 创建一个ID3DXFont 接口对象 9.1.2 绘制文本 9.1.3 计算每秒绘制的帧数 9.2 CD3DFont 9.2.1 创建CD3DFont类的实例 9.2.2 绘制文本 9.2.3 清理 9.3 D3DXCreateText函数 9.4 小结 第10章 网格(一) 10.1 几何信息 10.2 子集和属性缓存 10.3 绘制 10.4 网格优化 10.5 属性表 10.6 邻接信息 10.7 克隆 10.8 创建网格(D3DXCreateMeshFVF) 10.9 例程:网格的创建与绘制 10.10 小结 第11章 网格(二) 11.1 ID3DXBuffer 11.2 XFile 11.2.1 加载XFile文件 11.2.2 XFile材质 11.2.3 例程:XFile 11.2.4 生成顶点法线 11.3 渐进网格 11.3.1 生成渐进网格 11.3.2 顶点属性权值 11.3.3 ID3DXPMesh接口方法 11.3.4 例程:Progressive Mesh 11.4 外接体 11.4.1 一些新的特殊常量 11.4.2 外接体的类型 11.4.3 例程:Bounding Volumes 11.5 小结 第12章 设计一个灵活的Camera类 12.1 Camera类的设计 12.2 实现细节 12.2.1 观察矩阵(取景变换矩阵, View Matrix)的计算 12.2.2 绕任意轴的旋转 12.2.3 俯仰、偏航和滚动 12.2.4 行走、扫视和升降 12.3 例程:Camera 12.4 小结 第13章 地形绘制基础 13.1 高度图 13.1.1 创建高度图 13.1.2 加载RAW文件 13.1.3 访问和修改高度图 13.2 创建地形几何信息 13.2.1 顶点的计算 13.2.2 索引的计算 13.3 纹理映射 13.4 光照 13.4.1 概述 13.4.2 坐标方格的明暗度计算 13.4.3 对地形进行着色 13.5 在地形中“行走” 13.6 例程:Terrain 13.7 一些改进 13.8 小结 第14章 粒子系统 14.1 粒子和点精灵 14.1.1 结构格式 14.1.2 点精灵的绘制状态 14.1.3 粒子及其属性 14.2 粒子系统的组成 14.2.1 绘制一个粒子系统 14.2.2 随机性 14.3 具体的粒子系统 14.3.1 例程:Snow System 14.3.2 例程:Firework 14.3.3 例程:Particle Gun 14.4 小结 第15章 拾取 15.1 屏幕到投影窗口的变换 15.2 拾取射线的计算 15.3 对射线进行变换 15.4 射线/物体相交判定 15.5 例程:Picking 15.6 小结
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值