




已阅读5页,还剩16页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
一DirectX:DirectX SDK(俗称 Direct X 开发工具包)或者DirectX API(应用程序接口),是一套用于开发高性能多媒体程序的应用程序接口;DirectX Runtime(DirectX 运行时),是一组动态连接库,是运行利用DirectX SDK开发的程序所必需的动态库。DirectX SDK包括以下几部分:Direct3D(direct3d,directdraw)、DirectInput、DirectSound、DirectMusic、DirectPlay、DirectShow、DirectSetup和DirectX Media Object。Direct3D简称D3D,集成了开发DirectX程序三维图形部分的所有API 函数,是DirectX最主要的也是最复杂的一个组件。DirectDraw是用来开发二维图形的一个组件,目前两者合并一起成为Direct Graphics,也称Direct3D.二Direct3D体系结构硬件抽象层(HAL):大多数的Direct3D API设计开发的三维图形程序都运行于硬件抽象层(HAL),即充分利用了硬件系统的加速功能,又隐藏了硬件相关的设备特性,即通过Direct3D实现了硬件无关性。它仅仅是与硬件设备相关的代码,对硬件部支持的功能,不提供软件模拟。提供硬件功能的检查,但不进行参数检查,所有工作要Direct3D在调用HAL之前进行。硬件模拟层(HEL)可以在软件中模拟某些特性,现在已不使用。Direct3D有两种运行模式:窗口模式和全屏模式Dirent3D系统集成:WIN32应用程序 - Dirent3D API - HAL - 设备驱动程序接口(DDI) - 图形硬件三在创建Dirent3D设备对象时要先创建Dirent3D对象,Dirent3D的实现方式就是通过组件对象模型和接口实现的,在使用c+和COM开发方式时可以直接访问这些接口和对象。在使用c+编程时,要先得到一个指向Dirent3D接口的指针,从而通过该指针调用Dirent3D对象的功能。Dirent3D设备对象(渲染设备),在Dirent3D的渲染组件,在程序中为一个COM对象,它封装和存储了渲染状态。此外还执行坐标变换和光照操作。使用前也需要获取该对象的接口指针。四Dirent3D程序基本结构:五大部分包括:1.创建windows窗口2.初始化Dirent3D 3.消息循环4.图形渲染5.退出Dirent3D程序1.创建windows窗口 WNDCLASSEX wndclass ;/一个窗口类wndclass.cbSize = sizeof (wndclass);/WNDCLASSEX 的大小wndclass.style = CS_HREDRAW | CS_VREDRAW;/从这个窗口类派生的窗口具有的风格wndclass.lpfnWndProc = CGameEngine_App:WndProc;/窗口处理函数的指针,回调函数wndclass.cbClsExtra = 0 ;/指定紧跟在窗口类结构后的附加字节数wndclass.cbWndExtra = 0 ;/指定紧跟在窗口事例后的附加字节数。如果一个应用程序在资源中用CLASS伪指令注册一个对话框类时,则必须把这个成员设成DLGWINDOWEXTRAwndclass.hInstance = hInstane;/本模块的事例句柄wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);/(wndclass.hInstance, MAKEINTRESOURCE(IDI_DGE) ) ;wndclass.hCursor = LoadCursor (NULL, IDC_ARROW);/光标的句柄wndclass.hbrBackground =(HBRUSH)GetStockObject(BLACK_BRUSH) ;/背景画刷的句柄wndclass.lpszMenuName = NULL;wndclass.lpszClassName = D3DCreateWnd; wndclass.hIconSm = LoadIcon(NULL,IDI_APPLICATION);/(wndclass.hInstance, MAKEINTRESOURCE(IDI_DGE) ) ;/ Register the classRegisterClassEx(&wndclass);/ Create a windowHWND hWnd = CreateWindowEx(0, / Extended stylewndclass.lpszClassName,szTitle,wndStyle, / Window style0, / Horizontal origin 0, / Vertical originnWidth,/GetSystemMetrics(SM_CXSCREEN), / x sizenHeight,/GetSystemMetrics(SM_CYSCREEN), / y sizeNULL, / Handle of parentNULL, / Handle to menuwndclass.hInstance,/hInstance,/ Application instanceNULL); / Additional data2.初始化Dirent3D,包括Dirent3D对象,Dirent3D设备对象以及要渲染的图形对象/创建Dirent3D对象IDirect3D9* m_pDirect3D;m_pDirect3D = Direct3DCreate9(D3D_SDK_VERSION); /该函数的参数必须是D3D_SDK_VERSION,只有如此方能保证应用程序使用正确的头文件,如果该函数调用失败,将返回一个NULL指针。/检查渲染设备是否支持所需要的功能D3DCAPS9 caps;/用检测到的显示适配器的特性填充D3DCAPS9 结构m_pDirect3D-GetDeviceCaps(D3DADAPTER_DEFAULT,/指定物理显卡的序号D3DDEVTYPE_HAL,/指定设备类型(例如硬件设备(D3DDEVTYPE_HAL)或软件设备(D3DDEV_TYPE_REF))&caps/返回已初始化的设备性能结构实例);int vp = 0;/检测硬件是否支持变换和灯光if( caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT)vp = D3DCREATE_HARDWARE_VERTEXPROCESSING;elsevp = D3DCREATE_SOFTWARE_VERTEXPROCESSING;/创建direct3D设备对象D3DPRESENT_PARAMETERS* m_D3Dpp;/创建Dirent3D设备对象前先对m_D3Dpp进行初始化ZeroMemory(&m_D3Dpp,sizeof(m_D3Dpp);/全部置零m_D3Dpp.BackBufferWidth = m_nWidth;/后备缓冲的宽度m_D3Dpp.BackBufferHeight = m_nHeight;/后备缓冲的高度m_D3Dpp.BackBufferFormat = D3DFMT_A8R8G8B8;/后备缓冲的格式m_D3Dpp.BackBufferCount = 1;/后备缓冲数目m_D3Dpp.MultiSampleType = D3DMULTISAMPLE_NONE;/全屏抗锯齿类型m_D3Dpp.MultiSampleQuality = 0;/全屏抗锯齿质量等级m_D3Dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;/交换缓冲类型m_D3Dpp.hDeviceWindow = m_hWindow;/设备窗口句柄m_D3Dpp.Windowed = m_bWindowed;/全屏或窗口m_D3Dpp.EnableAutoDepthStencil = true;/激活深度缓冲m_D3Dpp.AutoDepthStencilFormat = D3DFMT_D24S8;/深度缓冲格式m_D3Dpp.Flags = 0;/m_D3Dpp.FullScreen_RefreshRateInHz=D3DPRESENT_RATE_DEFAULT;/显示器刷新率m_D3Dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;/图像最大刷新速度 BackBufferWidth和BackBufferHeight:后备缓冲的宽度和高度。在全屏模式下,这两者的值必需符合显卡所支持的分辨率。例如(800,600),(640,480)。 BackBufferFormat:后备缓冲的格式。这个参数是一个D3DFORMAT枚举类型,它的值有很多种,例如D3DFMT_R5G6B5、D3DFMT_X8R8G8B8为游戏后备缓冲常用格式,这说明后备缓冲的格式是每个像素16位,其实红色(R)占5位,绿色(G)占6位,蓝色(B)占5位,为什么绿色会多一位呢?据说是因为人的眼睛对绿色比较敏感。DX9只支持16位和32位的后备缓冲格式,24位并不支持。如果对这D3DFORMAT不熟悉的话,可以把它设为D3DFMT_UNKNOWN,这时候它将使用桌面的格式。 BackBufferCount:后备缓冲的数目,范围是从0到3,如果为0,那就当成1来处理。大多数情况我们只使用一个后备缓冲。使用多个后备缓冲可以使画面很流畅,但是却会造成输入设备响应过慢,还会消耗很多内存。 MultiSampleType 和MultiSampleQuality:前者指的是全屏抗锯齿(多重采样)的类型,后者指的是全屏抗锯齿的质量等级。这两个参数可以使你的渲染场景变得更好看,但是却消耗你很多内存资源,而且,并不是所有的显卡都支持这两者的所设定的功能的。在这里我们分别把它们设为D3DMULTISAMPLE_NONE和0。可以通过CheckDeviceMultiSampleType 来检测当前装置是否支持某个抗锯齿类型typedef enum _D3DMULTISAMPLE_TYPED3DMULTISAMPLE_NONE = 0,D3DMULTISAMPLE_2_SAMPLES = 2,D3DMULTISAMPLE_3_SAMPLES = 3,D3DMULTISAMPLE_4_SAMPLES = 4,D3DMULTISAMPLE_5_SAMPLES = 5,D3DMULTISAMPLE_6_SAMPLES = 6,D3DMULTISAMPLE_7_SAMPLES = 7,D3DMULTISAMPLE_8_SAMPLES = 8,D3DMULTISAMPLE_9_SAMPLES = 9,D3DMULTISAMPLE_10_SAMPLES = 10,D3DMULTISAMPLE_11_SAMPLES = 11,D3DMULTISAMPLE_12_SAMPLES = 12,D3DMULTISAMPLE_13_SAMPLES = 13,D3DMULTISAMPLE_14_SAMPLES = 14,D3DMULTISAMPLE_15_SAMPLES = 15,D3DMULTISAMPLE_16_SAMPLES = 16,D3DMULTISAMPLE_FORCE_DWORD = 0x7fffffff D3DMULTISAMPLE_TYPE;/ MultiSampleType为以上的枚举值HRESULT CheckDeviceMultiSampleType( in UINT Adapter,/要查询的显示适配器的序号,D3DADAPTER_DEFAULT始终是主显示适配器 in D3DDEVTYPE DeviceType,/顶点处理方式,硬件还是软件? in D3DFORMAT SurfaceFormat,/ 为后备缓冲格式 in BOOL Windowed,/ 是否为窗口模式 in D3DMULTISAMPLE_TYPE MultiSampleType, outDWORD *pQualityLevels/返回的相对于type的(抗锯齿值)多重采样的最大质量等级);SwapEffect:交换缓冲支持的效果类型,指定表面在交换链中是如何被交换的。它是D3DSWAPEFFECT枚举类型,可以设定为以下三者之一:D3DSWAPEFFECT_DISCARD,D3DSWAPEFFECT_FLIP,D3DSWAPEFFECT_COPY。(1)如果设定为D3DSWAPEFFECT_DISCARD,则后备缓冲区的东西被复制到屏幕上后,后备缓冲区的东西就没有什么用了,可以丢弃(discard 是否丢弃由显卡决定,但不再等待)了。(2)如果设定为D3DSWAPEFFECT_FLIP,后备缓冲拷贝到前台缓冲,保持后备缓冲内容不变。当后备缓冲大于1个时使用(3)设定D3DSWAPEFFECT_COPY的话,后备缓冲拷贝到前台缓冲,保持后备缓冲内容不变。当后备缓冲等于1个时使用一般我们是把这个参数设为D3DSWAPEFFECT_DISCARD。如果想使用GetBackBuffer 获得后备缓冲内容打印屏幕画面。则不能使用DISCARD.很怀疑用DISCARD效率会好的说法。在我的8600GT 上_COPY 明显好于DISCARD. discard 做法是再次使用后备缓冲时 new 一个新的缓冲,旧的缓冲内容遗弃,如果还有使用旧的缓冲地方,不会影响新的内容,如使用抗锯齿必须是DISCARD。这样不用等待硬件同步。不过大部分是一次Present操作。用COPY在新机器上面反倒效率好些。毕竟new 一个 1440*900 的后台缓冲也是有消耗的。(对于DISCARD 做法仅仅是猜测。不同显卡可能不同。) hDeviceWindow:显示设备输出窗口的句柄 Windowed:如果为FALSE,表示要渲染全屏。如果为TRUE,表示要渲染窗口。渲染全屏的时候,BackBufferWidth和BackBufferHeight的值就得符合显示模式中所设定的值。 EnableAutoDepthStencil:如果要使用深度缓冲,则把它设为TRUE。 AutoDepthStencilFormat:如果不使用深度缓冲,那么这个参数将没有用。如果启动了深度缓冲,那么这个参数将为深度缓冲设定缓冲格式。常用值D3DFMT_24S8 (24 深度缓冲,8模板缓冲),D3DFMT_24X8(24 深度缓冲),D3DFMT_16(16深度缓冲)等等。/深度缓存和模板缓存的象素格式,如 D3DFMT_D24S8 , 24 位表示深度,8位为模板缓存。一般不会用到32位深度:D3DFMT_32/注意如果设置模板缓冲在Clear() 函数中也要清楚模板缓冲:设置参数 D3DCLEAR_ZBUFFER|D3DCLEAR_STENCILFlags:通常为0 或D3DPRESENTFLAG_LOCKABLE_BACKBUFFER。不太清楚是用来做什么的,看字面好像是一个能否锁定后备缓冲区的标记。D3DPRESENTFLAG_DISCARD_DEPTHSTENCIL 丢弃模板缓冲区FullScreen_RefreshRateInHz:显示器的刷新率,单位是HZ,如果设定了一个显示器不支持的刷新率,将会不能创建设备或发出警告信息。为了方便,一般设为D3DPRESENT_RATE_DEFAULT就行了。 PresentationInterval:如果设置为D3DPRENSENT_INTERVAL_DEFAULT,则说明在显示一个渲染画面的时候必要等候显示器刷新完一次屏幕。例如你的显示器刷新率设为80HZ的话,则一秒内你最多可以显示80个渲染画面。另外你也可以设置在显示器刷新一次屏幕的时间内显示1到4个画面。如果设置为 D3DPRENSENT_INTERVAL_IMMEDIATE,则表示可以以实时的方式来显示渲染画面,虽然这样可以提高帧速(FPS),如果速度过快却会产生图像撕裂的情况,但当游戏完成时,帧速度一般不会过快。/创建D3D设备接口:HRESULT CreateDevice (UINT Adapter, /显卡序列号D3DDEVTYPE DeviceType, /D3D 设备类型HWND hFocusWindow, /所属窗口句柄DWORD BehaviorFlags,/设备进行3D 运算方式D3DPRESENT_PARAMETERS *pPresentationParameters, /用于存储D3D 设备相关信息的指针IDirect3DDevice9 * ppReturnedDeviceInterface /返回D3D 设备接口指针的地址);第二个参数DeviceType 取值:D3DDEVTYPE_HAL /硬件抽象层,通过显示硬件来完成图形渲染工作D3DDEVTYPE_REF /参考光栅器,一般用于测试显卡不支持的D3D 功能D3DDEVTYPE_SW /用于支持第三方软件第四个参数BehaviorFlags 取值:D3DCREATE_SOFTWARE_VERTEXPROCESSING /由D3D 软件进行顶点运算(常用)D3DCREATE_FPU_PRESERVE /激活双精度浮点运算或浮点运算异常检测,设置该项会降低系统性能D3DCREATE_MULTITHREADED /保证D3D是多线程安全的,设置该项会降低系统性能 D3DCREATE_MIXED_VERTEXPROCESSING /由混合方式进行顶点运算D3DCREATE_HARDWARE_VERTEXPROCESSING /由D3D硬件进行顶点运算D3DCREATE_PUREDEVICE /禁用D3D 的Get*()函数,禁止D3D使用虚拟设备模拟顶点运算/创建顶点缓冲区HRESULT CreateVertexBuffer(UINT Length, /顶点缓冲区的大小,按字节数算DWORD Usage, /顶点缓冲区属性DWORD FVF, /灵活顶点格式D3DPOOL Pool, /顶点缓冲区的内存类型IDirect3DVertexBuffer9* ppVertexBuffer, /顶点缓冲区指针地址HANDLE* pSharedHandle /保留参数,置为0);*Usage:参数Usage 用于指定顶点缓冲区的属性,其取值可以设为0,或下面任意值的组合。D3DUSAGE_WRITEONLY /只写属性,不能进行读操作,设置该属性可以提高系统性能D3DUSAGE_DYNAMIC /指定顶点缓冲区要求使用动态内存D3DUSAGE_NPATCHES /使用顶点缓冲区绘制N-patches 曲线D3DUSAGE_POINTS /指定顶点缓冲区存储原始点D3DUSAGE_RTPATCHES /使用顶点缓冲区绘制高阶图元(high-orderprimitive)D3DUSAGE_SOFTWAREPROCESSING /使用软件进行顶点运算,否则使用硬件计算*Pool:参数Pool 属于枚举类型D3DPOOL,指定顶点缓冲区资源的内存位置,如下:typedef enum _D3DPOOL D3DPOOL_DEFAULT = 0,/默认值,顶点缓冲区尽可能存在于显存中D3DPOOL_MANAGED = 1, /由D3D的资源管理器自动调度顶点缓冲区内存位置D3DPOOL_SYSTEMMEM = 2, /顶点缓冲区位于内存中D3DPOOL_SCRATCH = 3, /定点缓冲区位于计算机临时内存中,只能进行内存加锁拷贝D3DPOOL_FORCE_DWORD = 0x7fffffff /强制将此ENUM 编译为32 位,无其他意义 D3DPOOL;/创建索引缓冲HRESULT CreateIndexBuffer(UINT Length, /索引缓冲区大小,按字节数计算DWORD Usage, /索引缓冲区属性,和顶点缓冲区相同D3DFORMAT Format, /索引数组的元素格式,可以是16 位或者32 位D3DPOOL Pool, /索引缓冲区内存位置IDirect3DIndexBuffer9* ppIndexBuffer, /索引缓冲区指针地址HANDLE* pSharedHandle /保留参数,设为0);/保存顶点HRESULT Lock(UINT OffsetToLock, /加锁内存起始地址UINT SizeToLock, /加锁内存大小VOID *ppbData, /返回内存指针地址DWORD Flags /加锁属性);DWORD Flags:指定了顶点缓冲区的加锁属性,它可以取值为0,或者如下中的任意组合:D3DLOCK_DISCARD /仅在动态缓冲区下使用,硬件丢弃原缓冲区并创建一个新的缓冲区D3DLOCK_NO_DIRTY_UPDATE /在缺省状态下,对缓冲区加锁将会在该区域设置一个Dirty 标志,该属性将不对该区域设置Dirty 标志D3DLOCK_NOSYSLOCK /在加锁的过程中系统可进行其他操作D3DLOCK_READONL /设置缓冲区位只读属性D3DLOCK_NOOVERWRITE /尽在动态缓冲区下使用,保证不覆盖缓冲区数据,即向缓冲区中添加数据,允许在渲染时添加数据到缓冲区 3.消息循环由peekmessage(),translatemessage(),dispatchmessage()三个函数组成,他们是windows标准消息循环处理过程,当应用程序消息队列有一个消息时,peekmessage()返回true,执行translatemessage()进行消息转换,最后由dispatchmessage()传递给窗口过程函数BOOL PeekMessage(LPMSG IpMsg,/接收消息信息的MSG结构指针HWND hWnd,/其消息被检查的窗口的句柄UINT wMSGfilterMin,/指定被检查的消息范围里的第一个消息UINT wMsgFilterMax,/指定被检查的消息范围里的最后一个消息UINT wRemoveMsg/确定消息如何被处理);wRemoveMsg可取下列值之一: PM_NOREMOVE:PeekMessage处理后,消息不从队列里除掉。 PM_REMOVE:PeekMessage处理后,消息从队列里除掉。 可将PM_NOYIELD随意组合到PM_NOREMOVE或PM_REMOVE。此标志使系统不释放等待调用程序空闲的线程。 缺省地,处理所有类型的消息。若只处理某些消息,指定一个或多个下列值: PM_QS_INPUT:Windows NT5.0和Windows 98:处理鼠标和键盘消息。 PM_QS_PAINT:Windows NT 5.0和Windows 98:处理画图消息。 PM_QS_POSTMESSAGE:Windows NT 5.0和Windows 98:处理所有被寄送的消息,包括计时器和热键。 PM_QS_SENDMESSAGE:Windows NT 5.0和Windows 98:处理所有发送消息。 返回值:如果消息可得到,返回非零值;如果没有消息可得到,返回值是零4.图形渲染所有的渲染操作都必须在BeginScene()和EndScene()之间执行,最后Present()将后台缓冲区内容提交到前台缓冲区,大多数的三维程序都拥有两个或者两个以上的颜色缓冲区,用于当前屏幕刷新的为前台缓冲区,其他的用于图形绘制的颜色缓冲区成为后台缓冲区.HRESULTIDirect3DDevice9:Clear(DWORD Count,/重置的矩形区域数量 const D3DRECT* pRects,/重置的矩形区域/数组指针 DWORD Flags,/重置缓冲区标志,/指定重置的缓冲区 D3DCOLOR Color,/颜色值 float z,/深度值,最远为1.0f最近为0 DWORD stencil/模板);Clear作用是:清空一个或者多个表面的内容,direct3d在绘制图形之前要调用它清除视口的颜色缓冲区、深度缓冲区、模版缓冲区中的一个或者多个。/设置渲染状态HRESULT SetRenderState(D3DRENDERSTATETYPE State, /需要渲染的状态DWORD Value /设置的渲染状态的值);改变D3D中的渲染状态(部分)1). 设置着色模式: SetRenderState(D3DRS_SHADEMODE, D3DSHADE_FLAT) /设置平面着色模式SetRenderState(D3DRS_SHADEMODE, D3DSHADE_GOURAUD) /设置格劳德着色模式2). 设置多边形填充模式:SetRenderState(D3DRS_FILLMODE, D3DFILL_POINT) /点填充模式,D3D在多边形的每个顶点绘制一个像素SetRenderState(D3DRS_FILLMODE, D3DFILL_WIREFRAME) /线填充模式,D3D在多边形的每个边绘制一条线SetRenderState(D3DRS_FILLMODE, D3DFILL_SOLID) /面模式,D3D默认模式,对多边形的面进行填充3). 设置全景图形抗锯齿:SetRenderState(D3DRS_MUTISAMPLEANTIALIAS, TRUE) /抗锯齿SetRenderState(D3DRS_MUTISAMPLEANTIALIAS, FALSE) /不抗锯齿4). 设置剔除模式:SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE) /不剔除任何面,默认为剔除背面5). 设置光照模式:SetRenderState(D3DRS_AMBIENT, D3DCOLOR ambientColor); /为整个场景设置环境光,ambientColor默认值为0SetRenderState(D3DRS_SPECULARENABLE, TRUE); /激活镜面反射计算(D3D默认情况下关闭)6). 启动/关闭深度测试:SetRenderState( D3DRS_ZENABLE, TRUE ); /启用深度测试7) 设置纹理过滤器8)SetRenderState( D3DRS_POINTSCALEENABLE, TRUE ); /打开缩放功能9)SetRenderState( D3DRS_POINTSCALE_A , FtoDW( 1.00f );/设置因子,下同SetRenderState( D3DRS_POINTSCALE_B , FtoDW( 1.00F );SetRenderState( D3DRS_POINTSCALE_C , FtoDW( 1.00f );10)SetRenderState( D3DRS_POINTSIZE_MAX, FtoDW( 5.00f );/设置点大小上限,下类似SetRenderState( D3DRS_POINTSIZE_MAX, FtoDW( 5.00f );SetRenderState( D3DRS_POINTSPRITEENABLE , TRUE ) ; /打开点精灵效果SetRenderState( D3DRS_AMBIENT, 0xffffffff ); /设置环境光颜色开启 ALPHA混合效果11)设置混合因子:源:SetRenderState( D3DRS_SRCBLEND , D3DBLEND_SRCALPHA );目的:SetRenderState( D3DRS_DESTBLEND , D3DBLEND_INVSRCALPHA);第二个参数是 D3DBLEND的枚举结构。typedef enum D3DBLEND D3DBLEND_ZERO = 1, D3DBLEND_ONE = 2, D3DBLEND_SRCCOLOR = 3, D3DBLEND_INVSRCCOLOR = 4, D3DBLEND_SRCALPHA = 5, D3DBLEND_INVSRCALPHA = 6, D3DBLEND_DESTALPHA = 7, D3DBLEND_INVDESTALPHA = 8, D3DBLEND_DESTCOLOR = 9, D3DBLEND_INVDESTCOLOR = 10, D3DBLEND_SRCALPHASAT = 11, D3DBLEND_BOTHSRCALPHA = 12, D3DBLEND_BOTHINVSRCALPHA = 13, D3DBLEND_BLENDFACTOR = 14, D3DBLEND_INVBLENDFACTOR = 15, D3DBLEND_SRCCOLOR2 = 16, D3DBLEND_INVSRCCOLOR2 = 17, D3DBLEND_FORCE_DWORD = 0x7fffffff, D3DBLEND, *LPD3DBLEND;Source和Destination的默认方式分别为D3DBLEND_SRCALPHA和D3DBLEND_INVSRCALPHA。5.坐标变换1)世界变换我们在建立三维实体的数学模型时,通常以实体的某一点为坐标原点,比如一个球体,很自然就用球心做原点,这样构成的坐标系称为本地坐标系(Local Coordinates)。实体总是位于某个场景(World Space)中,而场景采用世界坐标系(World Coordinates),如图8所示,因此需要把实体的本地坐标变换成世界坐标,这个变换被称为世界变换(World Transformation)。在Direct3D中,坐标变换通过一个4x4矩阵来实现,对于世界变换,只要给出实体在场景中的位置信息,就可以借助Direct3D函数得到变换矩阵,具体的计算步骤如下: 首先把实体放置在在世界坐标系原点,使两个坐标系重合; 在世界空间中,对实体进行平行移动,其对应的平移变换阵TT可由函数D3DXMatrixTranslation求得; 把平移后的实体沿自身的Z轴旋转一个角度(角度大于0,表示从Z轴的正向朝原点看去,旋转方向为顺时针;反之为逆时针,下同),对应的旋转变换阵TZ用D3DXMatrixRotationZ计算; 把实体沿自身的Y轴旋转一个角度,用D3DXMatrixRotationY求出变换阵TY; 把实体沿自身的X轴旋转一个角度,用D3DXMatrixRotationX求出变换阵TX; 最后对实体进行缩放,假设三个轴的缩放系数分别为sx、sy、sz,该操作对应的变换阵TS可由函数D3DXMatrixScaling求得; 最终的世界变换矩阵TW = TSTXTYTZTT ,在Direct3D中,矩阵乘法用函数D3DXMatrixMultiply实现,注意相乘顺序为操作的逆序。从以上描述中,我们很容易得出:实体的运动可以通过不断改变世界变换矩阵来实现。2)视角变换,(观察矩阵)实体确定后,接下来要确定观察者在世界坐标系中的方位,换句话说,就是在世界坐标系中如何放置摄像机。观察者(摄像机)所看到的景象,就是Direct3D窗口显示的内容。确定观察者需要三个量: 观察者的点坐标; 视线方向,为一个矢量,不过Direct3D用视线上的一个点来替代,此时视线方向就是从观察者指向该目标点,这样表示更直观一些; 上方向,通俗地说,就是观察者的头顶方向,用一个矢量表示。确定后,以观察者为原点,视线为Z轴,上方向或它的一个分量为Y轴(X轴可由左手法则得出,为右方向),构成了视角坐标系,如图9所示。我们需要把实体从世界空间转换到视角空间,这个坐标变换被称为视角变换(View Transformation)与世界变换相比,视角变换矩阵的获取要容易得多,只需调用一个函数D3DXMatrixLookAtLH,其输入参数就是决定观察者的那三个量。D3DXMATRIX *WINAPI D3DXMatrixLookAtLH(D3DXMATRIX *pOut,CONST D3DXVECTOR3 *pEye,CONST D3DXVECTOR3 *pAt,CONST D3DXVECTOR3 *pUp);这个函数用来控制摄影机,用来控制视图矩阵的。pEye眼睛的位置,观察的方向。pAt是摄影机的前进和后退,向左或向右。向上或向下。pUp是向上的方向。详细说明参数:pOut in, out 指向 D3DXMATRIX 结构的返回结果的矩阵。pEye in 指向D3DXVECTOR3 结构的眼睛所有在位置向量。这个值会用来作平移。 pAt in 指向 D3DXVECTOR3 结构的摄像机观察目标位置向量。 pUp in 指向D3DXVECTOR3 结构的当前世界坐标系向上方向向量。通常用0, 1, 0向量。3)投影变换实体转换到视角空间后,还要经过投影变换(Projection Transformation),三维的实体才能显示在二维的计算机屏幕上。打个比方,如果把屏幕看做照相机中的胶卷,那么投影变换就相当于照相机的镜头。Direct3D使用透视投影变换(Perspective Transformation),此时在视角空间中,可视区域是一个以视线为轴心的棱台(Viewing Frustum),如图10所示。想象一下你处在一个伸手不见五指的房间里,面前有一扇窗户,你可以透过窗户看到各种景物。窗户就是棱台的前裁剪平面,天空、远山等背景是后裁剪平面,其间的可视范围是景深。投影变换把位于可视棱台内的景物投影到前裁剪平面,由于采用透视投影,距离观察者远的对象会变小,从而更具有真实感。在Direct3D中,前裁剪平面被映射到程序窗口,最终形成了我们在屏幕上看到的画面。透视投影变换由四个量决定: 前裁剪平面的宽度w; 前裁剪平面的高度h; 前裁剪平面到原点的距离z1; 后裁剪平面到原点的距离z2。由于w、h用起来不是很直观,因此实际应用中,常用fov和aspect代替w、h,其中fov是Y方向上的可视角度,通常取/4;aspect是前裁剪平面的高度与宽度之比,通常取1(由三角函数定义,易知h=2z1tg(fov/2),w=h/aspect)。用这四个量来调用函数D3DXMatrixPerspectiveFovLH,即可获得投影变换矩阵。得到三个变换矩阵后,还需要调用方法IDirect3DDevice9:SetTransform把它们设置到渲染环境中,具体用法参见后面的例程。/得到左手坐标系透视投影变换矩阵D3DXMatrixPerspectiveFovLH( &matrixProj,/in,out 指向D3DXMATRIX 结构的操作结果矩阵 D3DX_PI/2.0f,/in观察时y 轴方向的角度(弧度),就是观察范围夹角 float(m_nWidth)/float(m_nHeight),/in纵横比,在视空间宽度除以高度1.0f, /in近裁剪面位置Z值10000.0f /in远裁剪面位置Z值 );最后,可以用三句话来概括这些变换的作用:世界变换决定实体的位置;视角变换决定观察者的位置;投影变换决定观察者的可视区域。图形绘制/*设置资源流HRESULT SetStreamSource(UINT StreamNumber, /渲染数据流序号IDirect3DVertexBuffer9 *pStreamData, /进行绑定的顶点缓冲区指针UINT OffsetInBytes, /进行绑定连接的渲染数据流的起始位置的起始位置UINT Stride /渲染数据流中一个顶点所占的内存的大小);/*设置顶点格式HRESULT SetFVF(DWORD FVF /灵活顶点格式);D3D 定义的FVF 格式:D3DFVF_XYZ /包含未经变换的顶点坐标D3DFVF_XYZRHW /包含经过变换的顶点坐标D3DFVF_XYZW /包含经过变换和裁剪的顶点坐标D3DFVF_NORMAL /包含法线信息D3DFVF_PSIZE /点精灵的大小D3DFVF_DIFFUSE /包含漫反射的颜色信息D3DFVF_SPECULAR /包含镜面反射的颜色信息D3DFVF_TEX0D3DFVF_TEX8 /包含0-8 个纹理坐标信息D3DFVF_XYZB1D3DFVF_XYZB5 /包含顶点位置信息和影响顶点变换的权重信息,用于骨骼动画模型中/*绘制基本图元HRESULT DrawPrimitive(D3DPRIMITIVETYPE PrimitiveType, /绘制的图元类型UINT StartVertex, /绘制的起始顶点UINT PrimitiveCount /绘制的图元数量);/第一个参数PrimitiveType 取值:D3DPT_POINTLIST /点列集合(一组点的集合)D3DPT_LINELIST /线列集合(一组线段的集合)D3DPT_LINESTRIP /线带集合(首尾相连的线段的集合)D3DPT_TRIANGLELIST /三角形列(一组三角形的集合)D3DPT_TRIANGLESTRIP /三角形带(首尾相连的三角形,有两个顶点重合)D3DPT_TRIANGLEFAN /三角形扇(组成扇形的一组三角形)/图形绘制HRESULT SetIndices(IDirect3DIndexBuffer9 *pIndexData /使用的索引缓冲区指针);HRESULT DrawIndexedPrimitive(D3DPRIMITIVETYPE Type, /基本图元类型INT BaseVertexIndex, /顶点缓冲区的起始位置UINT MinIndex, /相对于BaseVertexIndex 的最小索引UINT NumVertices, /绘制的顶点数目,第一个顶点的位置UINT StartIndex, /索引缓冲区的起始位置UINT PrimitiveCount /绘制的基本图元数量);HRESULT IDirect3DDevice:Present( CONST RECT* pSourceRect,/复制源的矩形区域指针 CONST RECT* pDestRect,/复制目标的矩形区域指针 HWND hDestWindowOverride,/Direct3D设备所属窗口句柄 CONST* pDirtyRegion/最小更新区域指针);纹理/从磁盘文件获取纹理/该函数支持的图形文件类型: bmp、dds、dib、jpg、png 以及tga 等HRESULT WINAPI D3DXCreateTextureFromFile(LPDIRECT3DDEVICE9 pDevice, /Direct3D 设备指针LPCTSTR SrcFile, /纹理图形文件LPDIRECT3DTEXTURE9 *ppTexture /存储Direct3D 纹理的指针地址);/设置当前要渲染的纹理HRESULT SetTexture(DWORD Stage, /多级纹理的索引,从0-7,单层纹理取0IDirect3DBaseTexture9 *pTexture /Direct3D 的纹理接口指针);/设置纹理的渲染状态HRESULT SetTextureStageState
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 扎兰屯职业学院《医学超声技术》2023-2024学年第二学期期末试卷
- 西安思源学院《商业演出策划与实践》2023-2024学年第二学期期末试卷
- 山东省济南市天桥区重点中学2025年初三第五次模拟考试数学试题试卷含解析
- 宁夏吴忠市盐池一中学2025年初三下-第一次调研考试化学试题试卷含解析
- 浙江省宁波万里国际学校2025年初三数学试题下学期第二次模拟考试试题含解析
- 沙洲职业工学院《通信工程专业导论》2023-2024学年第二学期期末试卷
- 江苏省江都区六校2025届初三入学调研物理试题(1)试卷含解析
- 江西司法警官职业学院《生物信息处理》2023-2024学年第二学期期末试卷
- 宁波市海曙区2025届初三1月调研(期末)测试物理试题含解析
- 吉林司法警官职业学院《工程流体力学》2023-2024学年第二学期期末试卷
- 基于深度学习的小学数学跨学科主题探究
- DB65-T 4828-2024 和田玉(子料)鉴定
- 2022-2023学年北京市海淀区中关村中学八年级(下)期中数学试卷
- 疫情统计学智慧树知到答案2024年浙江大学
- DB32-T 4765-2024 化工行业智能化改造数字化转型网络化联接实施指南
- 龟兔赛跑英语故事带翻译完整版
- 中学驻校教官管理方案
- Siemens Simcenter:Simcenter声振耦合分析技术教程.Tex.header
- 永辉超市存货管理问题及对策分析
- 2024数据中心基础设施运行维护管理规范
- 乙酸说课课件 2023-2024学年高一下学期化学人教版(2019)必修第二册
评论
0/150
提交评论