DirectX 9.0 3D 笔记

本文深入探讨DirectX 9.0的3D编程,涵盖表面、多重采样、像素格式、内存池、交换链、深度缓存等概念。介绍了设备初始化步骤,包括获取IDirect3D9接口、检查硬件顶点运算、填充D3DPRESENT_PARAMETERS结构以及创建IDirect3DDevice9。同时,详细讲解了绘制流水线,包括模型表示、虚拟摄像机、坐标变换、背面消隐、光照、材质、顶点法线、光源、纹理映射和融合技术,展示了如何实现3D场景的细致渲染。
摘要由CSDN通过智能技术生成
1.3.0 预备
1.HAL,硬件抽象层,由D3DDEVTYPE_HAL指定
2.REF,参考光栅设备
3.COM,组件对象模型,使之向下兼容,视为C++类。


1.3.1 表面
4.IDirect3DSurface9,描述表面。
 (1)LockRect:获取指向表面存储区的指针,通过指针对每一个像素进行读写。
 (2)UnlockRect:执行完LockRect后,必须调用此来解锁。
 (3)GetDesc:填充结构D3DSURFACE_DESC来获取表面的描述信息。


1.3.2 多重采样
5.多重采样:用于平滑块状图像的技术。常用于全屏反走样。
D3DMULTISAMPLE_TYPE:一系列枚举常量值,用于表示对表面进行多重采样的级别。
(1)D3DMULTISAMPLE_NONE:禁止多重采样。
(2)D3DMULTISAMPLE_1_SAMPLE....~_16_~:指定了了从1~16级的多重采样
(3)与特定多重采样类型相关的质量水平,用DWORD描述。
用IDirect3d9::CheckDeviceMultiSampleType来检查设备是否支持。


1.3.3 像素格式
在创建表面或者纹理时,要指定Direct3D资源的像素格式,由D3DFORMAT来定义:
(1)D3DFMT_R8G8B8:每个像素24位,8红8绿8蓝。
(2)D3DFMT_X8R8G8B8:每个像素32位,8未加使用~。
(3)D3DFMT_A8R8G8B8:每个像素32位,8位分给Alpha~。
(4)D3DFMT_A16B16G16R16F:每个像素64位,是一种浮点数类型的像素格式。
(5) D3DFMT_A32B32G32R32F:每个像素128位,浮点。


1.3.4 内存池
Direct3D资源可以放入许多类型的内存池中。类型可有D3DPOOL枚举类型来表示:
(1) D3DPOOL_DEFAULT:默认值,放入最合适的类型的存储区。存储区可以是显存,AGP
存储区,系统存储区。调用函数IDrect3DDevice9::Reset之前,必须对默认内存池中的
资源销毁或释放。然后再资源重新初始化。
(2) D3DPOOL_MANAGED:放入此处的资源将交给Direct3D管理。
(3) D3DPOOL_SYSTEMMEM:指定将资源放入系统存储区中。
(4) D3DPOOL_SCRATCH:指定将资源放入系统存储区中。不受图形设备的制约,设备无法访
问,资源之间可相互复制。 


1.3.5 交换链和页面置换
Direct3D为活着一个表面集合。
交换链:两三个表面组成的集合。用接口IDirect3DSwapChain9表示。
用途:和页面置换技术,用于生成更加平滑的动画。
    表面1(前台)《-------》表面2(后台) 
while(1)
在后台缓存中绘制;
提交后台缓存的内容;
 
1.3.6 深度缓存
for 定义:只含有特定像素的深度信息,不含图像数据的表面。为每一个像素都保留了一个深度项。
for 用于进行深度测试,判定某一物体的那些像素位于另一个物体之前。z-缓存。
for 深度缓存的格式决定了深度测试的精度。
1 D3DFMT_D32 32位
2 D3DFMT_D23S8 指定24位深度缓存,其中8位保留供模板缓存使用。
3 D3DFMT_D24X8 24位
4 D3DFMT_X4S4 指定24位深度缓存,其中4位保留~。
5 D3DFMT_D16 16位


1.3.7 定点运算
for 顶点是3D几何学中基本元素。有两种不同方式进行顶点运算:
1.软件顶点运算,都可以使用
2.硬件顶点运算,必须图形卡的支持,优先考虑,不占CPU(支持变换和光照)


1.3.8 设备性能 DevCaps(device capabilities)
for Direct3D提供的每一项性能都对应于结构D3DCAP9中的一个数据成员。
for 以某一具体硬件为基础,初始化一个D3DCAP9类型的实例,然后在程序中检查相应的数据成员来
判断设备是否支持某项特性。


1.4 Direct3D的初始化
步骤
1.获取接口IDrect3D的指针。获取系统中物理硬件设备的信息并创建接口IDirectDDevice9,
代表了我们用来显示3D图形的物理硬件设备。
2.检查设备性能(D3DCAPS9),判断主显卡是否支持硬件顶点运算。
3.初始化D3DPRESENT_PARAMETERS结构的一个实例。通过里面的变量来指定即将创建的结构
IDirectDDevice9的特性。
4.利用已初始化的D3DPRESENT_PARAMETER结构创建IDirectDDevice9对象(代表显示3D图形
的物理硬件设备)。


1.4.1 获取接口IDirect3D9的指针
for IDirect3D9 * _d3d9;
_d3d9 = Direct3DCreate9 (D3D_SDK_VERSION);
for 函数Direct3DCreate9参数必须是D3D_SDK_VERSION。
for 用途:
1.设备枚举,获取系统中显卡的各种信息。
2.创建IDirect3DDevice9类型。


1.4.2 校验硬件顶点运算
for 创建一个代表主显卡的IDirect3DDevice9类型对象时,必须指定使用该对象进行顶
点运算的类型(硬软件)。所以要先检查是否支持。
for 要检查,必须根据主显卡的性能参数初始化一个IDirect3DDevice9的对象。
for HRESULT IDirect3D9::GetDeviceCaps(
UINT Adapter,
D3DDEVTYPE DeviceType,
D3DCAPS9 * pCaps
);


1.Adapter 指定物理显卡的序号。
2.DeviceType 指定设备类型(A 硬件设备(D3DDEVTYPE_HAL),
  B 软件设备(D3DDEVTYPE_REF)).
3.pCaps 返回已初始化的设备性能结构实例。
for D3DCAPS caps;
d3d9->GetDeviceCaps(
D3DADAPTER_DEFAULT,
deviceType,
&caps);
//能使用硬件顶点运算吗?
int vp = 0;
if( caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT){
//我们能!
vp = D3DCREATE_HARDWARE_VERTEXPROCESSING;
}else{
//我们不能,只能用软件咯.
vp = D3DCREATE_SOFTWARE_VERTEXPROCESSING;
}


1.4.3 填充D3DPRESENT_PARAMETER 结构
for 太长啦看书48页。
typedef struct _D3DPRESENT_PARAMETERS_{
BALH BALH;
}


D3DPRESENT_PARAMETERS d3dpp;
d3dpp.blah = blah;
慢慢填;


1.4.4 创建IDirect3DDevice9接口
for D3DPRESENT_PARAMETERS结构填充后,我们用如下方法创建IDirect3DDevice9:
HRESULT IDirect3D9::CreateDevice(
UINT Adapter,
D3DDEVTYPE DeviceType,
HWND hFocusWindow,
DWORD BehaviorFlags,
D3DPRESENT_PARAMETERS *pPresentationParameters,
IDirect3DDevice9 ** ppReturnedDeviceInterface,
);
1.Adapter 指定物理显卡的序号。
2.DeviceType 指定设备类型(A 硬件设备(D3DDEVTYPE_HAL),
  B 软件设备(D3DDEVTYPE_REF))。
3.hFocusWindow 与设备相关的窗口句柄。设备所要进行绘制的目标窗口。与
D3DPRESENT_PARAMETERS结构的数据成员d3dpp.hDeviceWindow 为同一个句柄。
4.BehaviorFlags 该参数可为D3DCREATE_HARDWARE_VERTEXPROCESSING 或者
 D3DCREATE_SOFTWARE_VERTEXPROCESSING.
5.pPresentationParameters 初始化了的D3DPRESENT_PARAMETERS类型的实例。
6.ppReturnedDeviceInterface 返回所创建的设备。
for 调用示例
IDirect3DDevice9 * device = 0;
hr = d3d->CreateDevice(
D3DADAPTER_DEFAULT,
D3DDEVTYPE_HAL,
hwnd,
D3DCREATE_HARDWARE_VERTEXPROCESSING,
&d3dpp,
&device);
if(FAILED(hr)){
::MessageBox(0,"CreateDevice()-FAILED",0,0);
return 0;
}


1.5 例程:Direct3D的初始化
1.5.1 d3dUtility.h/cpp
1.InitD3D:初始化程序主窗口,执行1.4节中的初始化过程。得到指向创建好的
 IDirect3DDevice9接口的指针。该函数允许我们制定窗口的尺寸以及运行模式(窗口或全屏)。
2.EnterMsgLoop:封装了应用程序的消息循环。接受一个指向显示函数(实现绘制功能)的
函数指针。在空闲处理(idle processing)期间显示场景。
3.WndProc:应用程序主窗口的窗口过程函数(window procedure)。
4.Relefore:方便的释放COM接口并将其设置为NULL。
5.Delete:方便的删除自由堆中的对象,并将对象指针赋为NULL。


1.5.2 例程框架
for 例程框架:组织例程结构的一般形式。
1.bool Setup() 全部设置和初始化都在该函数进行,如分配资源,检查设备性能,设
置应用程序状态。
2.void Cleanup() 释放在Setup中分配的任何资源。
3.bool Display(float timeDelta) 实现全部的绘制代码,相邻帧之间应执行的操作,
timeDelta是相邻帧间的时间差。


1.5.3 例程:D3D初始化
for IDirect3DDevice9::Clear声明如下:
HRESULT IDirect3DDevice9::Clear(
DWORD Count,
const D3DRECT *pRects,
DWORD Flags,
D3DCOLOR Color,
float Z,
DWORD Stencil);


1.Count:pRect数组中矩形的数目。
2.pRects:所要执行清除的表面。我们可清除下列表面中的一个或多个:
D3DCLEAR_TARGET:绘制目标表面,通常指后台缓存。
D3DCLEAR_ZBUFFER:深度缓存。
D3DCLEAR_STENCIL:模板缓存。
3.Color:指定将绘制目标体设置为何种颜色。
4.Z:深度缓存所要设定的值。
5.Stencil:模板缓存所要设定的值。


2 绘
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值