DirectX

2024-12-31

DirectX(精选10篇)

DirectX 篇1

1 Direct3D11渲染管线

DirectX 11和DirectX 10两者最大的不同之处在于管线, 可以说DirectX 11的渲染管线标志着绘图硬件以及软件功能革命性一步。DirectX 11加入了对Tessellation (镶嵌) 的支持。Tessellation 由外壳着色器 (Hull Shader) 、镶嵌单元 (tessellator) 以及域着色器 (Domain Shader) 组成。同时还加入了计算着色器 (Compute Shader) , 计算着色器与DX10中引入的GS不同, 它并不是渲染管线的一部分, CS也是DirectX 11的重要改进之一, 可以很大程度上协助开发人员弥补现实与虚幻之间的差别。

2 Tessellation镶嵌技术

自R600发布时, DirectX 11这个字眼才开始越来越多的出现在网络上。尽管R6xx和R7xx硬件都具有tessellator单元, 但是由于tessellator属于专有实现方案 (proprietary implementation) , 所以R6xx和R7xx硬件是不能直接兼容DirectX 11, 更何况DirectX 11采用了极其精密老练的设置过程。事实上, DX11 tessellator单元本身不具备可编程性, DX11向tessellator (TS) 输入或者从中输出的过程是通过两个传统的管线阶段完成的:Hull Shader (HS, 外壳着色器) 和Domain Shader (DS, 域着色器) 。

tessellator可以把一些较大的图元 (primitive) 分成很多更小的图元, 并将这些小图元组合到一起, 形成一种有序的几何图形, 这种几何图形更复杂, 当然也更接近现实。这个过程也被称作细分曲面 (Subdivision Surfaces) 。

Hull Shader负责接收一种由全四边形网格 (quad mash) 计算得到的图元数据 (称作patches) , 并计算控制点 (control points) 的各种变换以及输入的图元各个边的镶嵌配置 (tessellation factors) , 从而进行镶嵌。其中Control points用来定义想要得到的图形 (比如说一个曲面或者其他) 的图形参数。如果你经常用Photoshop绘图软件的话, 不妨把Control points理解为PS的钢笔工具:用平面代替线的贝塞尔曲线功能。Hull Shader采用control points来决定如何安排tessellator处理数据, 利用Tessellator生成大批量的新的图元, 然后将这些图元以及控制点传送给Domain Shader, Domain Shader将这些数据计算转换成3D处理中的顶点, 最后GPU生成曲线以及多边形。

3 多线程的支持

由于DX11所新增的特性甚至可以应用到DX10硬件中, 所以我们对于DX11的快速应用都非常期待和乐观。DX11特性还包括很重要一点:支持多线程 (multi-threading) 。没错, 无论是DX10还是DX11, 所有的色彩信息最终都将被光栅化并显示在电脑显示屏上 (无论是通过线性的方式还是同步的) , 但是DX11新增了对多线程技术的支持, 得益于此, 应用程序可以同步创造有用资源或者管理状态, 并从所有专用线程中发送提取命令, 这样做无疑效率更高。DX11的这种多线程技术可能并不能加速绘图的子系统 (特别是当我们的GPU资源受限时) , 但是这样却可以提升线程启动游戏的效率, 并且可以利用台式CPU核心数量不断提高所带来的潜力。

对于场景中的人像和三个镜像, DX11会启动四个单独线程进行并行处理, 效率自然要比现在依次进行的做法高很多。

此外, DX10硬件也能够在运行DX11游戏时支持多线程, 微软的这一计划相当令人兴奋, 不过值得一提的是, AMD以及NVIDIA必须为各自的DX10硬件开发出相应的驱动软件才能达到这一效果 (因为如果没有相应的驱动支持的话, DX10硬件即便可以运行DX11游戏, 对于玩家而言并不会看到真正应有的效果) 。当然了, 我们希望NVIDIA, 特别是AMD (因为他同时也是一家可以生产多核心CPU的厂商) 能够对此感兴趣。而且, 如果A/N这么做到话, 无疑会为游戏开发商们开发DX11游戏提供诱因, 即便是A/N的DX11硬件还在襁褓之中。

4 计算着色器Compute Shader

很多游戏开发者都对DX11新增的Compute Shader (通常简称为CS) 特性啧啧称赞。CS的这一渲染管线能够进行更多的通用目的运算。我们既能在某种可以用来被执行数据的操作中看到这种特性, 又能在某种可以用来操作的数据中看到这种特性。

在DirectX11以及CS的帮助下, 游戏开发者便可以使用更为复杂的数据结构, 并在这些数据结构中运行更多的通用算法。与其他完整的可编程的DX10和DX11管线阶段一样, CS将会共享一套物质资源 (也就是着色处理器) 。

相应的硬件需要在运行CS代码时更灵活些, 这些CS代码必须支持随机读写、不规则列阵 (而不是简单的流体或者固定大小的2D列阵) 、多重输出、可根据程序员的需要直接调用个别或多线程的应用、32k大小的共享寄存空间和线程组管理系统、原子数据指令集、同步建构以及可执行无序IO运算的能力。

与此同时, CS也将会随之失去一些特性。因为单个线程已经不再被看成是一个像素, 所以线程将会丧失几何集合功能。这就意味着, 尽管CS程序依然可以利用纹理取样功能, 但是自动三线LOD过滤计算将会丧失自动功能 (LOD必须被指定) 。此外, 一些并不重要的普通数据的深度剔除 (depth culling) 、反锯齿 (anti-aliasing) 、alpha混合 (alpha blending) 以及其他运算不能在一个CS程序中被执行。

除了某些特殊应用的渲染, 游戏开发者可能同时也希望做一些诸如IK (inverse kinematics, 反向运动学) 、物理、人工智能以及其他在GPU上执行的传统的CPU任务之类的运算。用CS算法在GPU上执行这些数据意味着这些数据将会更快的被渲染, 而且一些算法可能在GPU上的执行速度更快。如果某些总是产生同样结果的算法既可以出现在CPU上又可以出现在GPU上的话, 诸如AI以及物理等运算甚至可以同时在CPU和GPU上运行 (这种运算实际上也可以代替带宽) 。

即便是这些运算代码在相同的硬件 (CPU或者GPU) 上运行, PS以及CS代码的执行也是两个截然不同的过程, 这主要取决于被执行的算法。有趣的是, 暴露数据以及柱状数据经常被用作HDR渲染。用PS代码计算这些数据的话就需要几条通道和几种技巧, 以便提取所有像素, 从而集中或者平分这些数据。尽管共享数据将会或多或少的减缓处理速度, 但是共享数据的方式要比在多通道中计算速度更快, 而且这样可以使CS成为这些算法的理想处理阶段。

5Shader Model 5.0

DirectX 10的Shader Model 4.0 (Shader Model以下简称“SM”) 带来了整数运算和位运算的功能, DirectX 10.1的SM 4.1加入了对MSAA的直接采样和控制。而DirectX 11包含的SM 5.0, 采用面向对象的概念, 并且完全可以支持双精度数据。随着SM 5.0的发布, 微软也会将HLSL语言更新至最新版本, 其中包含了诸如动态着色、动态分支和更多的对象等。总之, 面向专业开发人员的SM 5.0, 依旧是以降低编程的难度和复杂为目的。

为了解决Shader灵活性与弹性不足的问题, 微软在HLSL5.0中带来解决之道。HLSL5.0提出shader子程序的概念, 即允许程序员将各种小段、简单或为个别需要而特制的shader程序链接起来, 再根据实际需要动态调用, 这样既能够提高硬件兼容性, 同时减少“巨型shader”对寄存器空间的占用, 有效提升性能。

6 改进的纹理压缩

精细的纹理对视觉效果的增益是显而易见的。目前的3D游戏越来越倾向于使用更大、更为精细的纹理, 但是过大的纹理严重占用显存和带宽。由于目前纹理压缩仍然不支持HDR图像, 因此DirectX 11提出了更为出色的纹理压缩算法——BC6和BC7。BC6是为HDR图像设计的压缩算法, 压缩比为6∶1;而BC7是为低动态范围纹理设计的压缩模式, 压缩比为3∶1。两种压缩算法在高压缩比下画质损失更少, 效果更出色。

纹理质量对画面效果起着至关重要的作用。比如我们运行3D游戏时, 画面内同样一个物体, 观察距离较远时, 纹理锐利而清晰, 但当你拉近视角, 近距离细看时, 纹理就非常粗糙了。更不用说在某些游戏中还有类似放大镜、望远镜等道具, 启用这些道具后, 只能看到更为粗糙和不真实的纹理。出现这种问题, 一方面是纹理压缩率损失严重, 细腻的纹理压缩存放后, 损失大量细节;另一方面是大纹理难以保证保证游戏运行速度和软件体积, 如果在游戏中大面积采用分辨率高达4000dpi的纹理贴图, 那么显卡的运算资源和显存容量很快就会告罄。因此, DirectX 11最快速和最直观的改变就是再次改进了纹理的压缩算法, 将纹理体积和纹理质量控制在一个相当优秀的范围之内。

参考文献

[1]胡晓峰等.多媒体技术教程[M].北京:人民邮电出版社, 2007.

[2]李泽年 (Ze-Nian li) 等, 史元春译.多媒体技术教程[M].北京:机械工业出版社, 2007.

[3][美]登普斯基.Directx实时渲染技术详解[M].重庆:重庆大学出版社, 2006.

[4][美]谢里德.Directx游戏开发终极指南[M].北京:清华大学出版社, 2008.

DirectX 篇2

微软似乎在“冲击波”的袭击中生存了下来,但现在它更积极地鼓励Windows用户修复软件中潜在的、不同的、更危险的安全漏洞。

尽管大多数公司已安装了应对“冲击波”的补丁,但另一个安全漏洞可能会被利用,再现上周阴影。

微软曾于今年7月23日在它的 上发出安全公告称,各版本的DirectX中均存在着一个“危急”的安全漏洞。

微软表示,该漏洞是由DirectX中一个依赖于被称为“quartz.dll”库文件的组件引起的。“quartz.dll”是用来来播放midi文件的,它应用于微软的众多程序中,包括Internet Explorer等,

一个经过特殊设计的midi文件可能会导致缓冲区溢出错误或使攻击者取得对受害用户系统的控制权,从而对受害用户的系统造成损害或利用受害用户的系统制造类似于“冲击波”的另一轮袭击。

TruSecure安全公司的首席科学家Russ Cooper预计,利用Windows另一安全漏洞的蠕虫或病毒将会在短期内出现。他说:“我们最担心的是DirectX中的漏洞。”他认为由于只有极少数用户针对该漏洞进行了修复,这一安全隐患目前仍是广泛存在的。

Cooper相信,DirectX中的漏洞有可能被类似于在“冲击波”中使用的方法所利用。

点击这里查看微软第MS03-030号安全。

点击阅读更多学院相关文章>>

DirectX 篇3

DX11为效率而生

DirectX 10(以下简称DX10)发布后,以Crysis为代表的FPS游戏画面达到了巅峰,显卡实时渲染出来的人物及风景效果足以媲美照片、CG动画甚至是电影,让人叹为观止!但华丽的同时,效率的低下加之特效的“滥用”也使GPU不堪重负。往往支持DX10的游戏都被誉为“显卡危机”就是这个道理。

因此,在DX10发布四年后,业界将期望都寄托在了DX11身上,虽然DX11并没有带来全新的特效,但却通过各种手段提升了GPU的渲染效率,当GPU有了富裕的运算资源之后,DX11游戏很容易就能从画面到速度全面超越DX10游戏。

DX11让游戏进入多线程时代

DX11当中新增的多线程处理技术,则是专门针对多核应用而生的,它通过引入“延迟执行”的指令将一个渲染进程拆分为多个线程,并根据处理器核心/线程数设定延迟执行内容的数目。多线程的涵义是非常广的,每一帧画面可以被分为几个图层,每个图层又可以分为N个区块,所有的这些都可以被并行调度到延迟执行的线程之中。

以往多颗GPU在DirectX中只能模拟成一个虚拟GPU,所有的GPU必须共享指令缓冲区并接受CPU调度,渲染线程的拆分与合并指令延迟都很大,GPU越多则效率越低。而在DX11当中,如果用多核CPU搭配多路SLI系统的话,每颗CPU都可以单独控制一颗GPU的渲染线程,在均分CPU负担的同时,提高了GPU资源利用率,从而大幅提升游戏性能。

细分曲面,凹凸有致的享受

游戏考虑到家用电脑的性能,模型不可能设计得太复杂,否则就不具备可玩性。但为了让游戏变得更加逼真、效果更加华丽,太简单的模型的确摆不上台面,那么有什么方法既能大幅提升模型复杂度、又不至于给显卡造成太大负担呢?Tessellation(细分曲面)技术就是为此而生的。

因为3D渲染中都是由一个个的小三角形构成,所以当三角形过少时(模型简单),那么原本平滑的表面就会显得凹凸不平。而细分曲面的原理就是自动为模型复杂化,使得凹凸不平的表面重新变得平滑。

说简单一点细分曲面就像是你为三角形添加三个顶点使其成为六边形;再添加三个顶点使其成为J九边形……一直继续下去这个图形会慢慢地圆滑接近圆形。

今天测试的《异型大战铁血战士》因为支持DX11,也采用了这个技术,图中可以看到模型的复杂度在细分曲面后有了一个质的提升。

实测《异形大战铁血战士》,DX11真的优秀吗?

提到“异形”和“铁血战士”相信大家都不会陌生,这两个名词最早要追述到20世纪福克斯公司在1979年上映的卖座电影《异形》和1987年上映的卖座片《铁血战士》,它们讲述的都是人类对抗太空外来生物的故事。但福克斯无厘头的关公斗秦琼也真是让人无奈地面对美国人的幽默。由Rebellion开发、世嘉发行的科幻射击游戏《异形大战铁血战士》完全采用DX11引擎设计,大量使用最新的技术和特效,力图营造出接近电影品质的电脑游戏。

DirectX 篇4

项目背景

声音, 是多媒体领域里的重要一环, 更是电脑用户上网、娱乐所离不了的。所以音量失常是困扰用户的一个难题。

一个音频文件本身就具有音量大小的属性, 所以播放不同歌曲文件时输出音量也不尽相同, 影响用户听觉体验。在优酷等网站上看小视频, 在播放前和播放后总会有广告, 音量较吵, 多数还不允许用户在播放窗口调节, 所以只能在桌面右下角的扬声器属性处调节, 增添麻烦。

通过以上举例可以看到该作品所应对的播放情形很常见。

项目实现

Direct X, (Direct e Xtension, 简称DX) 是由微软公司创建的多媒体编程接口。由C++编程语言实现, 遵循COM。Direct Sound是Direct X的一个较底层的部件, 提供了丰富的接口函数, 实现.wav格式的波形声音数据的混音、录制及播放等控制。

该项目即通过Direct X编程实现, 示意见图1。

版面所限, 以下各实现部分均只给出较为关键的代码。该项目为2013年度国家级大学生创新训练项目, 该程序的全部源代码以Visual Studio 2010版本的.sln解决方案给出, 已上传至csdn.net, 资源地址为:http://download.csdn.net/detail/chuchus/6297217。

1.录音部分

本项目用到其中的Direct Sound头文件及库文件见下。

#include

#pragma comment (lib, "dsound")

需要依次枚举录音设备、创建设备对象和创建录音buffer。创建录音buffer时需指定所捕获声音数据的存储格式。

WAVEFORMATEX wfx={WAVE_FORMAT_PCM, 1, 22050, 22050, 1, 8, 0};

//依次是采样格式, 声道数, 采样率, 块对齐, 每秒比特数, 采样位深, 额外信息

if (SUCCEEDED (hr=p DSC->Create Capture Buffer (&dscbd, &p DSCB, NULL) ) )

if (FAILED (pp DSCB8->Start (DSCBSTART_LOOPING) ) ) ;//开始录音

DSCBSTART_LOOPING宏定义参数为循环队列方式录音, 即循环不停地捕获声音。至此, 已建立缓冲区并开始捕获相应格式的声音, 直至调用pp DSCB8->Stop () 停止。

2.波形分析

语音信号是一种非平稳的时变信号, 其产生过程与发声器官的运动紧密相关。发生器官的状态变化速度比声音振动速度要缓慢得多。因此语音信号可以认为是短时平稳的。在5~50ms的范围内, 语音频谱特性和一些物理特征参数基本保持不变。这样, 可以将平稳过程的处理方法和理论引入语音信号的短时处理中, 每个短时的语音段成为一个分析帧。通过不同帧的分析, 可以提取到本项目所需要的语音的短时能量和平均幅度。

通常采用一个长度有限的窗函数来截取语音信号形成分析帧, 窗函数w (n) 将需处理区域之外的样点置零来获得当前语音帧。该项目采用矩形窗截取信号。一个N点的矩形窗函数定义为

定义短时能量为:

由式2可见, 短时能量为一帧样点值的加权平方和。特别是采用矩形窗时, 该式可化简为:

在代码实现中需要创建一个定时器Set Timer (h Wnd, TIMER_ID1_SEC, 500, NULL) ;每500毫秒调用相应函数, 将捕获到的数据放入wavedata数组进行分析。

在设定录音格式时, 对WAVEFORMATEX结构体的第一个成员变量赋值为WAVE_FORMAT_PCM。WAVE文件是计算机领域最常用的数字化声音文件格式之一, 后缀为.wav, 按照具体格式不同又可细分。PCM, 即脉冲编码调制 (pulse-code modulation) , 直接存储采样的声音数据没有经过任何的压缩, 是声卡直接支持的数据格式, 这给声音波形的分析带来便捷。该项目中采样位深为8, 取样数据被存储为无符号数, 所以振幅可用下列语句求得:

int amplitude= (unsigned int) labs ( ( (long) wavedata[i]-128L) /afactor) ;

3.声音干预

此部分用到了COM (Component Object Model, 组件对象模型) 与Core Audio API。

COM组件是以WIN32动态链接库 (DLL) 或可执行文件 (EXE) 形式发布的可执行代码组成, 可以给应用程序、操作系统以及其他组件提供服务。

Windows Vista、Windows 7等系统音频系统相比之前的系统有很大的变化, 产生了一套新的底层API即Core Audio APIs。该底层API为高层API (如Media Foundation, 将要取代Direct Show等高层API) 提供服务。

此部分需要包含的头文件见下:

#include

#include

#include

以下语句可直接控制系统音量, 若有变动时在任务栏点出的系统主音量调节界面可看到同步变化。

m_p Endpt Vol Ctrl->Set Master Volume Level Scalar (the_volume_you_want, &m_guid My Context) ;

退出程序前要释放掉相应的资源, 可在析构函数中添加相应语句。

实现效果

最终程序界面中有三个滚动条。第一个自动显示当前系统主音量, 用户可以手动调整, 与在任务栏点击小喇叭图标调整音量效果完全相同;第二个显示实时声音振幅, 每隔500毫秒更新一次, 滑块随振幅高低左右滑动;第三个为临界振幅, 可由用户调整, 若实时振幅大于临界振幅, 程序就会自动干预系统音量, 防止音量过大。

结束语

该程序较好地完成了预期的功能设想, 有以下价值。

同时做到对音量的实时分析和自动干预, 经查阅资料尚无发现有此类软件;

以人为本, 免去了手动调节的繁琐, 让电脑更易用;

DirectX 篇5

原因是,DirectX8集成了两大特技�D�DVS (Vertex Shader)和PS(Pixel Shader)。通过vs和ps的渲染,可以很容易的宁造出真实的水面动态波纹光影效果。主要代表显卡是NVIDIA的Geforce 3,后期ATI的Radeon8500。DirectX8的发布成了真正的第4代3D加速卡时代来临的标志。

点击阅读更多学院相关文章>>

DirectX 篇6

DirectX10潮流的先锋

DirectX l0加人了新版本Shader Model 4.0支持,相比DirectX9,DirectX l0在渲染流程上也作出了大幅度的改动,淡化了渲染概念并完全Shader化。在实际应用中,相对于DirectX9来说。DirectX 10对于游戏的最大影响并非画质的突破,而是各种减少资源占用的特效,因为对于3D游戏来说,资源占用的减少可以使游戏实现宏伟广阔的游戏画面,因此在DirectX 10游戏上我们可以看到非常宏大的游戏场景,和细致的纹理贴图,就拿《失落的星球》来说,远到天边的皑皑雪山,近到主角细腻的面部表情,都给人一种身临其境的感觉,而这些确是DirectX9难以企及的。DirectX 10另一个优势便是能够配合Xbox 360应用程序界面,让游戏跨平台开发更为方便,这表明以后会有一定数量的XBOX360大作移植到DirectX l0平台上,这绝对是一个不可小视的诱惑。

所以如果你对游戏画面有极致的追求,那么“一步到位”选择DirectX l0绝对没有错。但是需要注意的是,千元以下低端的DirectX l0显卡(Geforce8500和HD2400)在渲染管线和着色单元上都有着很大的缩水,所以其很难流畅运行DirectX10大作。因此我们建议在你银两足够的前提下,包括8600以及以上等级的显卡才是你应该考虑的范围,而价格低廉的DirectX10低端产品确实没有购买的价值。宁缺毋滥。

昂达8600GT 256MB DDR3(参考售价:1099元)

昂达8600GT 256MB DDR3核心开发代号为G84-300,采用80nm工艺制程,内建32个流处理器,支持DirectX l0和SM4.0特效,配备了1.2nsGDDR3显存颗粒,组成256MB/128Bit显存规格,显卡核心/显存频率为540MHz/1400MHz,供电部分全部采用了日系KZG和红宝石的直插式电容,还有全封闭式的密封电感,为显卡的超频提供优秀的硬件环境。提供了双DVI+S-Video接口组合,同时板载独立的RAMDAC与TMDS模块,可实现高达2560x1600分辨率输出。

棋祥8600GT 256M DDR3无敌超人Ⅱ(参考售价:1099元)

该显卡基于NVlDIA G84-300图形处理器,采用了80nm制造工艺。内建32个流处理单元,完全支持DirectX 10与Shader Moder 4.0技术。采用独家研发的6层非公版PCB制造,供电部分采用了强大的三相供电模组设计,两相核心供电模组,搭配了三星1.2ns GDDR3显存颗粒,显存规格为256MB/128Bit,核心/显存默认频率为650MHz/1700MHz。采用铝挤合工艺的全铝制散热风扇,良好的散热确保了显卡的稳定性。

映泰VP8803GS33(参考售价:1999元)

映泰VP8803GS33基于G80显示核心,支持DirectX 10标准、Shader Modie 4.0等特效。提供了对128bit FP精度HDR的支持,而且完全兼容DX9.0C标准,使用了1.2ns GDDR3显存颗粒,显存规格为320MB/320BIT,核心/显存默认频率为500MHz/1600MHz,由于320bit的显存位宽,因而拥有64GB/s的显存带宽,对于3D游戏玩家非常有好处,采用涡轮散热风扇,整个散热装置将核心、显存完全遮盖住,保证了良好的散热性能。

DirectX9末代的王者

对于游戏玩家来说,他们不是追求最新的产品,而是需要最适合的显卡,而游戏厂商在开发游戏时,也会马上考虑DirectX 10,这主要是因为DirectX 10显卡在产品数量、种类以及驱动程序都不够完善,因此我们看到很多主流大作依然只是DirectX 9.0游戏,比如最新推出的《科林麦克雷:尘埃》,这是许多赛车游戏玩家热捧的最新作,但它依然是一款DirectX 9.0游戏,并且在对比测试中发现,高性能DirectX 9.0显卡能够流畅打开各种特效,但普通的中低端DirectX 10显卡表现却不够理想。此外还有《极品飞车10》、《上古转轴4:湮灭》等,应付这些高水准的DirectX 9.0C游戏。价格低廉的高性能DirectX 9.0C显卡无疑成为首选。

所以说,如果你对游戏的追求很“主流”(希望能够较好地体验目前市面上的主流3D游戏)、你的显卡预算也很“主流”(1000元-0元之间),这种情况下性能不错且产品种类繁多的主流DirectX9显卡将是你不错的选择,如果想玩基于DirectX10设计的游戏大作,建议买台XBOX360。

影驰GeForce7900GS高清版(参考售价:799元)

影驰GeForce 7900GS高清版采用了0.09nm制作工艺的G71核心芯片,拥有20条像素渲染管线及7个顶点着色单元,支持DirectX9.0C、OpenGL 2.0及PureVideo技术,采用1.4nsDDR3显存颗粒,显存规格为256MB/256bit的,核心,显存频率为540Mhz/400Mhz,提供了双24针DVI—I接口设计,采用了超大开放式的散热风扇,显存加装了散热贴片,确保显卡在高负荷的工作环境下也能保证散热需求。

微星RXl950PRO-TD256E(参考售价:999元)

微星RX1950PRO-TD256E采用了0.08um制作工艺的RV570核心芯片,拥有12条像素渲染管线及8个顶点着色单元,支持DirectX 9.0C、OpenGL 2.0及1080P H.264硬件解码技术和HDCP技术,采用1.4nsDDR3显存颗粒,显存规格为256MB/256bit,核心/显存频率为575Mhz/1200Mhz,核心采用了双相供电设计,PCB采用优质电解电容及封闭式电感,保证了显卡的稳定运行。

微星7900GS 512MB(参考售价:1299元)

微星7900GS 512MB采用了G71核心。内建20条像素渲染管线和7组顶点处理引擎。支持DirectX 9.0C、OpenGL 2.0及PureVideo技术。搭载了1.4ns GDDR3显存颗粒,显存规格为512MB/256Bit,核心/显存频率为450MHz/1320MHz,采用三相供电设计,用料上选取了高品质三洋紫色固态电容,搭配其他固态电容与封闭的电感,为显卡提供了稳定的电流,保证了显卡长期稳定的运行,具备了双DVI+HDTV接口,可以组建高清视频平台。

斯巴达克惊天镭x1950GT(参考售价:799元)

斯巴这克惊天镭x1950GT采用了80nm工艺制程,拥有12条像素处理流水线、36个像素处理单元和8个顶点着色单元,完美支持DirectX 9.0C、Shader Model 3.0、HDR+AA等先进特效,搭载了1.4ns GDDR3显存颗粒,显存规格为256MB/256bit,核心/显存频率为500MHz/1200MHz,散热方面采用了大型铝制散热器,可以达到不错的散热效果,使用了DVI+VGA+HDTV接口组合,相比双DVI接口更易用性更好。

“乱世”寄语

DirectX 篇7

国外对三维游戏引擎的研究主要集中在几个大公司,如3DRealms,Id Software,Valve等等,它们研究开发了一批优秀的三维引擎,如QuakeⅠ,QuakeⅡ,QuakeⅢ,Half-Life等。是它们推动了三维游戏引擎的发展。

在国内,北京航空航天大学计算机系是国内最早进行VR(Virtual Reality,虚拟现实)研究、最有权威的单位之一,它们首先进行了一些基础知识方面的研究,并着重研究了虚拟环境中物体物理特性的表示与处理;针对虚拟现实中的视觉接口,开发出了部分硬件接口并提出了有关算法及实现方法;实现了分布式虚拟环境网络设计,建立了网上虚拟现实研究论坛,可以提供实时三维动态数据库,提供虚拟现实演示环境,提供用于飞行员训练的虚拟现实系统,提供开发虚拟现实应用系统的开发平台,并将要实现与有关单位的远程连接。北京航空航天大学虚拟现实与可视化新技术研究室开发了虚拟北航校园项目,并设计实现了虚拟环境漫游引擎。在配置VOODOO2图形加速卡的Pll266微机平台上,漫游引擎驱动了一个由10万个三角形构成的北航校园模型,其交互仿真率保持在25帧/秒以上。为了验证漫游引擎的通用性,还先后将漫游引擎用于房地产项目虚拟恒昌花园及虚拟珠穆琅玛峰等漫游应用中。

浙江大学CAD&CG国家重点实验室开发出了一套桌面型虚拟建筑环境实时漫游系统。该系统采用了层面迭加的绘制技术和预消隐技术,实现了立体视觉,同时还提供了方便的交互工具,使整个系统的实时性和画面的真实感都达到了较高的水平。另外,它们还研制出了在虚拟环境中一种新的快速漫游算法和一种递进网格的快速生成算法。浙江大学开发的虚拟紫禁城项目就是虚拟环境漫游的研究成果。

四川大学计算机学院开发了一套基于OpenGL的三维图形引擎Object-3D。该系统在微机上使用Visua1C++5.0语言实现,其主要特征是:采用面向对象机制;与建模工具如3DMAX、Mutagen相结合,对用户屏蔽一些底层图形操作;支持常用三维图形显示技术如LOD等;支持动态剪裁技术;保持高效率渲染。

中国地质大学分析了基于微机的三维应用程序的结构特点,提出了一个基于OpenGL和Direct3D两种3DAPI(应用程序编程接口)的三维图形引擎结构框架。该框架己经成功应用到其开发的系统“三维城市景观浏览器Map3DViewer中”,收到了较好的效果。

2003年,国家863计划正式将游戏引擎的研发纳入了国家高科技发展计划,并将研发的任务交给了金山公司。据金山负责人说,他们已经开发了一套较为完整的引擎,并将使用于新开发的游戏中。另外据报道一个成都的大学生彭海涛与三个志同道合的朋友,历时两年研发出了国内第一款真正意义上的原创3D网络游戏《传说online》。这是一款有完全自主知识产权的3D游戏。

2 研究内容及工具

2.1 研究内容

本文研究的主要内容是游戏引擎的架构,以RPG类型为例,研究如何为一个游戏合理设计各个模块(不考虑网络应用)。系统所应具有的模块如下:

1)渲染子系统(Graphics Sub-System):渲染、光影等。

2)输入子系统(Input Sub-System):把需要的各种不同输入装置(键盘、鼠标、游戏板,游戏手柄)的输入触发做统一的控制接收处理(透明处理)。

3)声音子系统(Sound System):负责载入、播放声音。

4)时间系统(Time)。

5)支持系统(Support System):数学成分(点,面,矩阵等),(内)存储管理器,文件载入器,数据容器等。

6)脚本系统(这里只预留实现接口)

7)物理系统:碰撞检测等

2.2 工具

考虑DirectX只能使用在Windows中,程序开发使用Microsoft Visual Studio 2005,本次使用的DirectX开发包为Dxsdk_aug2007,为最新的Direct9开发包,使用的显卡为ATI9550/128b/128M。

3 Direct 3D概述

Direct 3D是一种低层图形API(Application Programming Interface,应用程序接口),它能让我们利用3D硬件加速来渲染3D世界。可以把Direct3D看作是应用程序和图形设备(3D硬件)之间的中介。通过利用Direct3D API编程,能够屏蔽许多底层实现的技术细节,缩短开发周期。

图1显示了Direct3D、HAL(Hardware Abstraction Layer,硬件抽象层)及硬件之间的关系。其中HAL即硬件抽象层,是一组指示设备执行某种操作的特殊设备代码的集合,由设备制造商实现,Direct3D不能直接作用于图形设备,通过使用HAL与硬件图形设备协同工作。

如图1所示,Direct3D应用程序最终通过图形卡的设备驱动程序访问图形硬件。由于HAL存在,Direct3D将可以不需要了解某个设备的具体硬件特性,使它能够独立于硬件设备。Direct3D提供了相应的方法在运行时检查设备是否能执行某项操作。

4 Direct3D重要概念

4.1 顶点

一个场景是多个物体或模型的集合。一个物体可以用三角形网格来近似表示,3D世界中最基本的图元就是三角形,一个多边形的两边相交的点叫做顶点。为了描述一个三角形,我们通常指定三个点的位置来对应三角形的三个顶点,这样我们就能够很明确的表示出这个三角形。3D物体中的三角形经常会有许多共用顶点。为了解决复杂精细场景重复顶点占用更多的渲染带宽,我们在创建一个顶点列表的同时也创建一个索引列表。顶点列表包含所有不重复的顶点,索引列表中则用顶点列表中定义的值来表示每一个三角形的构造方式。通常每个顶点都包含如下信息:x,y,z坐标值、颜色值、用于计算灯光的法线和纹理坐标(u,v)。

4.2 表面

是一个像素点阵,主要用来存储3D图形数据。表面数据就像一个矩阵,像素数据实际上是存储在线性数组里面。

Direct3D里面的IDirect3DSurface9接口用来描述表面,这个接口提供一些方法来直接操作表面数据:

LockRect方法:可以获得一个指向表面内存的指针,通过此指针可以对表面上任一个像素点进行读、写操作;

UnlockRect方法:给表面解锁;

GetDesc方法:通过填充D3DSURFACE_DESC结构来返回表面的描述信息。

4.3 多重采样(Multisampling)

由于使用像素来表示图像,在显示时会出现锯齿状。Multisampling就是使图像变得平滑的技术。它的最普通的用法就是全屏抗锯齿。D3DMULTISAMPLE_TYPE枚举类型能使我们制定全屏抗锯齿的质量等级。

4.4 交换链和页面交换

Direct3D通常建立2~3个页面组成一个集合,即为交换链,通常由IDirect3DSwapChain接口来表示。交换链和页面交换技巧被用在使两帧动画之间过渡更加平滑。通常由Direct3D自己去管理。

4.5 深度缓冲

深度缓冲是一个表面,但它不是用来存储图像数据而是用来记录像素的深度信息。深度缓冲为每一个像素计算深度值,并进行深度测试。通过深度测试我们可以知道哪个像素离摄像机近从而把它画出来。这样就可以只绘制最靠近摄像机的像素,被遮住的像素就不会被画出来。

4.6 顶点处理

顶点是3D图形学的基础,它能够通过两种不同的方法来处理,第一种:软件顶点处理(software Vertex Processing),第二种:硬件顶点处理(Hardware Vertex Processing)。前者总是被支持而且永久可用,后者要显卡硬件支持顶点处理才可用。使用硬件顶点处理总是首选,因为它比软件方式更快,而且不占用CPU资源。如果一块显卡支持硬件顶点处理的话,也就是说它支持硬件几何变换和光照计算。

4.7 设备能力

Direct3D支持的每一种特性都对应于D3DCAPS9结构的一个数据成员,初始化一个D3DCAPS9实例应该以用户的设备实际支持的特性为基础。因此,在我们的应用程序里,我们能够通过检测D3DCAPS9结构中相对应的某一成员来检测设备是否支持这一特性。

5 Direct3D初始化

初始化步骤:

1)获得IDirect3D9接口指针。

2)检查设备的技术特性,确定显卡是否支持硬件顶点处理。

3)初始化一个D3DPRESENT_PARAMETE结构实例,这个结构包含了许多数据成员,它允许我们指定将要创建IDirect3DDevice9接口的特性。

4)创建一个基于己经初始化好了的D3DPRESENT_PARAME-TER结构的IDirect3DDevice9对象。

6 游戏引擎架构

3D游戏引擎通常由以下几个部分组成:图形处理、染器、碰撞检测、声音处理、网络连接以及必要的游戏逻辑,因为引擎基于Direct9.O,故大部分底层实现需要Direct3D支持,具体架构如图2所示。

3D游戏引擎架构其中的游戏逻辑模块主要起着衔接引擎各模块工作、引导控制流数据流的作用,它加载游戏中的模型文件,接受并处理用户在游戏过程中输入控制请求,处理用户设定的游戏参数,将各种操作指令送到相应模块进行处理并将最后显示结果送至渲染管线。通常图像的渲染处理、光栅化在显卡的GPU(Graphic Processing Unit,图像处理单元)中实现。

7 游戏主程序

7.1 游戏主程序的流程

一个典型的3D游戏主程序的伪代码如下:

Direct3D初始化:

初始化游戏中所需要的设备;

处理消息;

while(1)

{

处理用户的输入;

更新物体的位置;

渲染处理;

}

}

其中更新物体位置信息的伪代码如下:

保存物体的当前位置;

根据控制输入或者已有逻辑计算新的位置;

if(新位置不可用或者发生碰撞)

将新位置设置当前位置;

}

}

7.2 框架模块

Windows是一个消息(Message)驱动系统。Windows的消息提供了应用程序之间、应用程序与Windows系统之间进行通信的手段。应用程序想要实现的功能由消息来触发,并且靠对消息的响应和处理来完成。由于游戏编程对处理速度的要求,在D3D编程中通常不使用Windows提供的消息,也就是说忽略Windows的消息(窗口关闭的消息通常会处理),针对这一特点,几乎所有的游戏的窗口的创建具有共性,因此设计一个用于创建窗口的类CGameEngine_app,其声明如下:

8 结束语

本文论述了基于Directx9对3D游戏引擎开发的过程,对图形渲染管线,资源管理等方面进行了深入的研究,设计并实现了一个简单的3D游戏引擎的主要部分

参考文献

[1]刘祎玮,张引,叶修梓.3D游戏引擎渲染内核架构及其技术[J].计算机应用研究,20006(8).

[2]樊翠,王丽芳.基于D3D的三维游戏引擎的设计与实现[J].科学技术与工程,2006(10).

[3]惠志,李春富,刘心雄.一个基于3D游戏引擎的虚拟展示方案[J].微机发展,2005(4).

[4]刘小丹,付丽梅.一种个性化人脸游戏引擎设计[J].辽宁师范大学学报(自然科学版),2007(1).

[5]曹阳,梁华,蔡宣平.基于DirectX的音频视频无线传输系统设计与实现[J].现代电子技术,2007(15).

[6]岳望,李根,王钲旋,等.教学用三维游戏引擎的层次结构分析与初步实现[J].大连民族学院学报,2007(5).

[7]周新春,昂海松,罗东明.基于DirectX的微型飞行器飞行仿真系统[J].系统工程与电子技术,2007(7).

DirectX 篇8

拆嵌细分曲面技术, 能够根据3D模型中已经有的顶点, 根据不同的需求, 按照不同的规则, 进行插值, 将一个多边形拆分成多个多边形, 这个过程主要靠GPU内部的一个可编程拆嵌器模块来实现, 从而很好的解决了效率和效果的矛盾。拆嵌器能自动创造出数百倍与原始模型的顶点, 这些不是虚拟的顶点, 而是实实在在的顶点, 效果是等同于建模的时候直接设计出来的[1]。如图1所示, 拆嵌器能从简单模型生成复杂模型, 从而大大提高了开发效率, 而且简单的模型在GPU处理时也能大幅节约显存开销, 令渲染速度大幅提升。

与DX9C/DX10时代孤零零的镶嵌器模块不同, 在DX11当中, 微软加入了分别位于镶嵌器前后的两种全新着色器来全力配合镶嵌器的工作[2]。

如图2所示, 其中外壳着色器负责接收琐碎的图形数据和资料, 而控制点将会基于如何配置镶嵌器来产生数据。镶嵌器生成大批量的、确定数量的点, 然后数据将传送给域着色器把这些点转换成3D处理中的顶点, 并自动进行法线平移、置换贴图, 最后GPU生成曲线以及多边形, 产生新的模型。

2 镶嵌器与置换贴图的综合应用

贴图置换是一种通过顶点着色器和alpha混合操作来达成复杂表面的操作, 基本上贴图置换不会增加新的多边形, 即便增加也仅作操作点用。曲面细分则不一样, 它通过在已知多边形内设立新的顶点, 达成扇形操作来完成增加多边形的目的。前者重点是alpha和顶点移动, 后者则是直接增加多边形数量, 这是两种完全不同的复杂表面细节实现手段[3]。

如图3所示, 帖图置换能够通过镶嵌器将网格根据帖图所反映的高度差值进行提升和降低进行几何置换, 得到基本的置换帖图网格;几何形体建立完成后, 对几何表面应用顶点着色器或者像素着色器, 施以顶点光照, 从而实现最终的输出。和以往主要在光栅化阶段进行的凹凸映射不同的是, 帖图置换生成的是由更多多边形构成的真实外观, 而凹凸映射则是一种欺骗性手段、一种性能妥协方案而已, 不能产生真正不同的外形。

3 实验与分析

实验环境为ATI HD5000显卡, Windows7操作系统, DirectX11版本, 如图4C、D所示, DirectX 11中镶嵌器和贴图置换技术结合后所带来的革命性的画面提升:从平面的贴图到鳞次栉比的瓦片, 让人很难相信这是来自同一个模型。而A、B则直观的展示了在DirectX 11下, 镶嵌器技术自动丰富了模型内的多边形数量。

摘要:微软最新的DirectX版本中对拆嵌曲面细分技术正式支持, 并新增外壳着色器和域着色器来完善曲面细分管线。贴图置换是一种通过顶点着色器和alpha混合来达成复杂表面的操作, 而曲面细分则通过在已知多边形内设立新的顶点, 达成扇形操作来完成增加多边形的目的。两者结合对同一个模型却产生了巨大的不同效果, 生成了更为真实的游戏画面。

关键词:拆嵌曲面细分,置换,着色器,色器

参考文献

[1]irectX11核心技术Tessellation浅析[EB/OL], http://article.pchome.net/con-tent-992782.html

[2]像的革新Win7DirectX11技术全解析[EB/OL], http://www.enet.com.cn/article/2009/0601/A20090601480573.shtml

DirectX 篇9

关键词:Direct3D,Win32,实时显示

0 引言

在海洋水产拖网作业中, 若能使网具瞄准鱼群捕捞, 就可以大大提高捕捞的经济效益, 减少人力、物力的盲目消耗。而解决这一问题的关键是如何实时、准确地获知网具在水下所处的水层深度以及网口的高度, 网位仪作为电子助渔设备的重要组成之一, 能够实现这一功能。目前, 网位仪主要用于监视拖网在水下的位置、状态和网口鱼群信息, 为操作人员调整网具提供依据, 以有效地提高捕鱼效率。为了满足我国海洋渔业发展的需求, 迫切需要研制成功具有自主知识产权的网位仪探测设备。网位仪的显示需要实时显示, 所以本文采用DirectX设计了网位仪数据实时显控软件。

1 DirectX和GDI的比较

由于网位仪显控软件的实时性要求很高, 就需要有很好的绘图接口来实现。通常, 在Windows系统下对图像处理的方法主要有GDI和DirectX提供的API函数。应用程序与Direct3D (DirectX的重要组成部分) 、Windows图形设备接口 (GDI) 、HAL和显示硬件之间的关系如图1所示。

若使用GDI技术来开发该显控系统, 由于GDI属于硬件和系统之间的抽象层, 当程序员间接调用gdi32.dll中的接口进行窗口的绘制时, 数据从显存到内存之间的一系列数据交换将使得效率下降。而DirectX是微软开发的多媒体编程套件, 做到了GDI的设备无关性, 绘图效率比GDI高了很多, 既可以直接操作显存, 同时还提供程序员抽象的编程模型, 故本设计采用了DirectX进行数据实时显控软件的开发。

2 DirectX的组件

DirectX主要由以下7个部分组成:Directlnput, Direct3D, DirectSound, DirectSetup, DirectX Media Objects, XInput, XACT。

本文主要对Direct3D组件进行研究。Direct3D是基于微软的通用对象模式COM的3D图形API。Direct3D有两种显示模式: (1) 全屏模式, 是指画面全部被Direct3D所占据, 不会再显示其他的视窗画面, 该软件设计就是采用此模式; (2) 视窗模式, 是指可以有多个视窗同时出现在屏幕上。

3 显控软件的设计与实现

整个显控软件有3个功能: (1) 发送所需控制参数给水下声探头; (2) 接收水下声探头处理的各声换能器波束扫描数据和各传感器数据, 并对数据进行优化和差值处理; (3) 在屏幕上实时显示网口的形状、周围鱼群信息、各传感器的数据、网板位置, 并完成相关的操作。该显控软件人机界面友好, 操作简单, 实时性很高, 图2为网位仪显挖软件界面。

3.1 显示模型的转换及调入

3.1.1 模型的转换

通过3D MAX三维建模软件制作的模型通常不能直接在Direct3D程序中使用, 这就需要利用一些工具、插件将制作好的模型文件转换成在Direct3D开发接口中可以直接使用的格式, Direct3D支持的模型文件格式为*.X。*.X文件是Direct3D提供的模型和动画数据的存储格式, 通常存储了三维模型的顶点坐标、颜色、法向量、纹理坐标以及动画帧等信息。

3.1.2 模型的调入实现过程

(1) 首先使用Direct3D提供的模型接口定义一个模型的指针:

LPD3DXBUFFER pD3DXMtrlBuffer;//存储网格模型材质的缓冲区对象

(2) 初始化场景。从*.X文件中读入模型并提取材质属性和纹理文件名。

(3) 场景动态重建。在动态显示时, 根据接收数据的不同调整模型的姿态, 场景动态重建还要进行消隐处理。

(4) 渲染并实时显示场景。在*.X文件中读入模型, 实时处理材质、光源、贴图以达到场景的动态变化效果, 部分代码如下:

调入的网位仪模型如图3所示。

3.2 实时接收数据的显示实现过程

3.2.1 创建、初始化设备对象以及静态顶点缓存

创建DirectX对象, 创建窗口对象, 完成显示窗口的创建, 将该窗口作为用户与虚拟世界交互的主要窗口, 部分代码如下:

下列为初始化顶点缓存, 包括每个成员的x, y, z坐标, 纹理及颜色等数据信息。利用极坐标与直角坐标之间的转换关系 (ρ2=x2+y2;tanθ=y/x;x=ρcosθ;y=ρsinθ) 将接收来的数据进行处理, 用极坐标在屏幕上显示出网口和鱼群的位置, 部分代码如下:

在写表面时要先锁定表面资源, g_pRoundS->lock () ;在写表面后要解锁表面资源, g_pRoundS->Unlock () 。

3.2.2 渲染并实时显示网口位置

进行渲染, 将表面对应的x, y位置的点用直线连接起来, 绘制网口的形状, 部分代码如下:

4 结束语

本文主要介绍了基于Direct3D技术实现网位仪数据实时显示的方法, 该方法提高了图像的实时处理效率, 获得了满意的实时处理效果。该软件具有直观性、实时性等特点, 给渔业作业带来了极大的便利。

参考文献

[1]王德才, 杨关胜, 孙玉萍.DirectX 3D图形与动画程序设计[M].北京:人民邮电出版社, 2007.

[2]Andre LaMothe.Windows游戏编程大师技巧[M].第2版.沙鹰, 译.北京:人民邮电出版社, 2012.

[3]Frank D Luna.DirectX 9.0 3D游戏开发编程基础[M].段菲, 译.北京:清华大学出版社, 2007.

[4]陈锵, 孙赫雄, 陈楠.Visual C++2005从入门到精通[M].北京:电子工业出版社, 2007.

DirectX 篇10

地铁屏蔽门系统是一项集建筑、机械、材料、电子和信息等学科于一体的高科技产品,使用于地铁站台,用以提高运营安全系数、改善乘客候车环境、节约运营成本,起安全、节能、环保作用。屏蔽门将站台和列车运行区域隔开,通过控制系统控制其自动开启关闭。屏蔽门系统主要由门体结构部分和控制门体运行的控制系统组成;而控制系统又包含门控单元(DCU),中央控制盘(PSC)及站台监控器(PSA)等部件[1]。

站台监控器的作用是监控站台上门体的所有信息,如故障、门体的开门关门状态等;同时它又可以记录门体上发生的事件,以备工作人员查询。监控器本身是一台工业用的专用电脑,上面有地铁屏蔽门专用的软件程序,用以监控记录站台信息[2]。随着技术的发展、CPU等硬件运行速度的提高,站台监控器的角色也在变化,监控软件从具有单一的站台屏蔽门监控功能,逐渐发展为站台屏蔽门监控、门控单元参数配置、门控电机参数配置,固件远程下载等多功能的系统;而软件界面也从静态、死板、色彩单一,逐步向动态、多样化、炫彩的方向演变,让使用者有全新的感受。

本文采用在MFC框架下,基于Windows的消息循环机制,将Direct X技术嵌入到MFC的框架中,实现了站台监控器软件界面的开发,即在主界面中应用Direct X,在配置、查询、下载等子界面应用MFC控件的方法。该技术的应用不仅发挥了Direct X技术对图形处理的高效灵活,而且利用了MFC框架开发速度快、控件使用简单的优点。在保证程序运行的高效性的同时也使软件监控界面更加生动,监控信息更加明了。

1 Direct X与MFC

1.1 Direct X技术

Direct X(Direct e Xtension,简称Direct X或DX)是由微软公司创建的主要应用于Microsoft Windows的多媒体编程接口。Microsoft Direct X旨在使基于Windows的计算机成为运行和显示具有丰富多媒体元素(例如全色图形、视频、3D动画和丰富音频)的应用程序的理想平台[2,3]。在一定程度上,可以把Direct X理解为通用显卡接口,区别于以前的以GDI(Graphics Device Interface,图形设备接口,主要任务是负责系统与绘图程序之间的信息交换,处理所有Windows程序的图形输出)及GDI+(GDI的升级加强版)所绘制的界面,Direct X表现出更加强大的图形功能,不仅使画面更加多彩流畅,而且占用CPU的比率也更少。

虽然它功能强大,然而它的开发实现都比较复杂,在无现有引擎的前提下,整个开发周期比较长,所有的消息处理、动态效果、纹理贴图都要自己编代码完成。

1.2 MFC框架

MFC(Microsoft Foundation Class Library)框架是一种由各种类结合起来构成的一个应用程序框架,它的目的就是让程序员在此基础上来建立Windows下的应用程序,这是一种相对SDK(Software Development Kit,软件开发包)来说更为简单的方法[4]。因为总体上,MFC框架定义了应用程序的轮廓,并提供了用户接口的标准实现方法,程序员所要做的就是通过预定义的接口把具体应用程序特有的东西填入这个轮廓。Microsoft Visual C++提供了相应的工具来完成这个工作:应用程序向导可以用来生成初步的框架文件(代码和资源等);资源编辑器用于帮助直观地设计用户接口;类向导用来协助添加代码到框架文件;最后,编译,则通过类库实现应用程序特定的逻辑。

但MFC在图形化处理上还是应用GDI技术,因此在界面渲染上不是很出色,无法实现炫彩斑斓的界面效果,更加无法将秒帧率(Frame Per Second,FPS)提高到一定高度。

1.3 Direct X技术与MFC框架的融合

将Direct X技术嵌入到MFC框架中,既可以利用Direct X在图形化处理的优越性能,实现主界面的绚烂多彩;又可以利用MFC框架的特点,加快开发,免去一些常用控件的编写工作。

2 Direct X嵌入MFC框架

2.1 嵌入窗体关联

在MFC框架中,CView是用于显示的窗体类封装。Direct X的显示需要有一个窗体作为载体,于是考虑将Direct X所用的窗体寄生于MFC的CView类中。但CView类需要动态创建,为了简化这种创建,采用MFC现成的机制——文档/预览架构支持(Document/View Architecture Support)建立一个SDI(Single-Document Interface)或MDI(Multiple-Document Interface)工程,它会自动帮你建立好CView类。

VC开发默认环境是不支持Direct X的,于是还要把Direct X库添加进去。在工程属性的VC++目录中加入Direct X的Include和Lib二个目录,以增加对Direct X库的支持。

2.2 Direct X初始化

2.2.1 编写Direct X的初始化函数

Direct X的初始化函数主要实现以下功能:

建立IDirect3D9目标:

检查硬件是否支持顶点处理:

填充D3DPRESENT_PARAMETERS结构体:

建立D3D设备:

释放IDirect3D9目标:

2.2.2 在MFC中实现Direct X初始化

Direct X的运行需要一个窗体的支持,所以在MFC框架中寻找一个窗体作为Direct X的载体来实现其功能。这些决定必须在得到窗体句柄后初始化Direct X,这里选择重载CView类的On Initial Update函数,在这个函数中实现初始化,这样在CView类的窗体创建完后,MFC的机制会调用On Initial Update函数。

2.3 更新及渲染

2.3.1 Direct X的更新及渲染

每次Direct X进行画面刷新时,都要经过更新及渲染二个过程,可以用Update函数实现更新,Render函数实现渲染[5]。

Update函数的目标是用系统时间更新数据,如:更新顶点坐标实现动画或动作、更新顶点颜色的透明度通道实现淡入淡出、更新观察者矩阵实现各种旋转等。

Render函数的目标是对屏幕进行渲染。渲染的数据不是直接体现在屏幕上的,而是先将这一帧所有要渲染的数据储存在后置缓冲区,然后再一次性地将后置缓冲区的数据呈现在屏幕上。一般分为以下几个步骤:

首先对后置缓冲区进行清理工作,清除上一帧的数据:

然后开始对后置缓冲进行渲染:

最后把后置缓冲的数据呈现在屏幕上:

2.3.2 在MFC中实现更新渲染

在Direct X程序中,更新渲染过程通常在Windows消息循环的WM_PAINT中;在MFC框架中,如果把更新渲染函数放在WM_PAINT消息处理函数中,那么就会出现屏幕刷新率非常低的现象,即卡屏现象。

这个问题比较好的解决方法是:在MFC框架中,主执行线程类是CWin App(或CWin App Ex)的应用程序类,在系统空闲时,Windows会自动调用这个类的On Idle函数[6]。基于Windows运行时采用这样的机制,于是重载这个类的On Idle函数,在On Idle函数中进行更新和渲染。

2.4 实现窗体拉伸

用MFC开发时,基本不用考虑窗体拉伸所带来的影响,不会出现内存泄露等严重问题,这些都是MFC框架做好的。如果把Direct X嵌入到MFC框架中,就必须处理WM_SIZE消息,否则一但拉动窗体,必定内存泄露[7]。

首先,需要实现一个叫Cleanup的函数,因为每一个建立的Direct X接口,都需要在退出时释放。把所有在Direct X接口释放都集中在Cleanup函数中,方便管理。

然后,处理CView类的On Size函数:

在窗体拉伸时,主要改变的就是cx和cy二个量(窗体的宽和高),必须同步处理Direct X的后置缓冲中的宽和高参数,才不会出现内存泄漏问题。

3 控件编写与使用

在把Direct X嵌入到MFC后,由于这种架构本身就是基本MFC框架,所以MFC的控件可以任意地使用。在菜单的一些子项目中,利用MFC控件高效地开发,如:配置参数、固件更新、背景选择等;在主界面中,利用Direct X技术开发一些自己的专用控件,使界面更加多彩绚丽。

比如在站台监控器运行时,需要监控门体的运行状态(如开门中,关门中等动作),最好能把这些状态表现为动画。在MFC本身的框架中,要实现动画是一件比较麻烦的事,并且运行效率不高;但这里加载了Direct X技术,使一切变得简单。

可以在Direct X初始化时从文件创建一张门的纹理,并创建一个顶点缓冲区与之对应,给顶点赋坐标、颜色及纹理坐标。在渲染前的更新函数(Update)中,更新顶点的坐标及顶点的纹理坐标来实现门体的各种动作;还可以改变顶点的颜色,比如变红色以警示屏蔽门出现了一些故障等;还可以利用透明度通道,在门体纹理上叠加数字,给屏蔽门编号以方便查找;还可以在门体上方贴上轻轨列车的纹理使之生动形象又方便对位。具体如图1所示。

就像门体效果的实现一样,在Direct X技术的帮助下,可以自由地实现各种需要的效果,如:文字滚动、淡入淡出等等。

4 结语

本文提出的站台监控器界面设计技术,采用将Direct X技术嵌入到MFC框架的方法,既利用了MFC框架开发快速高效稳定的特点,又发挥了Direct X技术在图形化处理上的优势。在使用现有的MFC控件高效开发子界面的同时,又可以使用Direct X技术在主界面上自由地实现各种图形效果(如动画、淡入淡出等)使界面更加丰富。本文论述的界面设计技术已在实际的站台监控器界面程序中得到应用;界面程序在当前流行的电脑配置上运行,秒帧率(FPS)在95以上,是设计站台监控器界面的优势技术之一。

参考文献

[1] 北京城建设计研究总院.GB50157-2003地铁设计规范[S].北京:中国计划出版社,2003.

[2] 中华人民共和国住房和城乡建设部.CJ/T236-2006 城市轨道交通站台屏蔽门[S].北京:中国建筑工业出版社,2006.

[3] LUNA Frank D.DirectX 9.0 3D游戏开发编程基础[M].北京:清华大学出版社,2007.

[4] 侯俊杰.深入浅出MFC[M].武汉:华中科技大学出版社,2001.

[5] SHERROD Allen.DirectX游戏开发终极指南[M].北京:清华大学出版社,2008.

[6] Microsoft. MSDN library [DB/OL]. [2012-12-13]. http://msdn.microsoft.com/en-us/library.

[7] JEFFREY R,CHRISTOPHE N.Windows核心编程[M].北京:清华大学出版社,2008.

[8] 徐璇,姜明新,黄静,等.基于MFC的工程软件界面设计[J].电子设计工程,2011(21):11-13.

[9] 王珊珊,宋亮.矿井下通讯控制系统的人机接口模块的设计[J].电子设计工程,2011(4):186-189.

【DirectX】推荐阅读:

上一篇:重复测量下一篇:老师对我说

本站热搜

    相关推荐