




已阅读5页,还剩23页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C#中使用DirectX编程(1 )什么是DirectX?什么是DirectX ?回到目录微软的DirectX软件开发工具包(SDK)提供了一套优秀的应用程序编程接口(APIs),这个编程接口可以提供给你开发高质量、实时的应用程序所需要的各种资源。DirectX技术的出现将极大的有助于发展下一代多媒体应用程序和电脑游戏。总的说来,使用Di rectX的主要有两个好处:1、为软件开发者提供硬件无关性;2、为硬件开发提供策略。1、为软件开发者提供硬件无关性微软开发DirectX,其最主要的目的之一是促进在Windows操作系统上的游戏和多媒体应用程序的发展。在DirectX出现以前,主要的游戏开发平台是MS-DOS,游戏开发者们为了使他们的程序能够适应各种各样的硬件设备而绞尽脑汁。自从有了DirectX,游戏开发者们便可以获益于Windows平台的设备无关性,而又不失去直接访问硬件的特性。DirectX主要的目的就是提供象MS-DOS一样简洁的访问硬件的能力,来实现并且提高基于MS-DOS平台应用软件的运行效果,并且为个人电脑硬件的革新扫除障碍。另一方面,微软公司开发DirectX是为了在当前或今后的计算机操作系统上提供给基于Windows平台的应用程序以高表现力、实时的访问硬件的能力。DirectX在硬件设备和应用程序之间提供了一套完整一致的接口,以减小在安装和配置时的复杂程度,并且可以最大限度的利用硬件的优秀特性。通过使用DirectX所提供的接口,软件开发者可以尽情的利用硬件所可能带来的高性能,而不用烦恼于那些复杂而又多变的硬件执行细节。一个高表现力的基于Windows平台的游戏将得益于以下几种技术: 专为提高图形运算及快速反应能力而设计的加速卡(Accelerator cards) 即插即用以及其它Windows软硬件 内建于Windows的通信服务, 包括DirectPlay 2、为硬件开发提供策略DirectX的另外一个重要的目的是给硬件厂商提供开发策略,他们可以从高性能程序的开发者和独立的硬件供应商(independent hardware vendors IHVs)那里得到反馈。所以,在DirectX 程序员参考书中有时可能会提供那些还不存在的硬件加速设备的技术细节。在很多时候,软件可以模拟这些特性,在另外一些情况下,软件根据硬件的指标判断出其特性,并且可以忽略那些硬件并不支持的性能。已经和将要实现的显示设备的特性包括: 覆盖(Overlays),由于它的被支持,在图形设备接口中,窗口中的换页(page flipping)将成为可用。换页是用来在整个屏幕上显示画面的双缓冲(double-buffer)方案。 精灵引擎(Sprite engines),使精灵(不规则图形)覆盖更容易。 插补延展(Stretching with interpolation),它可以更有效的保存显示内存,因为它可以使小幅画面延展到整个屏幕。 Alpha 融合(Alpha blending),它可以在硬件像素层(hardware-pixel level)上混合颜色。 带有透视修正(perspective-correct)贴图的3D加速器,它允许你在3D表面上贴图。比如,你可以在用3D软件制作的城堡的走廊里贴上砖块的位图来显示出透视效果。 为3D图象进行的位操作将 Z 方向考虑在内。 标准2兆显示内存,这在3D游戏中是最小需求。 压缩标准,这将允许你在显存中储存更多的信息。这个标准不论是在软件还是硬件中执行都会相当快。它将被用在贴图中并且包含透明压缩。 将要被包括的声音设备的新特性包括: 硬件及其外设可以提供空间环绕立体声效果。 声卡上内置音频内存。 音频-视频一体卡可共享其上的内存。 另外,视频回放将得益于今后的与DirectX相兼容硬件加速设备。今后的DirectX版本中的一个特性是将支持硬件加速YUV视频解码。C#中使用DirectX编程(2)DirectX都有哪些组件?DirectX的组件回到目录DirectX SDK为基于Windows平台的应用程序提供了以下几个组件。 DirectDraw :通过直接访问显示硬件来提供高级的图象处理能力。 DirectSound :它提供了软硬件的低延迟声音混频(low_latency sound mixing)和回放(Playback),硬件加速,以及直接访问音频设备的能力。 DirectPlay :它明确的提供了通用环境连接能力(generalized communication capabilities),来简化你应用程序之间的通讯服务。 Direct3D :它为主流的桌上型计算机和Internet用户提供实时的、交互的3D技术。 DirectInput :它简化你的应用程序访问鼠标、键盘和操纵杆设备的能力。 DirectSetup :一套简单的API向你提供安装DirectX部件的功能。 AutoPlay :它也是Win95操作系统的一个特性,当你在光驱内放上光盘,指定的应用程序会自动执行。 C#中使用DirectX编程(3)关于DirectDraw关于DirectDraw回到目录DirectDraw是DirectX SDK大家族中的一员,也是其中最主要的一个部件。DirectDraw允许程序员直接的操作显存、硬件位图映射以及硬件覆盖和换页技术。它在提供这些功能的同时,也使其与现在的基于Microsoft Windows的应用程序和设备驱动程序相兼容。 DirectDraw是一个软件接口,它在提供直接访问显示设备的同时,与Windows图形设备接口(GDI)相兼容。DirectDraw不是一个高层的图形程序编程接口,它为游戏和Windows子系统软件(例如:3D图形包和数字视频编码)提供了一种与设备无关的途径,以获得访问特定的显示设备的某些高级特性的能力。DirectDraw适用于种类众多的的显示设备,从简单的SVGA显示器到提供裁剪、缩放、和支持非RGB颜色格式的高级硬件实现设备。设计这样的接口是为了让你的应用程序能够列举低层硬件的能力,并且对那些支持的硬件加速特性加以利用。那些在硬件设备中不能实现的特性,DirectX将仿真出来。 DirectDraw提供了以下几个优点,这些好处在以前只有那些专为特定显示设备所写的软件才能利用。 支持双缓冲和换页图形 访问、控制显示卡的位图映射 支持3D z-buffers (z缓存) 支持z方向(z-ordering)硬件辅助覆盖。 访问图形缩放硬件 仿真访问标准的和增强的显示设备内存空间 DirectDraw的任务是用与设备无关的途径来提供依赖于设备的访问显示内存的方法。本质上,DirectDraw管理显示内存。你的应用程序只需要懂得那些一般的关于硬件与设备有关的知识,比如RGB和YUV色彩格式和两条光栅线之间的pitch(宽距) 。在需要利用位转换或操作调色板寄存器时,你不需要为调用过程中的细节而烦恼。使用DirectDraw,你可以方便的操作显示内存,充分的利用不同类型的显示设备的位转换和颜色压缩能力,而不需要依赖于某一个特定的硬件。 DirectDraw给运行于Windows 95和Windows NT 4.0或更高版本的计算机提供了一个高性能的的游戏图象引擎。 C#中使用DirectX编程(4)为什么要使用DirectDraw?为什么要使用DirectDraw?回到目录无庸置疑,人们之所以利用DirectDraw来开发各种游戏以及多媒体应用软件,是因为DirectDraw可以为他们的应用程序带来许多强大的功能提升。 DirectDraw可以充分评估视频硬件的能力,只要可能,它就会对其某一特性加以利用。例如,如果你的显卡支持硬件Blit,DirectDraw就会将位图映射这一操作分派给显卡来完成,极大的提升运行速度。此外,当某硬件不支持某项特性时,DirectDraw还提供了硬件仿真层(HEL)以完成这项操作。 DirectDraw的硬件抽象层(HAL)提供了一个统一的接口,通过它,开发者可以直接的操作显示存储器和视频存储器,从系统硬件中获取最大的表现能力。 DirectDraw运行于Windows95操作系统之上,从系统所提供的32位内存寻址和平面内存模型中获益。DirectDraw将视频和系统存储器视为整块的空间,而不是碎片的集合。如果你曾使用过区段偏移寻址,你将很快就喜爱上这种“平面”内存模型。 对于全屏模式的应用程序,DirectDraw使得多后台缓存的换页操作变得极为容易。 支持窗口和全屏模式应用程序的裁减。 支持3-D z缓存。 支持带z轴方向的硬件辅助覆盖。 可访问图象缩放硬件。 可同时访问标准的和增强的显示设备内存区。 其它的特性,包括动态改变调色板、独占访问硬件、和分辨率切换等等。 合理和有效的利用DirectDraw的这些特性将使开发者很容易就能够写出比基于标准的Windows GDI应用程序,甚至MS-DOS应用程序还要优秀的作品.C#中使用DirectX编程(5)部件对象模型(COM)部件对象模型(COM)回到目录DirectX是基于COM的一套软件编程接口。部件对象模型(Component Object Model, COM)是OLE 的基础。COM 为OLE提供了编程模型和二进制标准。COM定义并实现了软部件(如应用程序、数据对象、控件及服务)机制,并把它们统称为“对象”。每个软部件对象由数据以及访问数据的函数组成,访问软部件对象数据的函数的集合称为“接口”。从这里可以看出,COM 的设计与C+类非常相似,即一个软部件对象具有一个内部数据结构和一组外部接口函数,允许通过接口函数对数据进行访问。因此Microsoft公司把根据COM执行的对象统称为Windows对象。但Windows对象与C+中的对象有明显的差别,Windows对象中没有公共数据,也没有成员函数,因此不能直接访问数据,也就是说数据是全封装的。对象的提供者或服务器必须指明一个或多个接口的定义,每个接口都是相互关联的一组函数,执行对象的一个特性。每个对象的一个用户(或称为“客户”)必须拥有一个接口指针才能访问对象。当客户有了这个指针后,就可以使用这个对象而无需知道对象的含义,即使客户运行在不同的进程、不同的机器、不同的操作系统、由不同的软件开发而使用不同的语言,或者版本不同。DirectX SDK接口被创建在COM编程层次表中很基础的一层。每一个代表设备的对象的接口,比如IDirectDraw、IDirectSound、和IDirectPlay,是直接从IUnknown OLE接口中派生下来的。这些基本对象的创建被操作于在该对象的动态连接库中,要比用Win32中专门用来创建COM对象的CoCreateInstance函数要好得多。 特别的是,DirectX SDK对象模型为每一个设备提供一个主要的对象。其它的设备对象是由这个主要对象派生下来的。例如,DirectDraw对象代表显示设备。你可以用它来创建代表显存的主页面(DirectDrawSurface)对象,和代表硬件调色板的调色板(DirectDrawPalette)对象;相似的,DirectSound对象代表声卡,并且创建DirectSoundbuffer对象来代表声卡上的声音数据。C#中使用DirectX编程(6).NET Framework 中新托管 Direct3D 图形 API 的简介(1)本期内容Direct3D 体系结构Direct3D 管线非托管的 Direct3DDirect3D 扩展托管的 Direct3D设备类图形状态类与几何形状相关的类纹理类托管的 D3DX 库托管 DirectX 9.0 示例框架GraphicsSample 类初始化和清除帧更新和呈现小结以上内容分为8个部分依次贴出,鄙视一下baidu,居然不能贴长文章!文章来自msdn Yahya H. Mirza 和 Henry da Costa,图片什么点击过去就能看到。连翻译带抄,我也不容易啊。想一次性看到全部内容到我的baidu文库去下载吧,1个积分。最近做3D需要的资料多啊,给我分点积分让俺也挣一点。=我是不厚道的分割线=硬件加速的图形 API 所面临的基本挑战就是,让应用程序开发人员利用 3D 硬件领域中发生的快速技术革新的同时,允许图形硬件解决方案之间存在一定程度的兼容性和一致性。达到此目的的一种方法就是,由委员会定义一种标准,然后让每个供应商支持该标准。图形硬件供应商可以通过商定的扩展机制来革新和创建专用扩展。随着时间的推移,硬件供应商可以游说标准制定机构接受它们的专用扩展并将其作为标准的一部分。OpenGL 1.1 版就是该方法实现硬件互操作性的一个示例。它的一个局限是,需要很长的时间才能将供应商特定的革新合并到多供应商标准中,因此会面临标准作废的风险。在 DirectX?9.0 中,DirectDraw 和 Direct3D 的功能组合到名为 DirectX Graphics 的单个 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).NET Framework 中新托管 Direct3D 图形 API 的简介(2)Direct3D 体系结构尽管托管和非托管 Direct3D 编程层都是通过一系列对象公开的,但是您不应当将它们视为应用程序级别编程框架。Direct3D 体系结构的主要角色就是为更高级别的解决方案(如游戏引擎或布景图形 API)提供基本功能。为了帮助实现这些解决方案,Direct3D 扩展库显式提供其他功能。为了充分理解 Direct3D 体系结构,您不但必须了解所提取的功能,而且还要了解该功能的组织和公开方式。在以下几节中,我们将概述 Direct3D 体系结构的基本元素,并讨论如何通过非托管的 COM API 和托管 .NET 抽象层来公开它们。Direct3D 管线正如计算机硬件体系结构所常见的那样,3D 图形体系结构中使用的两个性能优化技术是管线化和并行化。通过 Direct3D 公开的算法在逻辑上组织为管线。图 1 说明了 Direct3D 管线。Direct3D 管线应当被视为一组作用于 3D 几何数量的算法,对于 Direct3D 来说,这些几何数量是预定义的顶点和基元。管线的主要目的是将几何数据转换为在视频显示器上呈现的图像。Direct3D 网格化阶段用于网格化(转换为三角形)由 Direct3D 预定义的一组更高阶的固定基元,这些基元包括三角形块、矩形块和 N 边形块(尽管三角形块仍是最常见的几何形状)。目前,网格化阶段不是可编程的,因此,Direct3D 不公开任何允许针对图形硬件生成程序几何的机制。就最小化通过总线发送的数据而言,程序几何提供了许多好处。在不久的将来,您有可能看到为可编程的网格化阶段提供的硬件支持。在管线的变换和光照阶段,会将顶点位置和法线从模型坐标系统变换为世界坐标系和照相机坐标系,这是通过世界变换和视图变换来完成的。首先执行每顶点光照计算,以便确定反射光和漫射颜色组分。然后由投影变换功能转换顶点位置,以便创建透视投影、正投影或其他类型的投影。尽管固定功能管线仍像以前那样在同一个 API约定中公开这些变换和光照算法,但是,在大多数图形卡中,它们是在图形处理器的微代码中实现的,而不是作为一组硬件加速的算法来实现。例如,在 Radeon 9700 处理器中,过去的整个变换和光照模块可以而且应当在可编程的管线中作为顶点 Shader 来实现。为了在光栅化阶段提高性能,属于照相机无法看到的对象的顶点将被剪裁掉。另外,还可能会执行背面选择,以免光栅化背对照相机的三角形。此外,还执行属性评估,以便配置和选择将在光栅化阶段使用的实际算法。最后,执行光栅化功能,以便实际呈现像素。在像素处理阶段,您可以选择使用固定功能的多纹理化或可编程的像素 Shader 来确定像素的颜色值。固定功能多纹理化通过一系列纹理阶段来公开,在每一个阶段,都允许针对像素的颜色和 alpha 值执行一组固定的运算。像素 Shader 通过自定义的汇编语言公开针对颜色和 alpha 值执行的运算,从而提供更大的灵活性。在像素处理阶段实现的算法包括凹凸贴图、阴影化、环境贴图等。帧缓冲区处理涉及到一组名为呈现表面、深度缓冲区和模板缓冲区的内存区域。在该阶段,会执行一系列计算来确定诸如深度、alpha 和模板的值。深度缓冲区是另一种用来删除隐藏线和表面的呈现优化。深度测试用来确定哪些像素是隐藏的而且不需要呈现,它可以通过使用 z-缓冲区或 w-缓冲区来确定,每种算法都有其各自的优缺点。帧缓冲区处理功能可实现许多效果,如透明度、雾化和阴影。对于 Direct3D 管线来说,需要强调的最后一点是可通过图形状态来修改它的行为。图形状态用来配置多变换、光照、光栅化、像素处理和帧缓冲区处理算法,这些算法由 Direct3D 提供,用于呈现帧。这些阶段包括呈现、变换、取样器和纹理阶段状态。C#中使用DirectX编程(6).NET Framework 中新托管 Direct3D 图形 API 的简介(3)非托管的 Direct3D用来管理 DirectX 图形的主要对象是 Direct3D 对象。Direct3D 对象是通过 Direct3DCreate9 函数创建的,Direct3DCreate9 函数是由核心 Direct3D API 公开的唯一一个全局函数。Direct3D 对象实现 IDirect3D9 接口并负责确定特定设备的细节。除了设备枚举,IDirect3D9 接口负责通过它的 CreateDevice 工厂方法来创建 Direct3DDevice 对象。Direct3DDevice 对象实现 IDirect3DDevice9 接口并充当 Direct3D 图形的主要支持者。Direct3DDevice9 I接口提取在图 1 中说明的整个管线。它提供的方法可以为变换、光照、光栅化、像素和帧缓冲区处理公开许多种算法,并且由符合 Direct3D 的特定硬件设备提供。IDirect3DDevice9 接口中的方法可以按如下类别组织:一组属性(用来配置 Direct3D 图形管线或者提供有关其当前状态的信息)、工厂方法(用来在 Direct3D 体系结构中创建其他对象)或者一组方法(用来执行实际图形算法)。Direct3D 管线的状态可以通过 IDirect3DDevice9 接口的一组访问器方法来配置。GetRenderState 和 SetRenderState 方法检索和/或设置设备的呈现状态值。非托管的 D3DRENDERSTATETYPE 枚举类型为您提供一组可用于配置当前呈现状态的选项。GetTextureStageState 和 SetTextureStageState 方法检索和/或设置当前分配的纹理的状态值。非托管的 D3DTEXTURESTAGESTATE 枚举类型还向开发人员提供一组可用于配置单个纹理阶段的选项。图形状态的其他属性可通过从非托管的 D3DTRANSFORMSTATETYPE 和 D3DSAMPLERSTATE 枚举类型选择选项来配置。非托管的 Direct3D 中的几何形状是通过 VertexBuffer 和 IndexBuffer COM 对象使用的。这些对象是通过工厂方法在 IDirect3DDevice9 接口上创建的。VertexBuffer 对象实现 IDirect3DVertexBuffer9 接口并存储用户定义的一系列顶点。这些顶点由特定应用程序所需的数据组成,并且可以通过使用灵活的 Direct3D 顶点格式来声明。灵活的 Direct3D 顶点格式通过一组宏来使用。灵活的顶点格式存在一个基本局限,那就是它们只能使用单个数据流,因此可能会浪费内存。灵活的顶点格式通常与固定功能管线结合使用。IndexBuffer 对象实现 IDirect3DIndexBuffer9 接口,并将索引数组存储到 VertexBuffer 中。IndexBuffer 通过重用共享的顶点来提供可节省内存的优化。Direct3D 扩展非托管的 Direct3D 扩展 (D3DX) 实用工具库为广泛的 2D、3D 和 4D 矢量数学运算提供大量的接口、函数、宏和支持类。另外,还提供了可支持程序纹理、凹凸贴图和环境贴图的函数。Direct3D 一个重要的子集是它的 .X 文件格式。它提供了适用于网格、动画和纹理的函数。D3DX 的一个最新功能是它对 Shader 和效果文件的支持。运行库汇编程序是通过 D3DXAssembleShader、D3DXAssembleShaderFromFile 和 D3DXAssembleShaderFromResource API 函数为 Shader 提供的。C#中使用DirectX编程(6).NET Framework 中新托管 Direct3D 图形 API 的简介(4)托管的 Direct3D托管的 Direct3D 已经变成核心 Direct3D 运行库的重要部分,这与 D3DX 之类的扩展库相反。因此,尝试让托管抽象尽可能接近最初的非托管抽象。为了更好地理解托管 Direct3D,一定要先了解托管层如何提取非托管的 Direct3D。对于大部分来说,托管的 Direct3D 提供从非托管层中的接口、结构和枚举到托管层中的类、结构和枚举的一对一映射。为了显式使用托管代码的一些新功能,如类实现继承、C# 属性、索引器和事件,托管层中的几个抽象需要按稍微不同于其非托管副本的方式公开。在以下几节中,我们将介绍由托管 Direct3D 公开的基础类。设备类托管的 Direct3D 提供了基于类的设备抽象,该抽象是通过使用非托管的 IDirect3DDevice9 接口实现的。编写 Direct3D 托管代码的程序员使用 Device 类的方法来访问其他 Direct3D 对象,以便设置各种图形状态并呈现几何形状。为了执行这些函数,Device 类提供了许多属性、方法和事件。图 2 列出了 Device 类最重要的方法,这些方法由 3D 应用程序调用。谈到对象激活,一种观点认为,非托管的 Direct3D 之所以使用工厂方法,只是因为 COM 不支持新运算符。COM 的标准激活模式是基于工厂的构造。CoCreateInstance 函数模仿 COM 的新运算符,但它只是一个在内部使用 COM 工厂的包装。使用工厂(相对于新运算符)的另一个原理就是,在使用新运算符时,需要将对象的特定实现绑定到客户端的代码中;因此,如果大量使用新运算符,可能会导致版本控制问题。工厂方法通常用于将代码的客户端或用户与代码的创建者去耦。非托管的 COM IDirect3DDevice9 接口提供 14 种显式工厂方法,以便创建在使用 Direct3D 时需要的对象(如像素和顶点 Shader 以及顶点和索引缓冲区)。目前,托管的 Direct3D 在很大程度上依赖于使用新运算符来构造类。尽管 Device 托管类只提供三种工厂方法,但是,一个值得注意的有趣现象是,非托管的 IDirect3DDevice9 工厂方法和由 Device 类公开的公共属性之间存在一对一关联。以下代码行说明了由 Device 托管类公开的三种工厂方法,每种方法都使用多个参数:public Surface CreateRenderTarget(.);public Surface CreateDepthStencilSurface(.);public Surface CreateOffscreenPlainSurface(.);在托管的 Direct3D 中大量使用方法重载。下面的代码示例说明了非托管的 Device.ColorFill 方法及其托管的重载包装:typedef DWORD D3DCOLOR;/ Methods from the unmanaged IDirect3DDevice9 interface.HRESULT ColorFill(IDirect3DSurface9 *pSurface, CONST RECT *pRect, D3DCOLOR color);/ Methods from the managed Device class.public void ColorFill(Surface surface, Rectangle rect, Color color);public void ColorFill(Surface surface, Rectangle rect, int color);与传统的图形系统一样,非托管的 Direct3D 需要将颜色值作为 32 位整数值在内部传递。另一方面,Microsoft .NET Framework 显式提供用来处理 ARGB 颜色值的 System.Drawing.Color 类,其中包含几种用来在不同表示形式之间进行转换的方法。为方便那些已习惯于使用整数值来表示颜色的程序员,托管的 Direct3D 在需要颜色参数时使用这两种表示形式来提供方法重载。非托管的 IDirect3DDevice9 接口既公开只读属性,又公开读写属性,这两种属性都可以带参数,也可以不带参数。在最新版本的 .NET Framework 中,属性不带参数。因此,在将非托管的 Direct3D 映射到托管的 Direct3D 时,不使用参数的属性可以很好地映射到 C# 属性,而使用参数的 Direct3D 非托管属性只作为 Get 和 Set 方法公开。图 3 列出了 Device 类的一些最重要的属性。最后,Direct3D Device 托管类提供了五个用来与设备进行交互的显式事件。基于 Direct3D 的应用程序可以通过以下方法来将事件作为 Device 的来源:启动应用程序、调整窗口的大小、从窗口模式更改到全屏模式或者退出应用程序。一个有趣的发现是由 Direct3D 使用的基于 .NET 委托的事件模式。对于 Device 类的每个事件声明,提供了添加、删除和引发方法,以及用来存储事件处理程序的私有实例变量。在 C# 中,客户端事件注册和注销的语法形式分别是通过 += 和 -= 运算符来提供的(请参阅图 4)。C#中使用DirectX编程(6).NET Framework 中新托管 Direct3D 图形 API 的简介(5)图形状态类如前所述,非托管代码的图形状态是通过 IDirect3DDevice9 接口的方法来配置的。例如,在非托管代码中,变换状态可通过 GetTransform 和 SetTransform 方法直接访问,这两种方法都使用 D3DTRANSFORMTYPE 类型的枚举值。/ From unmanaged IDirect3DDevice9 interface:HRESULT GetTransform(D3DTRANSFORMSTATETYPE State, D3DMATRIX *pMatrix);HRESULT SetTransform(D3DTRANSFORMSTATETYPE State, CONST D3DMATRIX *pMatrix);托管的 Direct3D 为非托管层提供一些抽象,这会使客户端代码变得更简洁。下面显示的 Device 类说明了一组只读属性:public class Device : MarshalByRefObject, IDisposable / Additional properties, methods and events. public Transforms Transform get; public RenderStates RenderState get; public SamplerStates SamplerState get; public TextureStates TextureState get; 这些属性返回 Transforms、RenderStates、SamplerStates 和 TextureStates 类的实例。这些实例随后用于配置托管 Direct3D 的图形状态。例如,Device 类不直接公开使用枚举值的 Transform 属性。Device 托管类提供可返回 Transforms 对象的属性。Transforms 对象随后公开一组可用来访问当前世界、视图和投影矩阵的属性,这些属性本身是 TransformType 托管枚举的元素。RenderStates 类提供了大量的属性来配置为光栅化阶段选择的特定算法。下面的客户端代码显示了如何设置 Direct3D 托管管线的状态。/ cull, spec, dither states.device.RenderState.CullMode = Cull.None;device.RenderState.SpecularEnable = false;device.RenderState.DitherEnable = false;/ Filter states.device.SamplerState0.MagFilter = TextureFilter.Linear;device.SamplerState0.MinFilter = TextureFilter.Linear;请注意,使用索引器来访问取样器状态的多纹理层叠所在的阶段。取样器状态指定用于特定阶段的筛选、平铺和纹理寻址模式,这些模式可通过 Sampler 类的属性来公开。筛选功能用于指定如何将图像映射到特定的 Direct3D 基元。根据图像(纹理)的大小以及它需要映射到的屏上基元的大小,可能需要放大或缩小图像。Direct3D 提供了三种筛选方法:MipFilter、MinFilter 和 MagFilter,每种方法都具有可由 TextureFilter 枚举配置的模式。平铺功能用于将一组单个的纹理汇集成单个纹理并减少切换纹理的需要。平铺功能是通过 Sampler 类的一组属性获得支持的。最后,纹理寻址模式通过 TextureAddress 枚举的元素为 0,1 边界外部的纹理坐标定义操作:public class SamplerStates private Sampler m_lpTex; private bool pureDevice; public Sampler get_SamplerState(int index); internal SamplerStates(Device dev, bool pure); public Sampler thisint index get; TextureStates 和 SamplerStates 类提供只读索引器,该索引器可返回特定阶段的 TextureState 实例。TextureState 类定义的属性可获得或指定特定纹理阶段状态的元素。诸如 ColorArgumentn 或 AlphaArgumentn(其中 n 可以是 0、1 或 2)属性可以是 TextureArgument 枚举的元素,而 ColorOperation 或 AlphaOperation 可以属于 TextureOperation 枚举,如下所示:/ color = tex mod diffuse.device.TextureState0.ColorArgument1 = TextureArgument.TextureColor;device.TextureState0.ColorOperation = TextureOperation.Modulate;device.TextureState0.ColorArgument2 = TextureArgument.Diffuse;/ alpha = select texture alpha.device.TextureState0.AlphaArgument1 = TextureArgument.TextureColor;device.TextureState0.AlphaOperation = TextureOperation.SelectArg1;device.TextureState0.AlphaArgument1 = TextureArgument.Diffuse;C#中使用DirectX编程(6).NET Framework 中新托管 Direct3D 图形 API 的简介(6)与几何形状相关的类Direct3D 中的几何形状被定义为顶点定义的数组。不同的图形算法需要存储在每个顶点的不同信息,了解这一点很重要。这些顶点组分需要由应用程序进行声明,具体情况取决于程序员希望实现的效果。例如,如果程序员希望将纹理映射到 Direct3D 将呈现的几何形状,则程序员必须进行如下声明:在每个顶点,都将有 tu 和 tv 值(纹理坐标)。托管的 Direct3D 提供了两种顶点定义机制:VertexFormats 和 VertexDeclarations。使用这些机制,可以在每个顶点定义其他数据,如颜色、混合权重、纹理坐标或应用程序定义的任何用法。作为一种方便的方法,为经常使用的顶点格式定义提供了 CustomVertex helper 类。CustomVertex 类提供 11 种不同的顶点定义,这些定义经常用于 Direct3D 应用程序中。在托管的 Direct3D 中,应用程序用来定义其顶点布局的顶点格式由 Device 类的读和写 VertexFormat 属性来访问。VertexFormat 属性访问 VertexFormats 枚举的元素,并且只需通过以下方法来实现:针对 IDirect3DDevice9 接口使用 GetFVF 和 SetFVF 方法,调用内部的非托管 Direct3D Device COM 对象。托管的 VertexFormats 枚举映射到在 d3dtypes.h 中定义的 VertexFormat 常量位,如下所示:public struct Vertex public Vector3 position; public float tu, tv; public static readonly VertexFormats Format = VertexFormats.Position | VertexFormats.Texture1;/ From a typical managed Direct3D applications Render() method.device.VertexFormat = Vertex.Format;在使用可编程的管线时,需要自定义的顶点声明。与使用灵活的顶点格式定义的顶点缓冲区不同,自定义顶点声明可以通过使用多个流来定义,从而可节省带宽:VertexElement declaration = new VertexElement new VertexElement( 0, / short stream 0, / short offset DeclarationType.Float2, / DeclarationType declType DeclarationMethod.Default, / DeclarationMethod declMethod DeclarationUsage.Position, / DeclarationUsage declUsage 0 / byte usageIndex ), VertexElement.VertexDeclarationEnd ;VertexDeclaration declaration = new VertexDeclaration(device, declaration);托管 Direct3D 中的几何形状通常是通过处理 VertexBuffer.Created 事件来创建的。图 5 显示了从 SDK 中的 Tutorial2 示例提取的简单三角形形状,并说明了预定义的自定义顶点 (CustomVertex.TransformedColored) 的用法。C#中使用DirectX编程(6).NET Framework 中新托管 Direct3D 图形 API 的简介(7)纹理类在托管的 Direct3D 中,与纹理相关的类从抽象类 Resource 继承,并且在极大程度上在与纹理相关的非托管接口上建立层。托管的 Direct3D 有三个纹理类:Texture、CubeTexture 和 VolumeTexture。Texture 类表示可映射到基元上的图像,用于呈现或用于凹凸贴图、法线贴图或其他效果。纹理的基本函数用于将一对纹理坐标映射到某个值(通常是颜色值),但是可以通过其他方式进行解释。纹理坐标通常是顶点数据的一部分。纹理坐标到颜色或其他值的映射是在呈现管线的像素处理阶段完成的。Direct3D 允许一次最多使用八个纹理。CubeTexture 类是用于立方体环境贴图的特殊种类的纹理,立方体环境贴图这种技术允许环境(如室内或外景)由反光物体反射出来,这是通过以下方法来实现的:使用纹理来为立方体周围的六个面各定义一个图像,并由所呈现的物体来反射。VolumeTexture 类表示存在于三维矩形空间中的颜色或其他值。同样,它将纹理坐标的三元组映射到颜色或其他值。这些类最重要的方面是,它们都支持一组用于锁定和取消锁定纹理的重载方法。经常用于加载和保存纹理的类是 TextureLoader。TextureLoader 类包含用来从文件或流加载纹理、立方体纹理或体积纹理的方法。TextureLoader 类的其他用法包括填充和筛选纹理以及计算法线贴图。用来创建纹理的有用的 helper 方法由 GraphicsUtility 类提供:文件的 GraphicsUtility.CreateTexture 方法只是查找指定纹理的路径,然后调用 TextureLoader.FromFile 方法以加载它。以下代码说明了 GraphicsUtility 类的用法:Texture texture = GraphicsUtility.CreateTexture(device,banana.bmp);托管的 D3DX 库托管的 D3DX 实用工具库具有用来处理网格、纹理、Shader、效果、文本和动画的类。但是,与非托管的 D3DX 库不同的是,它没有数学类,如矩阵、矢量和四元组类。在托管 DirectX 中,数学类是 DirectX 库的一部分。用来处理网格的类包括 Mesh、SimplificationMesh、ProgressiveMesh、SkinMesh 和 PatchMesh。Mesh 和 ProgressiveMesh 从 BaseMesh 类继承。BaseMesh 管理内存(包括顶点和索引缓冲区)中的网格表示形式,并提供用来呈现网格的 DrawSubset 方法。其他方法包括用来复制网格的 Clone 方法,以及用来计算顶点法线并获取相邻项信息的方法。Mesh 类使用可将网格保存到 .X 文件(标准的 DirectX 文件类型)或二进制流中并从中加载网格的方法来扩展 BaseMesh。还提供了用来生成表示以下图形的网格的方法:n 边形、圆柱、球
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 中国移动甘孜自治州2025秋招网申填写模板含开放题范文
- 中国广电焦作市2025秋招笔试行测题库及答案技能类
- 株洲市中石化2025秋招笔试模拟题含答案法律与合规岗
- 襄阳市中储粮2025秋招信息技术岗高频笔试题库含答案
- 国家能源桂林市2025秋招面试专业追问及参考电气工程岗位
- 大唐电力乐山市2025秋招面试典型题目及答案
- 西藏地区中储粮2025秋招财务资产岗高频笔试题库含答案
- 国家能源齐齐哈尔市2025秋招采矿工程类面试追问及参考回答
- 中国移动盘锦市2025秋招计算机类专业追问清单及参考回答
- 宜宾市中储粮2025秋招面试专业追问题库安全环保岗
- DL∕T 802.7-2023 电力电缆导管技术条件 第7部分:非开挖用塑料电缆导管
- 浙教版八年级信息技术上册《第4课-在线协同》课件
- 停车位买卖合同电子版
- ISO15614-1 2017 金属材料焊接工艺规程及评定(中文版)
- 2024年安徽九华山旅游发展股份有限公司招聘笔试参考题库附带答案详解
- B级英语词汇表修改版
- 2024年山西省成考(专升本)大学政治考试真题含解析
- 最高法院第一巡回法庭关于行政审判法律适用若干问题的会议纪要
- 足球场的运营可行性方案
- GB/T 2881-2023工业硅
- 有限合伙份额质押合同完整版(包含质押登记公证手续)
评论
0/150
提交评论