3D游戏基础 Direct3D(二) D3D初始化

注:后续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]顶点处理方式
        &para,//[IN]设备参数
        &pdevice); //[OUT]设备

5、注意检查是否初始化成功了
if(FAILED(hr))
{
    ::MessageBox(0, "Create Device Failed!!", 0, 0);
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值