【阅读笔记之三】《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日


 


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
零资源分下载,分享精神至上~ 4.0版新加入雪花飞扬天气模拟粒子系统,效果非常华丽。 提醒大家一下,可在SnowParticleClass.h中的PARTICLE_NUMBER宏中改变雪花粒子数量,默认粒子数量为10000,我1G显存的显卡取10万粒子数量帧数就只有8帧了。所以要自己改粒子数量的话请根据自己的显卡性能酌情选择,如果你取个非常大的50万粒子数量,显卡吃不消烧了可别怪我- - 其中的3D人物模型来自英雄无敌6。 背景音乐为魔兽暗夜精灵战斗曲主题曲。 一个综合型的Direct3D示例程序的4.0版。 用键盘上W,A,S,D,I,J,K,L,↑,↓,←,→12个键加上鼠标在美丽的三维空间中翱翔。包括了Direct3D初始化,DirectInput输入处理,顶点缓存,光照与材质,文字输出,颜色,纹理贴图,四大变换,网格模型,X文件载入等等知识(当然还有默认被开启的深度缓存),以及地形系统模拟,三维天空模拟,粒子系统。 源码的配套博文是 《【Visual C++】游戏开发五十 浅墨DirectX教程十八 雪花飞扬:实现唯美的粒子系统》 ,文章地址为http://blog.csdn.net/zhmxy555/article/details/8744805, 点击Release文件夹下的exe文件可以直接看到运行效果,运行需要DirectX运行库的支持。报缺少D3D的DLL系列错误的童鞋们请google/百度一下 “DirectX 9.0c runtime”,下载并装个最新版的。 报缺少MVCR100D.Dll错误的朋友们去下一个安装就可以了,或者直接点击sln打开工程再次编译一次。 如果是想调试并运行源代码,但是报错了,请去下载最新版DirectX SDK并进行DirectX开发环境的配置。 编写环境:VS2010 我的博客地址是http://blog.csdn.net/zhmxy555,源码结合配套文章一起看效果更佳。 希望能和大家一起交流,共同学习,共同进步。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值