DirectX技术_01
- 格式:wps
- 大小:179.08 KB
- 文档页数:16
显卡渲染技术了解DirectX和OpenGL的差异在现代计算机图形处理中,显卡渲染技术起着至关重要的作用。
而在图形渲染技术的开发中,DirectX和OpenGL是两个具有代表性的渲染API(Application Programming Interface),它们在不同的操作系统和应用领域中具有广泛的适用性。
本文将针对DirectX和OpenGL这两种渲染技术进行详细的了解,并探讨它们之间的差异。
一、DirectX和OpenGL的概述DirectX是由微软公司开发的一种多媒体应用编程接口,它最早是为Windows操作系统开发的。
DirectX包含了一系列的API,允许开发者使用较低层次的硬件抽象接口进行图形渲染、音频、输入以及网络编程。
DirectX由于其在Windows平台上的广泛应用和微软的支持,成为了游戏和多媒体领域中最流行的图形渲染API之一。
相反,OpenGL是一种开放标准的多功能图形渲染API,最早由OpenGL Architecture Review Board(ARB)进行管理。
OpenGL跨平台的特性使其可在不同的操作系统上进行运行,例如Windows、macOS 和Linux等。
OpenGL依赖于GPU的硬件加速特性,提供了一种直接的方式来访问图形硬件,使开发者能够快速高效地绘制3D图形。
二、DirectX和OpenGL的差异1. 开发难度和学习曲线:基于其开放标准的特性,OpenGL在学习和使用上相对较为简单。
而由于DirectX更加庞大且有复杂的API结构,因此学习和使用DirectX可能需要更多的时间和精力。
2. 平台支持:DirectX主要用于Windows平台,而OpenGL在所有支持图形渲染的操作系统上都有良好的兼容性。
这使得OpenGL成为了游戏和应用程序开发的主要选择。
3. 性能表现:虽然DirectX和OpenGL在性能方面都能提供高效的图形渲染,但DirectX在某些场景下可能会略胜一筹。
DirectX3D SDK 基础教程(一)Direct3D 10 基础Tutorial 1: Direct3D 10 Basics概述在这第一篇教程中,我们将通过一些必要的元素去创建一个最小的Direct3D 10 应用. 每一个 Direct3D 10 应用都必须有这些功能元素对应功能属性. 这些元素包括设置窗口和设备对象,然后在窗口中显示一种颜色。
设置Direct3D 10 设备现在我们在一个只有一个空窗体的工程中, 去设置一个 Direct3D 10 设备, 如果你想去渲染任何一个3D 场景,设置3D 设备是非常必要的。
我们首先要做的是去创建2个对象:一个设备和一个交互链。
应用程序使用设备对象在缓冲区上执行渲染。
设备也包含了去创建资源的方法。
交互链对象的责任是从缓冲区中获得数据,这些数据是将被设备对象渲染并显示在显示器屏幕上。
交互链对象包含两个或更多地缓冲区,主要分为前端和后端缓冲区。
前端缓冲区是当前正在被显示给用户的数据,大多是设备对象渲染的材质,前端缓冲区是只读的,不能被修改。
后端缓冲区是渲染目标,就是设备将要渲染的材质。
一旦完成了绘画操作,这个交互链对象将显示后端缓冲区。
通过交互两个缓冲区,这个后端缓冲区变成了前端缓冲区。
为了创建交互链对象,我们要填写一个DXGI_SWAPCHAIN_DESC 结构体,这个结构体是我们要创建的交互链的描述。
有几个字段值的我们去说一下.BackBufferUsage 是一个标志字段,告诉应用程序怎样去使用后端缓冲区。
如果我们想去渲染后端缓冲区,我们就要设置 BackBufferUsage 标志为 DXGI_USAGE_RENDER_TARGET_OUTPUT.OutputWindow 字段代表窗口,交互链使用这个窗口去显示图像到屏幕上。
SampleDesc 被用来打开duo重采样. 由于这个教程不做多重采样,所以SampleDesc的 Count 被设置到 1,并且Quality被设置到 0 去关闭此功能。
如何安装和使用DirectX返回上级1、编译库和运行库2、安装VC++ 5.03、安装DirectX5.0 的SDK4、DirectX 5.0 的文件说明5、卸载DirectX1、编译库和运行库回到目录为了能够使用MS VC++5.0进行DirectX编程,必须拥有一套DirectX 的SDK(软件开发工具包),它包括了编译DirectX应用程序所需要的编译库文件(*.lib)、头文件(*.h)、示例,还有帮助。
MS VC++5.0自己带有3.0版的DirectX SDK,所以只要按照缺省的安装,你的VC 就已经可以编制基于DirectX的应用程序了。
不过,缺省的安装并不会把DirectX的在线帮助包括在内,没有这个功能强大的在线帮助,你常常会陷入孤立无援的境地。
这一章将教你如何安装一个全功能的MS VC++5.0 DirectX编译环境。
如果你有DirectX5.0版或更高版的SDK,本章还将教你如何更新旧版的DirectX编译环境。
且慢,如果你辛辛苦苦编了一个漂亮的动画程序,兴高采烈的拷给你的朋友,第二天他们却告诉你根本就运行不了,那将是何等的尴尬与无奈。
原来,要让DirectX应用程序能在脱离VC的环境下执行,你的电脑还必须安装有DirectX运行库(Runtime library),这也就是我们常说的DirectX引擎(Engine)或驱动程序(Device Driver)。
好在Microsoft 为了推行其DirectX标准,将这套驱动程序库免费奉送,你可以从Microsoft公司的Web站点的DirectX页上下载,当然,这显然是个很愚蠢的方法,因为,在很多高速图形游戏如Need For Speed(极品飞车)、Motor Racer(摩托英豪)、Diablo(暗黑破坏神)、Red Alert (红色警戒)等中,都有DirectX驱动程序提供。
安装驱动程序只用运行Setup文件就可以了,它默认的包括了在Windows注册表中注册DirectX部件,并且将动态连接库文件(DLL)复制到Windows系统目录中。
DirectX 8 教程著Andy Pike译Aman JIANG第一章:准备就绪What you will need (你需要什么)•DirectX 8.0 SDK (可以从下戦)•VC6(SP5)/•Windows程疗:设计经验•通晓C++和OOPIntroduction (序)(原著的话)欢迎阅读本DX教程。
本教程至少能帮你入门、使你了解怎样用DX8来开发Windows游戏。
我写这个教程的原由有二:首先,当出现DX时,我还是•个初学者。
所以,我想边学习边写•个教程来锻炼自己。
其次,对初学者来说,DX SDK并不是很有帮助。
而且,网上也没有什么像样的Dx8教程。
另外,就像上面我提到的,我也是个初学者,所以,如果你发现教程中有什么地方不对,请给我写信:。
译者言我也是•名初学者,所以,有言在先:如果你读英文能如履平地,建议你还是去读原著。
此教程很适合入门,等你入门以后,你会发现,其实•切并没有想象的那样复杂。
这是个不错的Dx8教程,我会尽最大努力把它翻译好。
注:我并没有完全按照原著来译,不适之处,请多包涵。
嗯,你应该弄到教程附带的源代码,没有那个可不行!可以到去下载。
欢迎指出我的错误,或与我联系,我的Email: or , QQ:15852673oCOMWhat is COM? COM 是什么呢?COM 就是Component Object Model,组件对象模型:COM 接口和C+ + 的抽象类相似(但不•样),就像抽象类没有与之相关的实际代码•样,COM描述了一套符号和语法而非实现过程。
你也可以把COM对象就想象成•套为某个主题而设计的•整套库函数。
DX就提供了•套完整的设计3D 游戏的库。
最棒的就是,使用DX时,你不必去肖接接触駛件,而由DX帮你代理了。
这使得•些事情变得简单To使用COM时应该注直必须在程序结束前释放所有的COM对象(或接口)。
而且,释放它们的顺序应该和创建它们的顺序相反。
Windows 98的DirectXWindows 98的多媒体功能主要集中在两方面:DirectX 和数字视频。
而其中广为人知的当属 DirectX。
DirectX是一个用于多媒体应用程序和硬件增强的编程环境,它是微软为了将其Windows建设成适应各种多媒体的最好平台而开发设计的。
最初,DirectX作为微软游戏软件开发工具包(简称SDK)的一部分提供给那些对设计高级游戏和动画感兴趣的程序员。
1996年,DirectX成为微软自身SDK的一部分,而Windows 98内则集成了DirectX 5.0,表明它已成为操作系统的一部分。
DirectX技术是一种API(应用程序接口),每个DirectX部件都是用户可调用的API的总和,应用程序使用它可以直接访问计算机的硬件。
这样,应用程序就可以利用硬件加速器(Hardware Accelerator)。
如果硬件加速器不能使用,DirectX 还可以仿真加速器提供强大的多媒体环境。
为了理解DirectX,我们可以把系统分为四层:●硬件/网络层:放置有多媒体设备,包括图形加速器、声卡、输入设备以及网络通信设备等;●DirectX基础层:为图像、声音和设备提供多媒体基本服务;●DirectX媒体层:为动画制作、音频和视频等提供API功能;●组件层:包括Active X控制和应用,它利用DirectX API功能的优势为用户提供多媒体服务。
我们重点看看DirectX基础层和媒体层。
DirectX基础层1、DirectDrawDirectDraw可以直接用于应用控制显示硬件,它采用OLE的部件目标模型来实现设备独立接口,应用时可采用这种接口直接访问硬件,因此能够充分发挥设备能力的优点。
DirectDraw的任务是使应用持续、安全且极其快速,提供全方位的2D服务,包括位图和动画的制作。
它能对显存和显示硬件、管理进行直接操作,具有定位、移动、转换自由显示存储以及显示硬件的展开、结构制图、旋转等功能,而以前这些功能只有使用微调特定硬件的汇编语言才能完成。
显卡 : 什么是DirectXDirectX并不是一个单纯的图形API,它是由微软公司开发的用途广泛的API,它包含有Direct Graphics(Direct 3D+Direct Draw)、Direct Input、Direct Play、Direct Sound、Direct Show、Direct Setup、Direct Media Objects等多个组件,它提供了一整套的多媒体接口方案。
只是其在3D图形方面的优秀表现,让它的其它方面显得暗淡无光。
DirectX 开发之初是为了弥补Windows 3.1系统对图形、声音处理能力的不足,而今已发展成为对整个多媒体系统的各个方面都有决定性影响的接口。
DirectX 5.0微软公司并没有推出DirectX 4.0,而是直接推出了DirectX 5.0。
此版本对Direct3D 做出了很大的改动,加入了雾化效果、Alpha混合等3D特效,使3D游戏中的空间感和真实感得以增强,还加入了S3的纹理压缩技术。
同时,DirectX 5.0在其它各组件方面也有加强,在声卡、游戏控制器方面均做了改进,支持了更多的设备。
因此,DirectX发展到DirectX 5.0才真正走向了成熟。
此时的DirectX性能完全不逊色于其它3D API,而且大有后来居上之势。
DirectX 6.0DirectX 6.0推出时,其最大的竞争对手之一Glide,已逐步走向了没落,而DirectX 则得到了大多数厂商的认可。
DirectX 6.0中加入了双线性过滤、三线性过滤等优化3D图像质量的技术,游戏中的3D技术逐渐走入成熟阶段。
DirectX 7.0DirectX 7.0最大的特色就是支持T&L,中文名称是“坐标转换和光源”。
3D 游戏中的任何一个物体都有一个坐标,当此物体运动时,它的坐标发生变化,这指的就是坐标转换; 3D游戏中除了场景+物体还需要灯光,没有灯光就没有3D物体的表现,无论是实时3D游戏还是3D影像渲染,加上灯光的3D渲染是最消耗资源的。
DirectX及DX11曲面细分技术简介DirectX是一种接口方式,常见的有DirectX,一般的程序员只需要遵照相应的规范就可以完成程序的开发而不需要分别为不同的硬件提供不同的程序。
DirectX目前最新版本为11,它能增强计算机的多媒体功能。
使用DirectX可访问显卡与声卡的功能,从而使程序可提供逼真的三维(3D)图形与令人如醉如痴的音乐与声音效果。
DirectX是一组低级"应用程序编程接口(API)",可为Windows程序提供高性能的硬件加速多媒体支持。
DirectX使程序能够轻松确定计算机的硬件性能,然后设置与之匹配的程序参数。
该程序使得多媒体软件程序能够在基于Windows的具有DirectX兼容硬件与驱动程序的计算机上运行,同时可确保多媒体程序能够充分利用高性能硬件。
DirectX包含一组API,通过它能访问高性能硬件的高级功能,如三维图形加速芯片和声卡。
这些API控制低级功能(其中包括二维(2D)图形加速)、支持输入设备(如游戏杆、键盘和鼠标)并控制着混音及声音输出。
构成DirectX的下列组件支持低级功能:Microsoft DirectDraw Microsoft DirectDraw API支持快速访问计算机视频适配器的加速硬件功能。
它支持在所有视频适配器上显示图形的标准方法,并且使用加速驱动程序时可以更快更直接地访问。
DirectDraw为程序(如游戏和二维图形程序包)以及Windows系统组件(如数字视频编解码器)提供了一种独立于设备之外的方法来访问特定显示设备的功能,而不要求用户提供设备功能的其它信息。
Microsoft Direct3D Microsoft Direct3D API(Direct3D)为大多数新视频适配器内置的3-D调色功能提供界面。
Direct3D是一种低级的3-D API,它为软件程序提供一种独立于设备之外的方法以便与加速器硬件进行有效而强大的通信。
回调函数1.DDEnumCallbackDDEnumCallback是用于DirectDrawEnumerate函数的应用程序概念的回调函数。
BOOL WINAPI DDEnumCallback(GUID FAR *lpGUID,LPSTR lpDriverDescription,LPSTR lpDriverName,LPVOID lpContext);参数:lpGUIDDirectDraw对象的全局唯一标志符(GUID)的地址。
lpDriverDescription包括了设备描述的字符串的地址。
lpDriverName包括了设备名称的字符串的地址。
lpContext一个应用程序概念的结构的地址,将由DirectDrawEnumerate 函数传递给回调函数。
返回值:返回DDENUMRET_OK以继续列举。
返回DDENUMRET_CANCEL以终止。
备注:你能够利用LPDDENUMCALLBACK数据结构来声明一个指向该回调函数的指针变量。
快速信息:Windows NT:适用于或更新版Windows:适用于Windows 95或更新版Windows CE:不支持头文件:库文件:无(用户概念)2.DDEnumCallbackExDDEnumCallbackEx是用于DirectDrawEnumerateEx函数的应用程序概念的回调函数。
BOOL WINAPI DDEnumCallbackEx(GUID FAR *lpGUID,LPSTR lpDriverDescription,LPSTR lpDriverName,LPVOID lpContext,HMONITOR hm));参数:lpGUIDDirectDraw对象的全局唯一标志符(GUID)的地址。
lpDriverDescription包括了设备描述的字符串的地址。
lpDriverName包括了设备名称的字符串的地址。
lpContext一个应用程序概念的结构的地址,将由DirectDrawEnumerate 函数传递给回调函数。
directx中文手册1、什么是DirectX ?微软的DirectX软件开发工具包(SDK)提供了一套优秀的应用程序编程接口(APIs),这个编程接口可以提供给你开发高质量、实时的应用程序所需要的各种资源。
DirectX技术的出现将极大的有助于发展下一代多媒体应用程序和电脑游戏。
总的说来,使用DirectX的主要有两个好处:1、为软件开发者提供硬件无关性;2、为硬件开发提供策略。
1、为软件开发者提供硬件无关性微软开发DirectX,其最主要的目的之一是促进在Windows操作系统上的游戏和多媒体应用程序的发展。
在DirectX出现以前,主要的游戏开发平台是MS-DOS,游戏开发者们为了使他们的程序能够适应各种各样的硬件设备而绞尽脑汁。
自从有了DirectX,游戏开发者们便可以获益于Windows平台的设备无关性,而又不失去直接访问硬件的特性。
DirectX主要的目的就是提供象MS-DOS一样简洁的访问硬件的能力,来实现并且提高基于MS-DOS平台应用软件的运行效果,并且为个人电脑硬件的革新扫除障碍。
另一方面,微软公司开发DirectX是为了在当前或今后的计算机操作系统上提供给基于Windows平台的应用程序以高表现力、实时的访问硬件的能力。
DirectX在硬件设备和应用程序之间提供了一套完整一致的接口,以减小在安装和配置时的复杂程度,并且可以最大限度的利用硬件的优秀特性。
通过使用DirectX所提供的接口,软件开发者可以尽情的利用硬件所可能带来的高性能,而不用烦恼于那些复杂而又多变的硬件执行细节。
一个高表现力的基于Windows平台的游戏将得益于以下几种技术:专为提高图形运算及快速反应能力而设计的加速卡(Accelerator cards)即插即用以及其它Windows软硬件内建于Windows的通信服务, 包括DirectPlay2、为硬件开发提供策略DirectX的另外一个重要的目的是给硬件厂商提供开发策略,他们可以从高性能程序的开发者和独立的硬件供应商(independent hardware vendors IHVs)那里得到反馈。
#include<windows.h>#include<d3d9.h>struct CUSTOMVERTEX{FLOAT x, y, z, rhw;DWORD colour;};#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW|D3DFVF_DIFFUSE)#define SafeRelease(pObject) if(pObject != NULL) {pObject->Release(); pObject=NULL;} BOOL InitWindow(HINSTANCE hInstance, int nCmdShow,TCHAR *pszClassName );HRESULT InitD3D(HWND hWnd);HRESULT InitVertexBuffer();void Render();void CleanUp();LRESULT CALLBACK WinProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);LPDIRECT3D9 g_pD3D = NULL;LPDIRECT3DDEVICE9 g_pD3DDevice = NULL;LPDIRECT3DVERTEXBUFFER9 g_pVertexBuffer = NULL;int iStyle;int WINAPI WinMain( HINSTANCE hInstance, Windows分配的实例句柄,理解为程序运行时windows所给与的ID标示HINSTANCE hPrevInstance, 在win32应用程序中已经遗弃了,始终为NULLLPSTR lpCmdLine, 程序执行时所带的命令行参数int nCmdShow) 窗口的显示方式(最大化or最小化)//Windows窗口应用程序的入口函数{MSG msg; typedef struct tagMSG{HWND hwnd; 接受消息的窗口句柄UINT message; 消息类型WPARAM wParam; 附加的参数,根据不同类型消息有不同的含义LPARAM lParam; 附加的参数DWORD time; 消息放入消息队列中的时间POINT pt; 消息放入消息队列时的鼠标位置}MSG, * PMSG ;TCHAR *pszClassName = TEXT("DrawPrimtive");if (!InitWindow(hInstance,nCmdShow,pszClassName)){CleanUp();return FALSE;}while (TRUE) //进入消息循环{ 消息循环时需要完成读取消息和处理消息两个步骤,消息的读取windows 提供了两个API 函数,PeekMessage 和GetMessage ,两个函数都是从队列中取一条消息。
对于GetMessage :如果从消息队列获取的消息不是WM_QUIT 时返回非0;但当消息队列为空无法获取消息时,函数不返回,而是线程挂在这里,是阻塞式函数。
而对PeekMessag 而言如果消息队列中没有消息,立刻返回0;否则返回非0;是非阻塞式函数,这样当消息队列中没有消息的时候不会暂停消息循环的处理,所以我们这里单线程框架用PeekMessage 来获取消息,这样不会因为消息队列为空而停止游戏帧函数调用运行。
PeekMessage 函数原型如下: BOOL PeekMessag (); if (PeekMessage(&msg,NULL,0,0,PM_REMOVE)) { if (msg.message == WM_QUIT) break ;TranslateMessage(&msg); 把按键消息转换为字符消息DispatchMessage(&msg); 把消息发送到对应的窗口消息处理函数进行处理} else{Render(); } }CleanUp();return msg.wParam ;}LPMSGIpMsg接收消息信息的MSG 结构指针 HWND hWnd 其消息被检查的窗口的句柄UINT w MSGfilterMin指定被检查的消息范围里的第一个消息 UINT w MsgFilterMax 指定被检查的消息范围里的最后一个消息 UINT w RemoveMsg确定消息的处理方式BOOL InitWindow(HINSTANCE hInstance,int nCmdShow,TCHAR *pszClassName) //窗口初始化 {WNDCLASSwc; ATOM RegisterClassEx(CONST WNDCLASSEX *lpwcx); HWNDhWnd; Typedef struct _WNDCLASSEX{wc.style = CS_HREDRAW | CS_VREDRAW ; wc.lpfnWndProc =WinProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0;wc.hInstance = hInstance; wc.hIcon = NULL; wc.hCursor = NULL;wc.hbrBackground =(HBRUSH)GetStockObject(WHITE_BRUSH);wc.lpszMenuName = NULL;wc.lpszClassName = pszClassName;}WNDCLASSEX; RegisterClass(&wc); //注册窗口类UINT cbSize; Wndclassex 结构体的大小 UINT style;窗口的风格WNDPROC lpfnWndProc; 当消息处理时,所调用的回调函数 intcbClsExtra;intcbWndExtra;窗口类中设定的额外存储空间,存放自定义属性,不需要可设为0HANDLE hInstance; 这是主函数中第一个参数,系统分配的实例句柄 HICONhIcon ; 大图标(ALT+T ab 切换窗口时显示的大图标) HCURSORhCursor ; 滑鼠光标 HBRUSHhbrBackground; 窗口背景色的指定 LPCTSTRlpszMenuName; 菜单的制订 LPCTSTR lpszClassName; 窗口类的名称HICONhIconSm;小图标(窗口左上角的图案)hWnd = CreateWindow(pszClassName, 创建的窗口从属的窗口类名称(在之前窗口类定义中设定)TEXT("DrawPrimtive"), 窗口标题栏文字WS_OVERLAPPEDWINDOW,0,0, 窗口的风格以及指定窗口的起始坐标500, 500, 窗口的宽,高NULL, 窗口的父窗口NULL, 窗口的下拉式菜单hInstance, 标示此窗口属于哪一个程序实例NULL); 附加参数,在一些高级应用中用到if (!hWnd) return FALSE;if (SUCCEEDED(InitD3D(hWnd))){显示窗口ShowWindow(hWnd,nCmdShow);更新窗口UpdateWindow(hWnd);if(SUCCEEDED(InitVertexBuffer())) return TRUE;Else return FALSE;}else{return FALSE;}}HRESULT InitD3D(HWND hWnd) //D3D初始化{D3D是基于COM架构的,我们可以通过接口标示(IID)来查询相应的接口,但有更简单的方法,D3D提供一个API函数Direct3Dcreate9来帮助我们直接获得IDirect3D9的接口g_pD3D = Direct3DCreate9(D3D_SDK_VERSION); //创建D3D对象if(g_pD3D == NULL){return E_FAIL;}D3DDISPLAYMODE d3ddm;if(FAILED(g_pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &d3ddm))) //获取当前显示模式{return E_FAIL;}创建 D3D 设备需要的参数很多,为了方便起见,在创建对象之前,我们还必须填充一个结构体D3DPRESENT_PARAMETERS ,就像我们拿着图纸去找木匠做一张桌子,图纸上写明了桌子的长宽高以及材料等等属性,在做桌子时我们只需要把图纸给木匠,在我们创建设备对象这个桌子的时候,我们也必须提交一张图纸,也就是我们这里的要填充的结构体,这个结构体相当的复杂,定义如下: typedef struct _D3DPRESENT_PARAMETERS_ { UINT BackBufferWidth, BackBufferHeight; D3DFORMAT BackBufferFormat; 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_PARAMETERS;D3DPRESENT_PARAMETERS d3dpp; //设置Present 参数 ZeroMemory(&d3dpp, sizeof (d3dpp));通常情况下我们只需要设置三个成员Windowed 、SwapEffect 和BackBufferFormat 。
SwapEffect 有三种选择:D3DSWAPEFFECT_DISCARD:后台缓存复制到前台缓存中,并清空后台缓存;D3DSWAPEFFECT_FLIP:后台缓存复制到前台缓存中,保留后台缓存的内容,用于多于一个后台缓存的情况;成员说明BackBufferWidth ,BackBufferHeight 后台缓存宽度,后台缓存高度 BackBufferFormat 后台缓存的像素格式BackBufferCount 后台缓存的数目,为0也表示一个后台缓存MultiSampleType 多重采样类型(与下面参数可以提高渲染效果,但消耗更多资源) MultiSampleQuality 多重采样的质量 SwapEffect 缓存的交换方式hDeviceWindow 进行绘制的应用程序窗口句柄,为0表示当前窗口 Windowed窗口/全屏模式,为true 表示窗口,false 表示全屏 EnableAutoDepthStencil 深度缓存和模板缓存的打开标示 AutoDepthStencilFormat 深度缓存和模板缓存的像素格式 Flags附加标示,为0表示无标记FullScreen_RefreshRateInHz 全屏模式的刷新频率,窗口模式设为0 PresentationInterval提交的频率,为0表示立即提交D3DSWAPEFFECT_COPY:后台缓存复制到前台缓存中,保留后台缓存的内容,用于只有一个后台缓存的情况; d3dpp.Windowed = TRUE;d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; d3dpp.BackBufferFormat = d3ddm.Format; D3DCAPS9 caps;g_pD3D ->GetDeviceCaps( HRESULT IDirect3D9::GetDeviceCaps( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL,&caps);D3DCAPS9类型,这是一个保存着设备众多性能的结构体,我们要获取的信息在他的一个DevCaps 成员中,这是一个DWORD 类型的成员,其中每一位都代表一种性能,我们要查询的顶点运算在右起17位,通过和一个D3DDEVCAPS_HWTRANSFORMANDLIGHT 进行与运算,可以判断该位的值,进而知道设备是否支持变换和光照硬件顶点计算) int vp = 0;if ( caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT ) { // 是,支持硬件顶点处理vp = D3DCREATE_HARDWARE_VERTEXPROCESSING; } else { // 不,只能用软件顶点处理vp = D3DCREATE_SOFTWARE_VERTEXPROCESSING; }UINT Adapter, 设备的序号,D3DADAPTER_DEFAULT 为主显卡 D3DDEVTYPE DeviceType, 查询的设备类型,这里当然一般是查询HAL 设备 D3DCAPS9 *pCaps D3DCAPS9类型if (FAILED(g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, 设备的序号,D3DADAPTER_DEFAULT 为主显卡 D3DDEVTYPE_HAL, 设备类型hWnd, 窗口句柄值,指定D3D 设备对象所联系的win32窗口vp, 行为标示.常用有分别表示“顶点运算”是由软件模拟还是硬件运算 &d3dpp, 填充的结构体的地址&g_pD3DDevice))) D3D 设备对象的指针.用它来得到创建好的D3D 设备对象{ return E_FAIL; }渲染状态控制着D3D 设备进行光栅化行为的方式,通过对渲染状态的设置,我们可以指定对于着色模式、光照计算、深度缓存乃至雾化效果等等的方式。