DirectX9.0 3D游戏开发编程基础----第二章图形学基础知识

版权声明:K5出品,必属精品,欢迎收藏评论 https://blog.csdn.net/a694861283/article/details/87616213

1.1-Direct3D概述

应用程序通过Direct3D库来访问HAL(Hardware Abstraction Layer),通过HAL(硬件抽象层)来控制图形设备(显卡等)

HAL设备用Direct3D中的宏D3DDEVTYPE_HAL来指定

1.1.1-REF设备

有时Direct3D提供的某些功能不被图形设备支持,那么可以用REF(reference rasterizer device,光栅设备),它能以软件运算方式完全支持Direct3D API.

通过光栅设备,可以在代码中使用那些不为硬件所支持的特性,并对这些特性进行测试.

REF设备用Direct3D中的宏D3DDEVTYPE_REF来指定

我自己测试过用软件运算来渲染,效率真的很慢...

1.2-COM(组件对象模型)

COM(Component Object Model,组件对象模型)是一项能够使DirectX独立于编程语言并具备向下兼容的技术.

我们常称COM对象为接口,可以将其视为一个C++类来使用.

1.3-图形学基础知识

1.3.1 表面

表面是Direct3D用于存储2D图像数据的一个像素矩阵,可以用接口IDirect3DSurface9来描述表面

//GetDesc-该方法通过填充接口D3DSURFACE_DESC来获取该表面的描述信息
D3DSURFACE_DESC surfaceDesc;
_surface->GetDesc(&surfaceDesc);


//LockRect-该方法用于获取指向表面存储区(surface memory)的指针,通过指针运算,可对表面中的每一个像素进行读写操作
D3DLOCKED_RECT lockedRect;
_surface->LockRect(
    &lockedRect,
    0,
    0
);


DWORD* imageData=(DWORD*)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; //red
    }
}


//UnlockRect-如果调用了LockRect,就必须调用该方法解除对表面存储区的锁定
_surface->UnlockRect();

1.3.2 多重采样

用像素矩阵表示图像会出现块状(blocky-looking)效应,多重采样(multisampling)便是一项用于平滑块状图像的技术.

多重采样技术会显著降低应用程序的运行速度,可以用IDirect3D9::CheckDeviceMultiSampleType()来检查图形设备是否支持

扫描二维码关注公众号,回复: 5408020 查看本文章

1.3.3 像素格式

创建表面或纹理时,需要指定Direct3D资源的像素格式.像素格式可以用D3DFORMAT枚举类型的枚举常量来定义.

D3DFMT_R8G8B8:每个像素由24位组成,8位红,8位绿,8位蓝

D3DFMT_X8R8G8B8:每个像素由32位组成,8位不使用,8位红,8位绿,8位蓝

D3DFMT_A8R8G8B8:每个像素由32位组成,8位Alpha值,8位红,8位绿,8位蓝

1.3.4 内存池

表面和其他的Direct3D资源可以放入许多类型的内存池(Memory Pool),内存池的类型可用D3DPOOL枚举类型来表示

D3DPOOL_DEFAULT:默认值,由Direct3D自动调配.在调用IDirect3DDevice9::Reset之前,必须对内存池中的资源进行销毁和释放

D3DPOOL_MANAGE:放入由Direct3D管理的显存或AGP存储区

D3DPOOL_SYSTEMMEM:系统存储区

D3DPOOL_SCRATCH:系统存储区,不受图形设备制约

1.3.5 交换链和页面置换

Direct3D维护着一个表面集合(Collection),该集合由两到三个表面组成,称为交换链(Swap Chain),该集合用接口IDirect3DSwapChain9来表示.

交换链和页面置换技术(Page Flipping)主要用于生成更加平滑的动画,拥有前台缓存槽(front buffer slot)和离屏表面(后台缓存)

1.3.6 深度缓存

深度缓存(depth buffer)是一个只含有特定像素的深度新而不含图像数据的表面.深度缓存为最终绘制的图像中的每一个像素都保留了一个深度项(entry).

Direct3D为了判定某一个物体的哪些像素位于另一个物体之前,使用深度缓存(depth buffering)或z-缓存(z-buffering)的技术

D3DFMT_D32:指定32位深度缓存

D3DFMT_D24S8:指定24位深度缓存,其中8位保留供模板缓存来使用

D3DFMT_D24X8:仅指定24位深度缓存

D3DFMT_X4S4:指定24位深度缓存,其中4位保留供模板缓存使用

D3DFMT_D16:仅指定16位深度缓存

1.3.7 设备性能

Direct3D所提供的每一项性能都能对应于结构D3DCAP9中的一个数据成员或某一位.

//检验图形设备是否支持硬件运算

bool supportsHardwareVertexProcessing; 
if(caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT){
    supportsHardwareVertexProcessing=true;
}else{
    hardwareSupportsVertexProcessing=false;
}

猜你喜欢

转载自blog.csdn.net/a694861283/article/details/87616213