C#中使用DirectX编程.docx
- 文档编号:3407525
- 上传时间:2022-11-22
- 格式:DOCX
- 页数:26
- 大小:82.32KB
C#中使用DirectX编程.docx
《C#中使用DirectX编程.docx》由会员分享,可在线阅读,更多相关《C#中使用DirectX编程.docx(26页珍藏版)》请在冰豆网上搜索。
C#中使用DirectX编程
C#中使用DirectX编程
(1)什么是DirectX?
什么是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平台的游戏将得益于以下几种技术:
∙专为提高图形运算及快速反应能力而设计的加速卡(Acceleratorcards)
∙即插即用以及其它Windows软硬件
∙内建于Windows的通信服务,包括DirectPlay
2、为硬件开发提供策略
DirectX的另外一个重要的目的是给硬件厂商提供开发策略,他们可以从高性能程序的开发者和独立的硬件供应商(independenthardwarevendorsIHVs)那里得到反馈。
所以,在DirectX程序员参考书中有时可能会提供那些还不存在的硬件加速设备的技术细节。
在很多时候,软件可以模拟这些特性,在另外一些情况下,软件根据硬件的指标判断出其特性,并且可以忽略那些硬件并不支持的性能。
已经和将要实现的显示设备的特性包括:
∙覆盖(Overlays),由于它的被支持,在图形设备接口中,窗口中的换页(pageflipping)将成为可用。
换页是用来在整个屏幕上显示画面的双缓冲(double-buffer)方案。
∙精灵引擎(Spriteengines),使精灵(不规则图形)覆盖更容易。
∙插补延展(Stretchingwithinterpolation),它可以更有效的保存显示内存,因为它可以使小幅画面延展到整个屏幕。
∙Alpha融合(Alphablending),它可以在硬件像素层(hardware-pixellevel)上混合颜色。
∙带有透视修正(perspective-correct)贴图的3D加速器,它允许你在3D表面上贴图。
比如,你可以在用3D软件制作的城堡的走廊里贴上砖块的位图来显示出透视效果。
∙为3D图象进行的位操作将Z方向考虑在内。
∙标准2兆显示内存,这在3D游戏中是最小需求。
∙压缩标准,这将允许你在显存中储存更多的信息。
这个标准不论是在软件还是硬件中执行都会相当快。
它将被用在贴图中并且包含透明压缩。
将要被包括的声音设备的新特性包括:
∙硬件及其外设可以提供空间环绕立体声效果。
∙声卡上内置音频内存。
∙音频-视频一体卡可共享其上的内存。
另外,视频回放将得益于今后的与DirectX相兼容硬件加速设备。
今后的DirectX版本中的一个特性是将支持硬件加速YUV视频解码。
C#中使用DirectX编程
(2)DirectX都有哪些组件?
DirectX的组件
回到目录
DirectXSDK为基于Windows平台的应用程序提供了以下几个组件。
∙DirectDraw:
通过直接访问显示硬件来提供高级的图象处理能力。
∙DirectSound:
它提供了软硬件的低延迟声音混频(low_latencysoundmixing)和回放(Playback),硬件加速,以及直接访问音频设备的能力。
∙DirectPlay:
它明确的提供了通用环境连接能力(generalizedcommunicationcapabilities),来简化你应用程序之间的通讯服务。
∙Direct3D:
它为主流的桌上型计算机和Internet用户提供实时的、交互的3D技术。
∙DirectInput:
它简化你的应用程序访问鼠标、键盘和操纵杆设备的能力。
∙DirectSetup:
一套简单的API向你提供安装DirectX部件的功能。
∙AutoPlay:
它也是Win95操作系统的一个特性,当你在光驱内放上光盘,指定的应用程序会自动执行。
C#中使用DirectX编程(3)关于DirectDraw
关于DirectDraw
回到目录
DirectDraw是DirectXSDK大家族中的一员,也是其中最主要的一个部件。
DirectDraw允许程序员直接的操作显存、硬件位图映射以及硬件覆盖和换页技术。
它在提供这些功能的同时,也使其与现在的基于MicrosoftWindows的应用程序和设备驱动程序相兼容。
DirectDraw是一个软件接口,它在提供直接访问显示设备的同时,与Windows图形设备接口(GDI)相兼容。
DirectDraw不是一个高层的图形程序编程接口,它为游戏和Windows子系统软件(例如:
3D图形包和数字视频编码)提供了一种与设备无关的途径,以获得访问特定的显示设备的某些高级特性的能力。
DirectDraw适用于种类众多的的显示设备,从简单的SVGA显示器到提供裁剪、缩放、和支持非RGB颜色格式的高级硬件实现设备。
设计这样的接口是为了让你的应用程序能够列举低层硬件的能力,并且对那些支持的硬件加速特性加以利用。
那些在硬件设备中不能实现的特性,DirectX将仿真出来。
DirectDraw提供了以下几个优点,这些好处在以前只有那些专为特定显示设备所写的软件才能利用。
∙支持双缓冲和换页图形
∙访问、控制显示卡的位图映射
∙支持3Dz-buffers(z缓存)
∙支持z方向(z-ordering)硬件辅助覆盖。
∙访问图形缩放硬件
∙仿真访问标准的和增强的显示设备内存空间
DirectDraw的任务是用与设备无关的途径来提供依赖于设备的访问显示内存的方法。
本质上,DirectDraw管理显示内存。
你的应用程序只需要懂得那些一般的关于硬件与设备有关的知识,比如RGB和YUV色彩格式和两条光栅线之间的pitch(宽距)。
在需要利用位转换或操作调色板寄存器时,你不需要为调用过程中的细节而烦恼。
使用DirectDraw,你可以方便的操作显示内存,充分的利用不同类型的显示设备的位转换和颜色压缩能力,而不需要依赖于某一个特定的硬件。
DirectDraw给运行于Windows95和WindowsNT4.0或更高版本的计算机提供了一个高性能的的游戏图象引擎。
C#中使用DirectX编程(4)为什么要使用DirectDraw?
为什么要使用DirectDraw?
回到目录
无庸置疑,人们之所以利用DirectDraw来开发各种游戏以及多媒体应用软件,是因为DirectDraw可以为他们的应用程序带来许多强大的功能提升。
∙DirectDraw可以充分评估视频硬件的能力,只要可能,它就会对其某一特性加以利用。
例如,如果你的显卡支持硬件Blit,DirectDraw就会将位图映射这一操作分派给显卡来完成,极大的提升运行速度。
此外,当某硬件不支持某项特性时,DirectDraw还提供了硬件仿真层(HEL)以完成这项操作。
∙DirectDraw的硬件抽象层(HAL)提供了一个统一的接口,通过它,开发者可以直接的操作显示存储器和视频存储器,从系统硬件中获取最大的表现能力。
∙DirectDraw运行于Windows95操作系统之上,从系统所提供的32位内存寻址和平面内存模型中获益。
DirectDraw将视频和系统存储器视为整块的空间,而不是碎片的集合。
如果你曾使用过区段偏移寻址,你将很快就喜爱上这种“平面”内存模型。
∙对于全屏模式的应用程序,DirectDraw使得多后台缓存的换页操作变得极为容易。
∙支持窗口和全屏模式应用程序的裁减。
∙支持3-Dz缓存。
∙支持带z轴方向的硬件辅助覆盖。
∙可访问图象缩放硬件。
∙可同时访问标准的和增强的显示设备内存区。
∙其它的特性,包括动态改变调色板、独占访问硬件、和分辨率切换等等。
合理和有效的利用DirectDraw的这些特性将使开发者很容易就能够写出比基于标准的WindowsGDI应用程序,甚至MS-DOS应用程序还要优秀的作品.
C#中使用DirectX编程(5)部件对象模型(COM)
部件对象模型(COM)
回到目录
DirectX是基于COM的一套软件编程接口。
部件对象模型(ComponentObjectModel,COM)是OLE的基础。
COM为OLE提供了编程模型和二进制标准。
COM定义并实现了软部件(如应用程序、数据对象、控件及服务)机制,并把它们统称为“对象”。
每个软部件对象由数据以及访问数据的函数组成,访问软部件对象数据的函数的集合称为“接口”。
从这里可以看出,COM的设计与C++类非常相似,即一个软部件对象具有一个内部数据结构和一组外部接口函数,允许通过接口函数对数据进行访问。
因此Microsoft公司把根据COM执行的对象统称为Windows对象。
但Windows对象与C++中的对象有明显的差别,Windows对象中没有公共数据,也没有成员函数,因此不能直接访问数据,也就是说数据是全封装的。
对象的提供者或服务器必须指明一个或多个接口的定义,每个接口都是相互关联的一组函数,执行对象的一个特性。
每个对象的一个用户(或称为“客户”)必须拥有一个接口指针才能访问对象。
当客户有了这个指针后,就可以使用这个对象而无需知道对象的含义,即使客户运行在不同的进程、不同的机器、不同的操作系统、由不同的软件开发而使用不同的语言,或者版本不同。
DirectXSDK接口被创建在COM编程层次表中很基础的一层。
每一个代表设备的对象的接口,比如IDirectDraw、IDirectSound、和IDirectPlay,是直接从IUnknownOLE接口中派生下来的。
这些基本对象的创建被操作于在该对象的动态连接库中,要比用Win32中专门用来创建COM对象的CoCreateInstance函数要好得多。
特别的是,DirectXSDK对象模型为每一个设备提供一个主要的对象。
其它的设备对象是由这个主要对象派生下来的。
例如,DirectDraw对象代表显示设备。
你可以用它来创建代表显存的主页面(DirectDrawSurface)对象,和代表硬件调色板的调色板(DirectDrawPalette)对象;相似的,DirectSound对象代表声卡,并且创建DirectSoundbuffer对象来代表声卡上的声音数据。
C#中使用DirectX编程(6).NETFramework中新托管Direct3D图形API的简介
(1)
本期内容
Direct3D体系结构
Direct3D管线
非托管的Direct3D
Direct3D扩展
托管的Direct3D
设备类
图形状态类
与几何形状相关的类
纹理类
托管的D3DX库
托管DirectX9.0示例框架
GraphicsSample类
初始化和清除
帧更新和呈现
小结
以上内容分为8个部分依次贴出,鄙视一下baidu,居然不能贴长文章!
文章来自msdnYahyaH.Mirza和HenrydaCosta,图片什么点击过去就能看到。
连翻译带抄,我也不容易啊。
想一次性看到全部内容到我的baidu文库去下载吧,1个积分。
最近做3D需要的资料多啊,给我分点积分让俺也挣一点。
===========我是不厚道的分割线==============================================
硬件加速的图形API所面临的基本挑战就是,让应用程序开发人员利用3D硬件领域中发生的快速技术革新的同时,允许图形硬件解决方案之间存在一定程度的兼容性和一致性。
达到此目的的一种方法就是,由委员会定义一种标准,然后让每个供应商支持该标准。
图形硬件供应商可以通过商定的扩展机制来革新和创建专用扩展。
随着时间的推移,硬件供应商可以游说标准制定机构接受它们的专用扩展并将其作为标准的一部分。
OpenGL1.1版就是该方法实现硬件互操作性的一个示例。
它的一个局限是,需要很长的时间才能将供应商特定的革新合并到多供应商标准中,因此会面临标准作废的风险。
在DirectX?
9.0中,DirectDraw®和Direct3D®的功能组合到名为DirectXGraphics的单个API中。
该组件的Direct3D部分将是本文的主要重点。
在Microsoft?
Direct3D中,程序员有两种选择:
依赖固定功能管线或可编程管线。
固定功能管线本身依赖于由Direct3D标准化的现有算法。
这些固定功能是通过一组类似于OpenGL的固定的枚举值来公开的,这意味着Direct3D和OpenGL的固定功能管线均使用内部switch语句。
在switch语句中与枚举值相对应的某些case可能是硬件加速的,这基于运行库所依赖的图形卡的功能。
在Direct3D中,在使用固定功能管线时,程序员首先检查运行库,查看图形卡是否支持特定功能。
因为一些图形卡并不支持通过Direct3D公开的所有功能,所以在Direct3D中提供了一个用来探测图形硬件的机制。
如果硬件不支持特定的图形功能,该检查将失败,并允许程序员查找其他的硬件加速算法。
请记住以下要点:
Direct3D固定功能管线公开硬件加速的功能。
尽管Direct3D有一个名为参考设备的仅限软件的仿真模式,但是,它设计用于调试和功能测试目的—而不是用来提供应用程序。
对于硬件和软件共同发展所面临的问题,另一个更有趣的方法是可编程管线。
在可编程管线中,程序员可以定义自己的算法,而不是选取预定义的枚举值并让Direct3D执行算法。
运行库将动态地编译基础图形硬件的算法。
在这种情况下,Direct3D运行库有一个实时(JIT)编译器,该编译器是硬件设备驱动程序的显式部分。
硬件供应商负责为其特定的图形硬件提供JIT编译器。
因此,Direct3D充当图形虚拟机,它使用自定义的图形指令集高效地虚拟化图形处理器(GPU)。
C#中使用DirectX编程(6).NETFramework中新托管Direct3D图形API的简介
(2)
Direct3D体系结构
尽管托管和非托管Direct3D编程层都是通过一系列对象公开的,但是您不应当将它们视为应用程序级别编程框架。
Direct3D体系结构的主要角色就是为更高级别的解决方案(如游戏引擎或布景图形API)提供基本功能。
为了帮助实现这些解决方案,Direct3D扩展库显式提供其他功能。
为了充分理解Direct3D体系结构,您不但必须了解所提取的功能,而且还要了解该功能的组织和公开方式。
在以下几节中,我们将概述Direct3D体系结构的基本元素,并讨论如何通过非托管的COMAPI和托管.NET抽象层来公开它们。
Direct3D管线
正如计算机硬件体系结构所常见的那样,3D图形体系结构中使用的两个性能优化技术是管线化和并行化。
通过Direct3D公开的算法在逻辑上组织为管线。
图1说明了Direct3D管线。
Direct3D管线应当被视为一组作用于3D几何数量的算法,对于Direct3D来说,这些几何数量是预定义的顶点和基元。
管线的主要目的是将几何数据转换为在视频显示器上呈现的图像。
Direct3D网格化阶段用于网格化(转换为三角形)由Direct3D预定义的一组更高阶的固定基元,这些基元包括三角形块、矩形块和N边形块(尽管三角形块仍是最常见的几何形状)。
目前,网格化阶段不是可编程的,因此,Direct3D不公开任何允许针对图形硬件生成程序几何的机制。
就最小化通过总线发送的数据而言,程序几何提供了许多好处。
在不久的将来,您有可能看到为可编程的网格化阶段提供的硬件支持。
在管线的变换和光照阶段,会将顶点位置和法线从模型坐标系统变换为世界坐标系和照相机坐标系,这是通过世界变换和视图变换来完成的。
首先执行每顶点光照计算,以便确定反射光和漫射颜色组分。
然后由投影变换功能转换顶点位置,以便创建透视投影、正投影或其他类型的投影。
尽管固定功能管线仍像以前那样在同一个API约定中公开这些变换和光照算法,但是,在大多数图形卡中,它们是在图形处理器的微代码中实现的,而不是作为一组硬件加速的算法来实现。
例如,在Radeon9700处理器中,过去的整个变换和光照模块可以而且应当在可编程的管线中作为顶点Shader来实现。
为了在光栅化阶段提高性能,属于照相机无法看到的对象的顶点将被剪裁掉。
另外,还可能会执行背面选择,以免光栅化背对照相机的三角形。
此外,还执行属性评估,以便配置和选择将在光栅化阶段使用的实际算法。
最后,执行光栅化功能,以便实际呈现像素。
在像素处理阶段,您可以选择使用固定功能的多纹理化或可编程的像素Shader来确定像素的颜色值。
固定功能多纹理化通过一系列纹理阶段来公开,在每一个阶段,都允许针对像素的颜色和alpha值执行一组固定的运算。
像素Shader通过自定义的汇编语言公开针对颜色和alpha值执行的运算,从而提供更大的灵活性。
在像素处理阶段实现的算法包括凹凸贴图、阴影化、环境贴图等。
帧缓冲区处理涉及到一组名为呈现表面、深度缓冲区和模板缓冲区的内存区域。
在该阶段,会执行一系列计算来确定诸如深度、alpha和模板的值。
深度缓冲区是另一种用来删除隐藏线和表面的呈现优化。
深度测试用来确定哪些像素是隐藏的而且不需要呈现,它可以通过使用z-缓冲区或w-缓冲区来确定,每种算法都有其各自的优缺点。
帧缓冲区处理功能可实现许多效果,如透明度、雾化和阴影。
对于Direct3D管线来说,需要强调的最后一点是可通过图形状态来修改它的行为。
图形状态用来配置多变换、光照、光栅化、像素处理和帧缓冲区处理算法,这些算法由Direct3D提供,用于呈现帧。
这些阶段包括呈现、变换、取样器和纹理阶段状态。
C#中使用DirectX编程(6).NETFramework中新托管Direct3D图形API的简介(3)
非托管的Direct3D
用来管理DirectX图形的主要对象是Direct3D对象。
Direct3D对象是通过Direct3DCreate9函数创建的,Direct3DCreate9函数是由核心Direct3DAPI公开的唯一一个全局函数。
Direct3D对象实现IDirect3D9接口并负责确定特定设备的细节。
除了设备枚举,IDirect3D9接口负责通过它的CreateDevice工厂方法来创建Direct3DDevice对象。
Direct3DDevice对象实现IDirect3DDevice9接口并充当Direct3D图形的主要支持者。
Direct3DDevice9I接口提取在图1中说明的整个管线。
它提供的方法可以为变换、光照、光栅化、像素和帧缓冲区处理公开许多种算法,并且由符合Direct3D的特定硬件设备提供。
IDirect3DDevice9接口中的方法可以按如下类别组织:
一组属性(用来配置Direct3D图形管线或者提供有关其当前状态的信息)、工厂方法(用来在Direct3D体系结构中创建其他对象)或者一组方法(用来执行实际图形算法)。
Direct3D管线的状态可以通过IDirect3DDevice9接口的一组访问器方法来配置。
GetRenderState和SetRenderState方法检索和/或设置设备的呈现状态值。
非托管的D3DRENDERSTATETYPE枚举类型为您提供一组可用于配置当前呈现状态的选项。
GetTextureStageState和SetTextureStageState方法检索和/或设置当前分配的纹理的状态值。
非托管的D3DTEXTURESTAGESTATE枚举类型还向开发人员提供一组可用于配置单个纹理阶段的选项。
图形状态的其他属性可通过从非托管的D3DTRANSFORMSTATETYPE和D3DSAMPLERSTATE枚举类型选择选项来配置。
非托管的Direct3D中的几何形状是通过VertexBuffer和IndexBufferCOM对象使用的。
这些对象是通过工厂方法在IDirect3DDevice9接口上创建的。
VertexBuffer对象实现IDirect3DVertexBuffer9接口并存储用户定义的一系列顶点。
这些顶点由特定应用程序所需的数据组成,并且可以通过使用灵活的Direct3D顶点格式来声明。
灵活的Direct3D顶点格式通过一组宏来使用。
灵活的顶点格式存在一个基本局限,那就是它们只能使用单个数据流,因此可能会浪费内存。
灵活的顶点格式通常与固定功能管线结合使用。
IndexBuffer对象实现IDirect3DIndexBuffer9接口,并将索引数组存储到VertexBuffer中。
IndexBuffer通过重用共享的顶点来提供可节省内存的优化。
Direct3D扩展
非托管的Direct3D扩展(D3DX)实用工具库为广泛的2D、3D和4D矢量数学运算提供大量的接口、函数、宏和支持类。
另外,还提供了可支持程序纹理、凹凸贴图和环境贴图的函数。
Direct3D一个重要的子集是它的.X文件格式。
它提供了适用于网格、动画和纹理的函数。
D3DX的一个最新功能是它对Shader和效果文件的支持。
运行库汇编程序是通过D3DXAssembleShader、D3DXAssembleShaderFromFile和D3DXAssembleShaderFromResourceAPI函数为Shader提供的。
C#中使用DirectX编程(6).NETFramework中新托管Direct3D图形API的简介(4)
托管的Direct3D
托管的Direct3D已经变成核心Direct3D运行库的重要部分,这与D3DX之类的扩展库相反。
因此,尝试让托管抽象尽可能接近最初的非托管抽象。
为了更好地理解托管Direct3D,一定要先了解托管层如何提取非托管的Direct3D。
对于大部分来说,托管的D
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C# 使用 DirectX 编程