注:后续D3D的讲解,均基于C++进行。
在解释D3D初始化之前,先介绍一下几个先导概念。
1、D3D的SDK向开发人员提供两种设备类型:参考设备(Reference Device or REF) 和 硬件抽象层设备(Hardware Abstract Layer or HAL)。
这两种设备的区别在于: REF是采用软件模拟的方式来进行三维运算,全部计算都在CPU来完成,它确保所使用的功能完全正确,但效率低下,仅为开发者开发,提供验证用功能;而HAL则采用硬件加速卡来进行计算。REF只在开发时可用,不能发布。
在D3D中,采用 D3DDEVTYPE_HAL 和 D3DDEVTYPE_REF 两个宏来区分。
2、反走样(Antialiasing)
在有限分辨率的显示器上,图像都是由一个一个显像的小格子组成。而格子都是正规的一行一行排列的,这就带来一个问题,在显示斜线的时候,可能会有锯齿状的图像出来,从而使图像的视觉效果变差。人们为了缓解这个问题,发展出了反走样技术。
它是根据人眼的特性发展出来的,原理就是在锯齿边缘再用一些近似的过度的颜色来填充,从而使锯齿边缘看起来像是一个平滑的过度。
实现反走样的一般方法就是:首先把要画的图像按比例放大,如2倍、4倍等等。然后按放大后的尺寸在内存中进行绘制。最后,我们把这幅大图再缩小n倍,那么从 n倍映射到1倍的过程中,我们需要一个采样运算。以2倍为例,我们就需要把大图中相邻的横竖各2个,总共4个像素值做加权平均 得到对应的一个像素的颜色。
反走样算法虽然简单,但却非常占用资源,所以,在实时渲染中,尽量不要使用过高的反走样级别。
在D3D中,反走样分为 D3DMULTISAMPLE_NONE、D3DMULTISAMPLE_1_SAMPLE ...... D3DMULTISAMPLE_16_SAMPLE 一共16级
3、像素的存储格式
D3DFMT_R8G8B、D3DFMT_X8R8G8B8、D3DFMT_A8R8G8B8、D3DFMT_A16R16G16B16、D3DFMT_A32R32G32B32
4、内存池的分类
D3DPOOL_DEFAULT:默认
D3DPOOL_MANAGE:D3D代管模式
D3DPOOL_SYSTEMMEM:系统存储区,D3D设备无法访问的
D3DPOOL_SCRATCH:系统存储区(不同于前一个)
D3D的初始化:
1、初始化前
从COM获得一个D3D接口指针
IDirect3D9 *pd3d = Direct3DCreate9(D3D_SDK_VERSION);
2、检查硬件是否支持相关特性
这个过程主要是用于检查硬件是否支持如反走样、着色器的支持程度等特性。
HRESULT IDirect3D9::GetDeviceCaps(
UINT Adapter, //[IN] 显卡编号,通常只有一个显卡
D3DDEVTYPE DeviceType, //[IN] 设备类型,REF or HAL
D3DCAPS9 *pCaps);//[OUT] 设备的基本性能资料
如:
D3DCAPS9 caps;
pd3d->GetDeviceCaps(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &caps);
验证是否带有硬件3D加速能力(即硬件的顶点变换和光照计算能力):
int vp = 0;
if(caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT)
{
vp = D3DCREATE_HARDWARE_VERTEXPROCESSING;
}
else
{
vp = D3DCREATE_SOFTWARE_VERTEXPROCESSING;
}
验证着色器版本
if(caps.PixelShaderVersion < D3DPS_VERSION(2, 0))
3、设定待初始化的D3D设备的参数
D3DPRESENT_PARAMETERS para;
详细资料可以查阅D3D帮助。
4、开始初始化
IDirect3DDevice9 *pdevice = 0;
HRESULT hr = pd3d->CreateDevice(
D3DADAPTER_DEFAULT, //[IN]使用默认显卡
D3DDEVTYPE_HAL,//[IN]使用HAL方式
hwnd,//[IN]关联的窗口
vp,//[IN]顶点处理方式
¶,//[IN]设备参数
&pdevice); //[OUT]设备
5、注意检查是否初始化成功了
if(FAILED(hr))
{
::MessageBox(0, "Create Device Failed!!", 0, 0);
return 0;
}
在解释D3D初始化之前,先介绍一下几个先导概念。
1、D3D的SDK向开发人员提供两种设备类型:参考设备(Reference Device or REF) 和 硬件抽象层设备(Hardware Abstract Layer or HAL)。
这两种设备的区别在于: REF是采用软件模拟的方式来进行三维运算,全部计算都在CPU来完成,它确保所使用的功能完全正确,但效率低下,仅为开发者开发,提供验证用功能;而HAL则采用硬件加速卡来进行计算。REF只在开发时可用,不能发布。
在D3D中,采用 D3DDEVTYPE_HAL 和 D3DDEVTYPE_REF 两个宏来区分。
2、反走样(Antialiasing)
在有限分辨率的显示器上,图像都是由一个一个显像的小格子组成。而格子都是正规的一行一行排列的,这就带来一个问题,在显示斜线的时候,可能会有锯齿状的图像出来,从而使图像的视觉效果变差。人们为了缓解这个问题,发展出了反走样技术。
它是根据人眼的特性发展出来的,原理就是在锯齿边缘再用一些近似的过度的颜色来填充,从而使锯齿边缘看起来像是一个平滑的过度。
实现反走样的一般方法就是:首先把要画的图像按比例放大,如2倍、4倍等等。然后按放大后的尺寸在内存中进行绘制。最后,我们把这幅大图再缩小n倍,那么从 n倍映射到1倍的过程中,我们需要一个采样运算。以2倍为例,我们就需要把大图中相邻的横竖各2个,总共4个像素值做加权平均 得到对应的一个像素的颜色。
反走样算法虽然简单,但却非常占用资源,所以,在实时渲染中,尽量不要使用过高的反走样级别。
在D3D中,反走样分为 D3DMULTISAMPLE_NONE、D3DMULTISAMPLE_1_SAMPLE ...... D3DMULTISAMPLE_16_SAMPLE 一共16级
3、像素的存储格式
D3DFMT_R8G8B、D3DFMT_X8R8G8B8、D3DFMT_A8R8G8B8、D3DFMT_A16R16G16B16、D3DFMT_A32R32G32B32
4、内存池的分类
D3DPOOL_DEFAULT:默认
D3DPOOL_MANAGE:D3D代管模式
D3DPOOL_SYSTEMMEM:系统存储区,D3D设备无法访问的
D3DPOOL_SCRATCH:系统存储区(不同于前一个)
D3D的初始化:
1、初始化前
从COM获得一个D3D接口指针
IDirect3D9 *pd3d = Direct3DCreate9(D3D_SDK_VERSION);
2、检查硬件是否支持相关特性
这个过程主要是用于检查硬件是否支持如反走样、着色器的支持程度等特性。
HRESULT IDirect3D9::GetDeviceCaps(
UINT Adapter, //[IN] 显卡编号,通常只有一个显卡
D3DDEVTYPE DeviceType, //[IN] 设备类型,REF or HAL
D3DCAPS9 *pCaps);//[OUT] 设备的基本性能资料
如:
D3DCAPS9 caps;
pd3d->GetDeviceCaps(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &caps);
验证是否带有硬件3D加速能力(即硬件的顶点变换和光照计算能力):
int vp = 0;
if(caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT)
{
vp = D3DCREATE_HARDWARE_VERTEXPROCESSING;
}
else
{
vp = D3DCREATE_SOFTWARE_VERTEXPROCESSING;
}
验证着色器版本
if(caps.PixelShaderVersion < D3DPS_VERSION(2, 0))
3、设定待初始化的D3D设备的参数
D3DPRESENT_PARAMETERS para;
详细资料可以查阅D3D帮助。
4、开始初始化
IDirect3DDevice9 *pdevice = 0;
HRESULT hr = pd3d->CreateDevice(
D3DADAPTER_DEFAULT, //[IN]使用默认显卡
D3DDEVTYPE_HAL,//[IN]使用HAL方式
hwnd,//[IN]关联的窗口
vp,//[IN]顶点处理方式
¶,//[IN]设备参数
&pdevice); //[OUT]设备
5、注意检查是否初始化成功了
if(FAILED(hr))
{
::MessageBox(0, "Create Device Failed!!", 0, 0);
return 0;
}