Direct3D程序设计基础_第1页
Direct3D程序设计基础_第2页
Direct3D程序设计基础_第3页
Direct3D程序设计基础_第4页
Direct3D程序设计基础_第5页
已阅读5页,还剩46页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Direct3D程序设计基础,图形硬件,设备驱动程序接口(DDI),HAL,Direct3D API,Win32应用程序,GDI,Win32应用程序,应用程序、Direct3D、GDI和HAL之间的关系,几个基本概念,硬件抽象层HAL,硬件抽象层是硬件制造商提供的特定于硬件的接口,Direct3D利用该接口实现对显示硬件的直接访问。就用程序永远不需要访问HAL,Direct3D通过HAL提供的基础结构,为程序员提供一套统一的接口和方法,用于访问图形硬件。,HAL设备,硬件抽象设备是主要的设备类型,它支持硬件加速光栅化以及硬件和软件顶点处理。如果运行Direct3D程序的计算机的显卡支持Dire

2、ct3D,那么Direct3D程序就会使用HAL执行三维操作。Direct3D HAL设备通过硬件来进行全部或部分坐标变换、光照和光栅化处理模块。 在程序中不需要直接访问图形硬件,而是通过HAL访问图形硬件,由HAL调用显卡驱动程序的函数和方法。,硬件模拟层,HEL可以在软件中模拟某些特性。但是,自从DirectX8.0以后就不再提供HEL了。如果想让游戏 在老式硬件上运行,那只有使用Direct7.0及其HEL,或者自己开发一个硬件模拟设备。DirectX9.0就提供了一个使用由软件开发者编写HEL的接口。这类HEL现在被称为“插件式软件设备”。,软件参考层,Direct3D支持另外一种设备

3、,称为参考设备或称为参考光栅器。只有安装了SDK才会提供参考设备,当一个应用程序在一台未安装SDK的机器上请示参考设备时,会一个NULL参考设备。NULL参考设备什么也不做,所有渲染操作的结果都将呈现一个黑屏。 不同于HAL设备和插件式软件设备,参考光栅器支持所有的Direct3D特性,由于参考设备注重精确实现Direct3D的所有特性,而不注重运行速度,并且参考设备不支持硬件加速,所以使用参考设备绘制图形的速度很慢,不管硬件是否支持,参考光栅器总是通过CPU指令来绘制图形。使用参考设备的目的是为了测试演示Direct3D的特性,例如,如果你想学习Direct3D的某个高级特性,当前硬件又不支

4、持,这时就可以使用参考设备来测试和学习当前硬件不支持的高级Direct3D特性。,有了HAL/插件式软件设备/参考设备这一系列的方法,微软的Direct3D便可保证在缺少3D硬件支持的环境中,仍可以使用同一套API,也就是说,如果当前运行环境中无硬件加速设备,即HAL不可用时,可考虑自己编写插件式软件设备,再退一步,可以使用参考设备,而无论使用哪种设备,操作它们的API都是一样的。,视口(Viewport),视口是一块二维的矩形区域,三维景物投影为二维图形后,将绘制在这块矩形区域中。在Direct3D中,视口定义了当前Direct3D绘制的目标表面的矩形范围,绘制的图形坐标将被转换为相对于视口

5、的坐标并绘制于视口中,一般以像素为单位表示视口的长和宽。,像素(pixel),像素是指图像在屏幕上显示的最小单元,即屏幕上的一个亮点。它亦指在frame buffer中的一个最小图形单元。,分辨率(Resolution),分辨率是指显示设备所能显示的最大像素个数。,颜色缓冲区(Frame Buffer),颜色缓冲区是位系统内存或显示内存的一块内存块,它对应于将要的一块二维显示区域。图形绘制过程中,Direct3D完成坐标变换、光照处理和纹理映射,将绘制结构的值存储于颜色缓冲区中,最后通过图形刷新,颜色缓冲区的内容被显示在屏幕上。,前台缓冲区(front Buffer)和后台缓冲区(Back B

6、uffer),大多数图形显示程序拥有2个颜色缓冲区,我们将当前用于屏幕刷新的颜色缓冲区称为前台缓冲区,而将用于图形的其他颜色缓冲区称为后台缓冲区。同时拥有前台缓冲区和后台缓冲区的图形显示程序可以同时进行图形绘制和屏幕刷新操作,系统运行性能优于仅有单个颜色缓冲区图形显示程序。,D3D的基本程序结构,1.创建一个Windows窗口,2.初始化Direct3D程序,3.处理消息循环,4.物体图形显示,5.结束Direct3D程序,D3D程序基本结构伪代码,#include Int WINAPI WinMain() RegisterClass_Window_Class_and_create_a_win

7、dow();/创建窗口 Initial_Direct3D_object();/初始化D3D While(Is_Running) Handle_system_message(); if(message=painting) render();/三维图形绘制 Release_Drirect3D_object();/释放D3D占用的资源 ,二、初始化Direct3D程序,在使用Direct3D绘制图形之前,必须初始化Direct3D对象,包括创建并得到一个Direct3D接口,并以此得到一个Direct3D设备接口。,初始D3D的基本流程,创建Direct3D对象并得到Direct3D接口 查询显示卡

8、的显示模式 创建Direct3D设备对象并得到接口,#include LPDIRECT3D9 g_pD3D = NULL; LPDIRECT3DDEVICE9 g_pd3dDevice = NULL; HRESULT InitD3D( HWND hWnd ) if( NULL = ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) ) return E_FAIL; D3DPRESENT_PARAMETERS d3dpp; ZeroMemory( ,创建Direct3D对象并得到Direct3D接口,声明一个LPDIRECT3D9类型的指针变量。 使用

9、IDirect3D9* Direct3DCreate9()函数创建对象,并获得IDirect3D9指针。,Direct3DCreate9()函数原型,IDIRECT3D9* Direct3DCreate9( UINT SDKVersion ); *SDKVersion必须为D3D_SDK_VERSION。,创建D3D对象代码片段,LPDIRECT3D9* g_pD3D; g_pD3D=DirectCreate9(D3D_SDK_VERSION);,查询显示卡的显示模式,在创建Direct3D Device之前,要使用GetAdapterDisplayMode()函数获得计算机显示卡当前的显示模

10、式信息。,GetAdapterDisplayMode函数原型,HRESULTIDirect3D9:GetAapterDisplayMode ( UINT Adapter,/显示卡序号 D3DDISPLAYMODE* pMode/存储返回模 /式信息值的指针 ); *如果查询当前桌面使用的显示卡Adapter赋值为:D3DADAPTERDEAULT。,D3DDISPLAYMODE结构定义:,typedef struct _D3DDISPLAYMODE UINT Width;/屏幕宽度像素数 UINT Height;/屏幕高度像素数 RefreshRate;/屏幕刷新率 D3DFORMAT for

11、mat;/屏幕显示像素格式。 D3DDISPLAYMODE;,D3DFORMAT常用像素格式,查询显示卡的显示模式代码片段,D3DDISKPLAYMODE d3ddm; if(FAILED(g_pD3D-GetAdapterDisplayMode (D3DADAPTER_DEFAULT, ,创建Direct3D设备对象并得到接口,Direct3D设备定义了Direct3D的所有绘图组件,绝大多数Direct3D操作都通过Direct3D设备进行。调用IDirect3D9:CreateDevice()函数创建Direct3D设备对象。,IDirect3D:CreateDevice()函数原型,H

12、RESULT IDirect3D9:CreateDevice ( UINT Adapter,/显示卡序号 D3DDEVTYPE Devicetype,/Direct3D设备类型 HWND hFocusWindow,/所属窗口句柄 DWORD BehaivorFlags, /Direct3D设备进行3D的运算方式 D3DPRSENT_PARAMETERS* pPresentationParameters, /存储Direct3D设备相关信息的变量地址 IDirect3DDevice9* ppReturnedDeviceInterface /返回Direct3D设备接口指针的地址 );,Direc

13、t3D设备类型,D3DDEVTYPE_HAL(Hardware Abstraction Layer硬件提取层):代表一种高带的渲染过程,它尽量通过显示硬件进行光栅化处理,坐标转换,照明处理。 D3DDEVTYPE_REF(Reference Rasterizer Device参考光栅设备):是当显示卡不支持某些硬件功能时采取的一种替换策略,一般被用来测试显示卡不支持的Direct3D功能。 D3DDEVTYPE_SW:是一种外挂的Direct3D设备,用以支持第3方软件。,设备行为标志列表,D3DPRESENT_PARAMETERS结构定义,typedef struct_D3DPRESENT_

14、PARAMETERS_ UINT BackBufferWidth; UINT BackBufferHeight; D3DFORMAT BackBufferFormat; UINT BackBufferCount; D3DMULTISAMPLE_TYPE MultiSampleType; D3DSWAPEFFECT SwapEffect; HWND hDeviceWindow; BOOL Windowed; BOOL EnableAutoDepthStencil; D3DFORMAT AutoDepthStencilFormat; DWORD Flags; UINT FullScreen_Ref

15、reshRateInHz; UINT FullScreen_presentationInterval; D3DPRESENT_PARAMETERS;,D3DSWAPEFFECT的类型值列表,FullScreen_RefreshInHz类型值列表,FullScreen_PresentationInterval类型值列表,D3DPRESENT_PARAMETERS设定示例,D3DPRESENTPARAMETERSstPresentParam; ZeroMemory(,建立D3D设备代码示例,if(FAILED(g_pD3D-CreateDevice( D3DADAPTER_DEFAULT, D3D

16、DEVTYPE_HAL, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, ,处理消息循环,添加了图形绘制功能的回调函数片段,switch(msg) case WM_PAINT: Render(); ValidateRect(hWnd,NULL); return 0; case WM_DESTROY: CleanUP(); PostQuitMessage(0); return 0; return DefWindowProc(hWnd,msg,wParam,lParam);,ValidateRect()函数,The ValidateRect function

17、validates the client area within a rectangle by removing the rectangle from the update region of the specified window.,ValidateRect()函数原型,BOOL ValidateRect( HWND hWnd, CONST RECT *lpRect );,图形显示,Render()函数的代码,VOIDRender() g_pd3dDevice-Clear(0,NULL,D3DCLEAR_TARGET, D3DCOLOR_XRGB(00,255),1.0f,0); if(S

18、UCCEEDED(g_pd3dDeVICE-BeginScene() g_pd3dDevice-EndScene(); g_pd3dDevice-Present(NULL,NULL,NULL,NULL); ,Clear()函数,在绘制3D图形前,我们必须调用Clear把要用到的缓冲区初始化。,Clear()函数原型,HRESULTIDirect3DDevice9:Clear (DWORD Count,/重置的矩形区域数量 const D3DRECT* pRects,/重置的矩形区域 /数组指针 DWORD Flags,/重置缓冲区标志, /指定重置的缓冲区。 D3DCOLOR Color,/重置颜色值 float z,/重置的浓度值,最远为1.0f最近为0。 DWORD stencil/重置的模板。 );,Flags可使用下列的任意组合,color取值,color可以用宏D3DCOLOR_XRGB创建颜色值。 如:D3DCOLOR_XRGB(255,0,0)为红色。,渲染的开始与结束,在开始绘制图形的程序开始之前,必须先调用IDirect3DDevice9:BeginScene()函数,通知Direct3

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论