DirectX图形开发(一)-基本概念

一.DXSDK_Jun10.exe安装



二.VS2015配置

1.VC++目录

可执行文件目录: $(DXSDK_DIR)Utilities/bin/x86
包含目录: $(DXSDK_DIR)Include;$(IncludePath)
库目录: $(DXSDK_DIR)Lib/x86;$(LibraryPath)

2.链接器

附件依赖项: d3d9.lib;d3dx9d.lib;d3dx10d.lib;winmm.lib;


三、基本概念

1.世界坐标系

世界坐标系是由三条相互垂直并相交的直线组成,X轴水平向右,Y轴垂直向上,Z轴指向用户

2.摄影坐标系

三维世界坐标系转换到屏幕二维坐标系,摆放虚拟摄影机生成与当前角度相符的图像,此时使用的坐标系为摄影坐标系。
摄影坐标系是以虚拟摄影机的位置为坐标原点,虚拟摄影机的观察方向作为坐标轴,现实物体的坐标称为射影坐标,从世界坐标到摄影坐标的转换过程称为取景变换。

3.剪裁和透视投影

剪裁过程会将摄影机覆盖不到的物体的部分剪裁掉。
经过剪裁,拍摄完三维场景后,物体的坐标就从世界坐标转换为摄影坐标,下一步就是将三维物体的取景投影到二位表面上,即将当前三维的摄影坐标投影到二维坐标,此过程
类似于拍照过程中胶片的曝光过程,称为透视投影变换。

4.视口变换和像素的光栅显示

物体在投影坐标中的坐标为浮点坐标,通过屏幕显示区域,将投影坐标系中的浮点坐标转换为屏幕上的像素坐标的过程称为视口变换。
现实物体从世界坐标转换成屏幕坐标后就可以进行光栅显示。




5.SetTransform

DirectX Graphics渲染3D图像时,只需要设置好顶点变换矩阵和视口信息,就可以进行图像顶点的坐标变换
HRESULT SetTransform(
D3DTRANSFORMSTATETYPE State,//指定要设置的变换矩阵类型
CONST D3DMATRIX *pMatrix);//要设置的变换矩阵


四、基本三角形面的绘制

1.DirectX Graphics基本应用架构

要使用DirectX Graphics组件渲染图形,首先需要创建IDirect3D9接口对象,然后创建Direct3D设备,利用此Direct3D设备的接口方法控制管道流水线进行图形的渲染。

2.创建IDrect3D9接口对象

IDirect3D9 *WINAPI Direct3DCreate9(UINT SDKVersion);
SDKVersion参数值必须设置为D3D_SDK_VERSION,如果创建成功,返回指向IDirect3D9接口的指针,否则返回NULL指针。

3.创建Direct3D设备

使用Direct3D对象可以枚举当前系统中可用的显示适配器,并通过IDirect3D9::Create()接口函数创建Direct3D设备对象。
创建Direct3D设备的过程分为以下3步:

(1).判断当前显卡是否支持3D顶点的硬件渲染,从而确定应该使用硬件抽象层HAL的哪种方式。IDirect3D9接口对象提供GetDeviceCaps()函数实现显卡的功能检测。

HRESULT GetDeviceCaps(
UINT Adapter,//指定要获取功能信息的显卡适配器的原始编号
D3DDEVTYPE DeviceType,//指定要获取功能信息的设备的类型
D3DCAPS9 *pCaps);//指定存放设备功能信息的D3DCAPS9结构指针
如果函数成功,返回D3D_OK,如果失败,返回值
D3DERR_INVALIDCALL:方法调用无效
D3DERR_INVALIDDEVICE:请求设备类型无效
D3DERR_OUTOFVIDEOMEMORY:没有足够显存来完成操作



(2).通过IDirect3D9接口对象的GetAdapterDisplayMode()函数获取适配器的当前显示模式

HRESULT GetAdapterDisplayMode(
UINT Adapter,//指定要获取当前显示模式的适配器的编号
D3DISPLAYMODE *pMode//指向D3DISPLAYMODE结构用于存放
);


(3).通过IDirect3D9接口对象的CreateDevice()函数创建代表显示适配器的设备

HRESULT CreateDeveice(
UINT Adapter,//指定要获取当前显示模式的适配器的编号
D3DDEVTYPE DeveiceType,//表示要创建的设备的类型
HWND hFocusWindow,//程序从前台切换到后台的通知对话框
DWORD BehaviorFlags,//指定创建设备的选项
D3DPRESENT_PARAMMETERS *pPresentationParameters,//指向D3DPRESENT_PARAMETERS结构的指针
IDirect3DDevice9 **ppReturnedDeviceInterface//创建后返回的IDirect3DDevice9接口指针
);




4.创建顶点缓冲区

创建存储要绘制的三角形面上的顶点数据的缓冲区

(1).调用IDrect3DDeveice9设备对象的CreateVertexBuffer函数创建顶点缓冲区对象IDirect3DVertexBuffer9,

HRESULT CreateVertexBuffer(
UINT Length,//指定顶点缓冲区的大小,单位是字节
DWORD Usage,//表示缓冲区的用途
DWORD FVF,//D3DFVF顶点格式常数的组合
D3DPOOL Pool,//资源中有效的内存类型
IDirect3DVertexBuffer9** ppVertexBuffer,//指向IDirect3DVertexBuffer9接口类型的指针,表示创建的顶点缓冲区资源
HANDLE* pSheareadHandle);//预留




(2).调用IDirect3DVertexBuffer9对象的Lock()函数,锁定指定范围的顶点数据,并返回顶点缓冲区内存的指针

HRESULT Lock(
UINT OffsetToLock,//要锁定的顶点数据的偏移量,单位是字节
UINT SizeToLock,//指定要锁定的顶点数据的大小,单位是字节
VOID **ppbData,//包含返回的顶点数据的内存缓冲区的指针
DWORD Flags);//锁定缓冲区的选项


(3).使用内存数据复制函数,将顶点数据复制到锁定的顶点数据缓冲区指针指向德 内存区域中



(4).调用IDirect3DVertexBuffer9对象的Unlock()函数,解锁对顶点数据缓冲区的锁定

HRESULT Unlock();


5.启动管道流水线进行渲染

(1).调用IDirect3DDevice9设备对象的Clear()函数,清空元素,可以清除一个或多个表面

HRESULT Clear(
DWORD Count,//指定pRects参数中要清空元素的矩形个数
CONST D3DRECT * pRects,//用于存储要清空元素的矩形
DWORD Flags,//一个或多个D3DCLEAR标记的组合,用于指定要清除的类型
D3DCOLOR Color,//指定用于清空渲染目标所使用的ARGB颜色值
float Z,//指定使用新的z值来清空深度缓存,其值得范围为0~1
DWORD Stencil);//指定使用信息清空模板缓存




(2).调用IDirect3Device9设备对象的BeginScene()函数,启动场景的绘制

HRESULT BeginScene();

(3).调用IDirect3DDeveice9设备对象的SetStreamSource()函数,将顶点缓冲区绑定到设备数据流中

HRESULT SetStreamSource(
UINT StreamNumber,//指定数据流,其范围从0到设备最大的流数目
IDirect3DVertexBuffer9 *pStreamData,//指向IDirect3DVertexBuffer9接口的指针,表示要绑定到设备数据流的顶点缓冲区对象
UINT offsetInBytes,//表示要绑定的顶点数据开始的偏移量,单位是字节
UINT Stride);//表示顶点数据的大小


(4).调用IDirect3DDevice9设备对象的SetFVF()函数,设置当前的顶点流中的定点数据类型

HRESULT SetFVF(DWORD FVF);

(5).调用IDirect3Device9设备对象的DrawPrimitive函数,绘制图元

HRESULT DrawPrimitive(
D3DPRIMITIVETYPE PrimitiveType,//要渲染的图元的类型
UINT StartVertex,//要载入的第一个顶点的索引
UINT PrimitiveCount//要渲染的顶点数目
);

(6).绘制完毕,调用IDrect3DDevice9设备对象的EndScene()函数,结束场景绘制






猜你喜欢

转载自blog.csdn.net/greless/article/details/77838265