始化DirectX步骤

Opengl和DirectX的区别

底层区别: Direcx 使用的是行向量,openg! 是列向量
应用领域区别:计算机图形学爱用OpenGL,游戏开发爱用DirectX
在游戏开发领域: DirectX 是必选项,OpenGL 是可选项。

初始化DirectX

(1)(以防万一-)安装DirectX

(2)获取编译好的DirectX文件和初始化代码文件

在微信公众号.上点击学习资料获取网盘地址

(3)新建win32空项目

从0开发游戏引擎---初始化DirectX_缓存


从0开发游戏引擎---初始化DirectX_游戏引擎_02


从0开发游戏引擎---初始化DirectX_游戏引擎_03

(4)添加DirectX路径

添加VC++ 路径

从0开发游戏引擎---初始化DirectX_缓存_04

(5)在链接器重设置输入

从0开发游戏引擎---初始化DirectX_缓存_05


从0开发游戏引擎---初始化DirectX_缓存_06

(6)添加代码

把文件中代码添加到项目中

(7)运行

如果出现黑窗口则表示成功

从0开发游戏引擎---初始化DirectX_3d_07

VS2008 C++ 项目怎样添加“依赖”、“库目录”和“包含目录”

初始化DirectX四部曲

从0开发游戏引擎---初始化DirectX_游戏引擎_08

创建窗口和消息循环代码复习

HAL和REF

HAL—硬件抽象层直接与硬件对话

这一层通常是来自硬件供货商的
设备驱动程序,您通过常规DirectX调用直接与它通信。当硬件设备
支持您请求的功能时,将使用HAL,从而得到硬件加速。

REF—参考光栅设备(reference rasterizer device)

有时,DirectX3D 提供的某些功能不为您的图形设备支持,但是
您仍然希望使用该功能。为了满足这种需求,Direct3D 提供了
参考光栅设备(reference rasterizer device),即REF设备,它能以软.
件运算方式完全支持Direct3DAPI.

但是注意,REF无法发布给最终用户。此外,REF速度非常缓慢,在

COM(组件对象模型)

COM ( Component Object Model,组件对象模型)是一项能够使用DirectX独立与编程语言并具备向下兼容的技术。我们厂称COM对象为接口,可将其视为一个C++类来使用。我们所必须知道的仅仅是如何通过某个特定函数或另一个COM接口的方法来获取指向某一个接
口的指针;创建COM接口时不可使用C++的关键字new,此外,使用完一个接口,应调用该接口响应的Release方法(所有的COM接口的功能都继承自COM接口lUnknow, 该接口提供了Release 方法)而不是C++的delete.

初始化Direct3D四部曲

(1)获取接口IDirect3D9 的指针。该接口用于获取系统中物理硬件
设备的信息并创建接口lDirect3DDevice9,该接口是一个C++对象,代
表了我们用来显示3D图形的物理硬件设备。
(2)检查设备性能(D3DCAPS9) ,判断主显卡是否支持硬件顶点运.
算。为了创建接口lDirect3DDevice9,我们必须明确显示是否支持该

::MessageBox前面::的作用

可以确保调用的是 Windows API 中的 MessageBox 函数,而不是某个其他命名空间中的同名函数。

这段代码是 Direct3D 应用程序的初始化部分,负责创建 Direct3D 设备并配置其属性。

步骤 1:创建 IDirect3D9 对象

使用 Direct3DCreate9 函数创建 IDirect3D9 对象,该对象用于管理 Direct3D 设备和资源。

步骤 2:检查硬件顶点运算支持

使用 GetDeviceCaps 方法检查硬件设备的性能和功能。根据硬件支持的顶点处理能力,选择相应的顶点处理模式(硬件或软件)。

步骤 3:填充 D3DPRESENT_PARAMETERS 结构

填充 D3DPRESENT_PARAMETERS 结构体,该结构描述了要创建的设备的呈现参数,如后台缓冲区的大小、格式、刷新率等。

步骤 4:创建设备

使用 CreateDevice 方法创建 Direct3D 设备,指定所需的适配器、设备类型、窗口句柄等参数,并传递填充好的呈现参数结构体。
CreateDevice 方法会尝试创建与所选设备和参数匹配的 Direct3D 设备。

在这个过程中,::MessageBox 用于显示失败的消息框,:: 用于指定全局作用域,确保调用的是 Windows API 中的 MessageBox 函数。

详细参数介绍

// Step 1: Create the IDirect3D9 object.
	//步骤1:获取我们硬件设备信息
	//函数Direct3DCreate9的参数必须是D3D_SDK_VERSION,只有如此方能保证应用程序使用正确的头文件。如果该函数调用失败,将返回一
	//个NULL指针
	IDirect3D9* d3d9 = 0;
    d3d9 = Direct3DCreate9(D3D_SDK_VERSION);

    if( !d3d9 )
	{
		::MessageBox(0, "Direct3DCreate9() - FAILED", 0, 0);
		return false;
	}

	// Step 2: Check for hardware vp.
	//步骤2:检查硬件是否支持顶点运算
	D3DCAPS9 caps;
	//UINT Adapter:指定物理显卡的序号
	//D3DDEVTYPE DeviceType:指定设备类型(例如硬件设备D3DDEVTYPE_HAL)或软件设备(D3DDEVTYPE_REF)
	//D3DCAPS9 *pCaps:返回已初始化的设备性能结构实例
	d3d9->GetDeviceCaps(D3DADAPTER_DEFAULT, deviceType, &caps);

	int vp = 0;
	if( caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT )
		//硬件顶点运算
		vp = D3DCREATE_HARDWARE_VERTEXPROCESSING;
	else
		vp = D3DCREATE_SOFTWARE_VERTEXPROCESSING;

	// Step 3: Fill out the D3DPRESENT_PARAMETERS structure.
 
	//步骤3:填充D3DPRESENT_PARAMETERS 结构体
	D3DPRESENT_PARAMETERS d3dpp;
	//后台缓存中表面的宽度,单位为像素
	d3dpp.BackBufferWidth            = width;
	//后台缓存中表面的宽度,单位为像素
	d3dpp.BackBufferHeight           = height;
	//后台缓存的像素格式(如:32为像素格式:D3DFMT_A8R8G8B8)
	d3dpp.BackBufferFormat           = D3DFMT_A8R8G8B8;
	//所需使用的后台缓存的个数,通常指定为1,表明我们仅需要一个后台缓存
	d3dpp.BackBufferCount            = 1;
	//后台缓存所使用的多重采样类型 
	d3dpp.MultiSampleType            = D3DMULTISAMPLE_NONE;
	//多重采样的质量水平
	d3dpp.MultiSampleQuality         = 0;
	//枚举类型的一个成员。该枚举类型指定了交换链中的缓存的页面置换方式。指定为D3DSWAPEFFECT_ DISCARD时效率最高。
	d3dpp.SwapEffect                 = D3DSWAPEFFECT_DISCARD; 
	//与设备相关的窗口句柄。指定了所要进行绘制的应用程序窗口。
	d3dpp.hDeviceWindow              = hwnd;
	//为true时,表示窗口模式。为false时,表示全屏模式
	d3dpp.Windowed                   = windowed;
	//设置为true,则Direct3D自动创建并维护深度缓存或模板缓存。
	d3dpp.EnableAutoDepthStencil     = true; 
	//深度缓存或模板缓存的像素格式(例如,用24位表示深度并将8位保留供模板缓存使用,
	d3dpp.AutoDepthStencilFormat     = D3DFMT_D24S8;
	//-些附加的特性。可以指定为0 (无标记)
	d3dpp.Flags                      = 0;
	//刷新频率。如果想使用默认的刷新频率,可将该参数指定为D3DPRESENT_ _RATE_ _DEFAULT.
	d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
	//PresentationInterval : D3DPRESENT集 合的一个成员。D3DPRESENT- -一INTERVAL_ IMMEDIATE: 立即提交
	d3dpp.PresentationInterval       = D3DPRESENT_INTERVAL_IMMEDIATE;

	// Step 4: Create the device.
	//步骤4:创建设备
	hr = d3d9->CreateDevice(
		//UINT Adapter:指定我们希望用已创建的IDirect3DDevice9对象代表哪块物理显卡。 默认是主显卡
		D3DADAPTER_DEFAULT, // primary adapter
		//指定需要使用的设备类型(如,硬件设备D3DDEVTYPE_ HAL)
		deviceType,         // device type
		//窗口句柄
		hwnd,               // window associated with device
		//顶点运算
		vp,                 // vertex processing
		//填充D3DPRESENT_ PARAMETERS 结构体对象 
	    &d3dpp,             // present parameters
		//返回创建的设备
	    device);            // return created device