计算机图形学-第一章_第1页
计算机图形学-第一章_第2页
计算机图形学-第一章_第3页
计算机图形学-第一章_第4页
计算机图形学-第一章_第5页
已阅读5页,还剩37页未读 继续免费阅读

下载本文档

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

文档简介

1、D3D图形编程技巧 序言 概述 教学内容: 1、基本图形学概念,线性代数的使用。 2、三维图形学基本知识:平移、旋转、缩放、投 影。 3、Direct3D的使用。 4、矩阵与欧拉角:摄像机的建立。 5、光照与材质:基本概念。 6、地形系统的概念与建立。 7、粒子系统。 8、基本图元、碰撞检测以及其它高级概念。 教材使用 序言 概述 参考资料 使用工具: 编译环境:Visual Studio 2008及其以上版本 工具: DirectX SDK 地址:http:/ displaylang=en MSG的内部结构 typedef struct tagMSG / msg HWND hwnd; UIN

2、T message; WPARAM wParam; LPARAM lParam; DWORD time; POINT pt; MSG; /消息来源的窗口句柄消息来源的窗口句柄 /消息消息ID /消息的附加参数 /消息产生的时间 /消息产生的窗口位置 其为消息的实质,通常为WM_XXX的样式 /如鼠标消息 第一章:WINDOWS DX程序设计基础 WINDOWS程序设计基础 句柄(HANDLE):资源的标识 句柄,是整个windows编程的基础。一个句柄是指一个用来标志应 用程序中的不同对象和同类对象中的不同的实例不同对象和同类对象中的不同的实例的唯一唯一存在的32位位 整数整数值,其特性类似一

3、个地址。 在Windows编程中,句柄可以看做是相关资源或实例,如一个窗 口,按钮,图标,滚动条,输出设备,控件或者文件等,的唯一 标示。句柄在Windows编程中,大量使用,如 HINSTANCE(实例句柄) HBITMAP(位图句柄) HDC(设备描述表句柄) HICON(图标句柄) 如:int对应 INT, char对应CHAR,float对应FLOAT 同时,WINDOWS还按照匈牙利命名法的相关规则对相关类型指 针进行了重新定义,如LPSTR, PBYTE等。另外,WINDOWS还 按照需要重新定义了一些类型,如WPARAM, LPARAM, WORD 等,其实质也是内建类型的重命名

4、。 参考:ms- help:/MS.VSCC.v90/MS.MSDNQTR.v90.chs/winprog/winprog/windows_data_ types.htm WINDOWS程序设计基础 WINDOWS SDK程序设计流程 1、入口函数:WinMain int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int iShowCmd ) 当前实例 之前实例 命令行 窗口显示模式 实例句柄 字符串,typedef char* LPSTR ! 如同C/C+的Main函数一样,W

5、inMain代表了一个WINDOWS 程序的入口点,其样式必须保持不变。 第一章:WINDOWS DX程序设计基础 typedef struct _WNDCLASS UINT style; WNDPROC lpfnWndProc; int cbClsExtra; int cbWndExtra; HINSTANCE hInstance; HICON hIcon; HCURSOR hCursor; HBRUSH hbrBackground; LPCTSTR lpszMenuName; LPCTSTR lpszClassName; WNDCLASS; 窗口类型 窗口过程函数指针 当前应用程序句柄 图

6、标句柄 光标句柄 背景画刷句柄 窗口类名 WNDCLASS wc; /初始化相关字段 WNDCLASS结构体 第一章:WINDOWS DX程序设计基础 代码中的设计窗口 第一章:WINDOWS DX程序设计基础 3、注册窗口 RegisterClass( 4、创建窗口 HWND CreateWindow( LPCTSTR lpClassName, /已注册的窗口类的名字 LPCTSTR lpWindowName, / 窗口的名字,即标题栏上显示的文字 DWORD dwStyle, / 窗口的类型 int x, / 窗口显示时左上角的x坐标 int y, /窗口显示时左上角的y坐标 int nW

7、idth, / 窗口宽度 int nHeight, / 窗口高度 HWND hWndParent, / 父窗口的句柄 HMENU hMenu, / 菜单的句柄 HINSTANCE hInstance, / 实例的句柄 LPVOID lpParam / 与窗口相关的附加参数 ); HWND hwnd = CreateWindow(); 第一章:WINDOWS DX程序设计基础 4、显示和更新窗口 ShowWindow(hWnd,iShowCmd); 创建好的窗口句柄 显示状态 UpdateWindow(hWnd); 5、开始消息循环 MSG msg; while(GetMessage( /翻译消

8、息 DispatchMessage( /分派消息 来源于WinMain参数,有3 种状态: SW_SHOWNORMAL, SW_SHOWMAXMIZED, SW_SHOWMINNOACTI VE 第一章:WINDOWS DX程序设计基础 消息循环相关函数: BOOL GetMessage( LPMSG lpMsg, / 消息消息 HWND hWnd, / 哪个窗口的消息队列哪个窗口的消息队列 UINT wMsgFilterMin, / 消息的最小值消息的最小值 UINT wMsgFilterMax / 消息的最大值消息的最大值 ); 1) GetMessage:负责从消息队列中获取消息 消息过

9、滤 2) TranslateMessage:翻译消息 BOOL TranslateMessage( const MSG *lpMsg ); 例:键盘按下某个键会产生WM_KEYDOWN消息,但 是要知道到底按下的那个键,需将按键信息的ASCII 码插入消息,并翻译为WM_CHAR消息进行处理。 第一章:WINDOWS DX程序设计基础 2) DispatchMessage :分发消息 DispatchMessage函数的作用是将收到的消息传给窗口的 ,即去处理。这个窗口过程 函数就是在设计窗口类时设计窗口类时指定的。 ! 回调函数的概念: 回调函数是一个由开发者实现,但交由系统自动调用的函数。

10、 其往往通过函数指针的方式赋值给某个其它函数或者数据结构 作为参数。窗口过程函数是一个典型的回调函数。 第一章:WINDOWS DX程序设计基础 WINDOWS程序设计基础 6、窗口过程函数(消息处理)。 函数原型:LRESULT CALLBACK FuncName( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam ) 所属窗口 消息 附加参数 内部结构:switch(msg) case WM_XXX: /Do something; / return DefWindowProc(hWnd, Msg, wParam, lParam); 函数名自

11、定 实际是一个unsigned int DefWindowProc是默认的窗口过程,即并不是所有消息都需要开发者处理,可以 交给WINDOWS处理,如关闭窗口、最大化、最小化等。 将基本的WINDOWS程序设计流程进行封装对以后的学习会 有帮助,这里将其封装到d3dmain.cpp文件中,简单来说,就 是分成以下几个步骤: 第一章:封装后的基本流程 bool InitWindowApp(HINSTANCE, int show)/负责窗口设计、注册和创建 提示:以后会引入一个重载版本, InitWindowApp(HINSTANCE, int show, int width, int heigh

12、t) int Run(HINSTANCE, int show) /负责消息循环 同时引入一个全局窗口句柄,用于后期的使用。 HWND MainWindowHandle 第一章:封装后的源文件概览 /File: d3dmain.cpp #include /The main window handle HWND mainWindowHandle = NULL; /function to initialize a window Bool InitWindowsApp(HINSTANCE hinstance, int show); /function to run the message loop i

13、nt Run(); /The Window procedure LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); /Windows main Function int WINAPI D3DMain(/*参数略*/) / /实现概要 第一章:封装后的源文件概览 int WINAPI WinMain(/*参数省略*/) /调用InitWindowApp完成窗口的设计、注册和创建 if( !InitWindowApp(hinstance, nCmdShow) MessageBox(NULL, _T(“初始化失败”); return 0; /进

14、行消息循环 return Run(); /function to initialize a window bool InitWindowsApp(HINSTANCE hinstance, int show) /设计窗口,初始化WNDCLASS结构体 /注册窗口,调用RegisterClass /创建窗口,使用全局窗口句柄 mainWindowHandle = CreateWindow( /*/); /显示和更新窗口 return true; 封装后的源文件概览 /接上 LRESULT CALLBACK WndProc(/*参数略*/) /swichcase case WM_KEYDOWN: i

15、f(wParam = VK_ESCAPE) DestroyWindow(mainWindowHandle); return 0; case WM_DESTROY: PostQuitMessage(0); return 0; /不处理的消息交给默认窗口处理过程 /旧版 int Run() MSG msg; ZeroMemory( while(GetMessage( DispatchMessage( return msg.wParam; DirectX3D API的引入 DirectX是微软公司提供的一套底层API,涵盖2D/3D加速功能, 本门课使用DirectX API作为教学工具,Direc

16、tX使用了微软的 COM技术。DirectX sdk请到此地址下载: http:/ us/download/details.aspx? displaylang=en 选择”库文件”插入新行并输入 C:Program FilesMicrosoft DirectX SDK (June 2010)Libx86 新建项目以后,选择项目属性配置属性VC+目录,在库目录和包含目录分 别添加上面对应的地址即可 VS2010及以上版本: 提示:如果安装目录自行更改过,请找到对应的安装目录 DirectX 3D的基本知识与初始化 Direct3D 是一套定义好的图形API(Application Program

17、ming Interface),其建立起了一套与硬 件无关的抽象层(HAL, Hardware Abstract Layer),使我们可以使用统一的规范与不同的硬 件打交道: Direct3D使用了COM(Component Object Model,对 象组件模型)技术,COM技术类似于JAVA的接口, 其提供了一系列实现或未实现的类和方法(或函数)。 DirectX 3D的基本知识与初始化 IUnKnown COM类 AddRef Release QueryInterfac e COM需要知道的知识: 1、对于一个COM类,其实现一般由lib(库 文件)提供,如d3dx9.lib。 2、而

18、COM接口类命名,一般都有一个前缀 I, 如IDirect3DDevice9。 3、初始化一个COM对象使用C+关键字 new,而释放的时候,使用Release 如: IDirect3DDevice9* pd3d = new IDirect3DDevice9(); /使用完成后 if(pd3d != NULL) pd3d-Release(); pd3d=NULL; DIRECT 3D的2D平面(表面: Surface) DirectX 3D的基本知识与初始化 2D平面可以认为是3维空间的 特例(即缺少了Z轴的3D空间), 或者认为是3维空间在二维平面 的投影。在Direct3D中,2D表 面可

19、以看做是一个存储2D图像 数据的像素矩阵: width:表面宽度,单位像素 height:表面高度,单位像素 pitch:跨度,单位为字节,每一行 像素的字节大小。 pitch = width * sizeof(像素) 交换链和页面置换(可以理解为2次缓冲) DirectX 3D的基本知识与初始化 显示器平面 显示平面缓冲 内存平面2 显示当 前帧 计算下一帧 显示下一帧 提交 深度缓存(depth buffer) DirectX 3D的基本知识与初始化 深度缓存可以理解为,为每一个像素 保存的深度值(即距离摄像机的远 近),在计算机图形学领域,绘制的 原则是只绘制能看得见的东西,而忽 略不可

20、见(被遮挡)的细节。 被遮挡的细节没 有必要绘制出来 像素格式 在Direct3D的2D平面部分,提到其实际是一个像素矩阵,但一个像素到底有多 大并没有涉及,最常见的格式是以下两种: XRGB ARGB 32位,最高8位不使用,剩余为RGB空间 D3DFMT_X8R8G8B8 32位,最高8位是Alpha值,剩余为RGB空 间, D3DFMT_A8R8G8B8 初始化Direct3D的过程 DirectX 3D的基本知识与初始化 获取接口 IDirect3D9指针 检查设备性能 D3DCAPS9(暂 不使用) 初始化D3D参数 D3DPRESENT_PA RAMETERS结构体 创建 IDir

21、ect3DDevice9 对象 IDirect3D9* pd3d9 = 0; pd3d9 = Direct3DCreate9(D3D_SDK_VERSION); D3DCAPS9结构体在顶点计算处再考虑,其主要 作用是检查是否支持硬件顶点计算 D3DPRESENT_PARAMETERS d3dpp; ZeroMemory( /d3dpp.BackBufferWidth = ; IDirect3DDevice9* pd3ddevice = 0; pd3d9- CreateDevice(设备, 硬件模式, 主窗口句柄, 顶点模式, 实际初始化代码 DirectX 3D的基本知识与初始化 这里使用3

22、个函数来完成初始化,绘制,以及回收内存的操作,分别是: bool InitializeD3D(HWND hWnd, bool fullscreen); void RenderScene(); void Shutdown(); 同时,定义两个全局变量: IDirect3D9* g_d3d = NULL; IDirect3DDevice9* g_d3ddevice = NULL; 提示:实际代码中使用 LPDIRECT3D9以及 LPDIRECT3DDEVICE9,这只是 为了方便,LP代表指针。 另外,实际的初始化代码将分别封装到D3DUtility.h和D3DUtility.cpp文件中 /D

23、3DUtility.h /#ifndef #define 防止多次包含的技术 #include #include #pragma comment(lib, “d3d9.lib”) #pragam comment(lib, “d3dx9.lib”) /以上3个函数的声明 #endif /InitializeD3D的实现摘要 bool InitializeD3D( HWND hWnd, bool fullscreen) /获取g_D3D对象,D3D_SDK_VERSION是一个版本号,不能更改 g_D3D = Direct3DCreate9(D3D_SDK_VERSION); /建立D3DPRES

24、ENT_PARAMETERS结构体,初始化相关内容 D3DPRESENT_PARAMETERS d3dpp; ZeroMemory( d3dpp.Windowed = !fullscreen; d3dpp.BackBufferWidth = 640; d3dpp.BackBufferHeight = 480; d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; d3dpp.BackBufferFormat = D3DFMT_X8R8G8B8; /创建IDirect3DDevice9对象,使用CreateDevice方法 if (FAILED( g_D3D-Cre

25、ateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, return true ; DirectX 3D的基本知识与初始化 /窗口化 /后台缓存大小为640*480 /交换方式,不改变 /像素大小为32位,最高8位不使用 DirectX 3D的基本知识与初始化 typedef struct D3DPRESENT_PARAMETERS UINT BackBufferWidth; UINT BackBufferHeight; D3DFORMAT BackBufferFormat

26、; UINT BackBufferCount; D3DMULTISAMPLE_TYPE MultiSampleType; DWORD MultiSampleQuality; D3DSWAPEFFECT SwapEffect; HWND hDeviceWindow; BOOL Windowed; BOOL EnableAutoDepthStencil; D3DFORMAT AutoDepthStencilFormat; DWORD Flags; UINT FullScreen_RefreshRateInHz; UINT PresentationInterval; D3DPRESENT_PARAM

27、ETERS, *LPD3DPRESENT_PARAMETERS; /后台缓存高宽度 /后台缓存格式 /后台缓存个数 /多重采样类型 /多重采样质量 /交换方式 /设备相关窗口句柄 /是否窗口化 /是否允许深度缓存 /深度缓存格式 /附加特性 /刷新频率,其倒数则为次数/秒 /显示频率或者提交频率 HRESULT CreateDevice( /物理显卡,使用D3DADAPTER_DEFAULT in UINT Adapter, /设备类型,硬件设备为D3DDEVTYPE_HAL in D3DDEVTYPE DeviceType, /窗口句柄 in HWND hFocusWindow, /顶点处理

28、模式,使用软件方式,D3DCREATE_SOFTWARE_VERTEXPROCESSING in DWORD BehaviorFlags, in, out D3DPRESENT_PARAMETERS *pPresentationParameters, out, retval IDirect3DDevice9 *ppReturnedDeviceInterface ); DirectX 3D的基本知识与初始化 RenderScene的实现: 前面提到了,DirectX的绘制实际上是后台与前台的交换过程,绘制工作都是 在后台完成的。因此,绘制下一帧的时候需要先清空上一次的后台操作,绘 制完成后,调用Present显示 DirectX 3D的基本知识与初始化 void RenderScene() /清空后台缓存 g_D3DDevice-Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(255,255,255), 1.0f, 0); /开始绘制 g_D3DDevice-BeginScene(); /结束绘制 g_D3DDevice-EndScene(); /显示 g_D3DDevice-Present(NULL, NULL, NULL, NULL); Shutdown的实现:

温馨提示

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

评论

0/150

提交评论