每日一句: Build your own dreams, or someone else will hire you to build theirs. 打造自己的梦想,否则你就会被雇用去打造别人的梦想。 跟读

汉语站

2017年10月23日 星期一

丁酉(鸡)年九月初四

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 - 概述 [回目录]

它可让以windows为平台的游戏或多媒体程序获得更高的执行效率,加强3d图形和声音效果,并提供设计人员一个共同的硬件驱动标准,让游戏开发者不必为每一品牌的硬件来写不同的驱动程序,也降低用户安装及设置硬件的复杂度。这样说是不是有点不太明白,其实从字面意义上说,Direct就是直接的意思,而后边的X则代表了很多的意思,从这一点上我们就可以看出DirectX的出现就是为了为众多软件提供直接服务的。

举个例子吧,骨灰级玩家(玩游戏比较长的)以前在DOS下玩游戏时,可不像我们现在,安装上就可以玩了,他们往往首先要先设置声卡的品牌和型号,然后还要设置IRQ(中断)、I/O(输入于输出)、DMA(存取模式),如果哪项设置的不对,那么游戏声音就发不出来。这部分的设置不仅让玩家伤透脑筋,而且对游戏开发者来说就更头痛了,因为为了让游戏能够在众多电脑中正确运行,开发者必须在游戏制作之初,便需要把市面上所有声卡硬件数据都收集过来,然后根据不同的 API(应用编程接口)来写不同的驱动程序,这对于游戏制作公司来说,是很难完成的,所以说在当时多媒体游戏很少。微软正是看到了这个问题,为众厂家推出了一个共同的应用程序接口——DirectX,只要这个游戏是依照Directx来开发的,不管你是什么显卡、声卡、统统都能玩,而且还能发挥更佳的效果。当然,前提是你的显卡、声卡的驱动程序也必须支持DirectX才行。

DIRECTX - 组成 [回目录]

DirectX是由很多API组成的,按照性质分类,可以分为四大部分,显示部分、声音部分、输入部分和网络部分。

显示部分担任图形处理的关键,分为DirectDraw(DDraw)和Direct3D(D3D),前者主要负责2D图像加速。它包括很多方面:我们播放mpg、DVD电影、看图、玩小游戏等等都是用的DDraw,你可以把它理解成所有划线的部分都是用的DDraw。后者则主要负责3D效果的显示,比如CS中的场景和人物、FIFA中的人物等等,都是使用了DirectX的Direct3D。

声音部分中最主要的API是DirectSound,除了播放声音和处理混音之外,还加强了3d音效,并提供了录音功能。我们前面所举的声卡兼容的例子,就是利用了DirectSound来解决的。

输入部分DirectInput可以支持很多的游戏输入设备,它能够让这些设备充分发挥最佳状态和全部功能。除了键盘鼠标之外还可以连接手柄、摇杆、模拟器等。

网络部分DirectPlay主要就是为了具有网络功能游戏而开发的,提供了多种连接方式,TPC/IPIPXModem,串口等等,让玩家可以用各种连网方式来进行对战,此外也提供网络对话功能及保密措施。

DIRECTX - 发展历程 [回目录]

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.0

DirectX 6.0推出时,其最大的竞争对手之一Glide,已逐步走向了没落,而DirectX则得到了大多数厂商的认可。DirectX 6.0中加入了双线性过滤、三线性过滤等优化3D图像质量的技术,游戏中的3D技术逐渐走入成熟阶段。

DirectX 7.0

DirectX 7.0最大的特色就是支持T&L,中文名称是“坐标转换和光源”。3D游戏中的任何一个物体都有一个坐标,当此物体运动时,它的坐标发生变化,这指的就是坐标转换;3D游戏中除了场景+物体还需要灯光,没有灯光就没有3D物体的表现,无论是实时3D游戏还是3D影像渲染,加上灯光的3D渲染是最消耗资源的。虽然OpenGL中已有相关技术,但此前从未在民用级硬件中出现。在T&L问世之前,位置转换和灯光都需要CPU来计算,CPU速度越快,游戏表现越流畅。使用了T&L功能后,这两种效果的计算用显示卡的GPU来计算,这样就可以把CPU从繁忙的劳动中解脱出来。换句话说,拥有T&L显示卡,使用DirectX 7.0,即使没有高速的CPU,同样能流畅的跑3D游戏。

DirectX 8.0

DirectX 8.0的推出引发了一场显卡革命,它首次引入了“像素渲染”概念,同时具备像素渲染引擎(Pixel Shader)与顶点渲染引擎(Vertex Shader),反映在特效上就是动态光影效果。同硬件T&L仅仅实现的固定光影转换相比,VS和PS单元的灵活性更大,它使GPU真正成为了可编程的处理器。这意味着程序员可通过它们实现3D场景构建的难度大大降低。通过VS和PS的渲染,可以很容易的宁造出真实的水面动态波纹光影效果。此时DirectX的权威地位终于建成。

DirectX 9.0

2002年底,微软发布DirectX9.0。DirectX 9中PS单元的渲染精度已达到浮点精度,传统的硬件T&L单元也被取消。全新的VertexShader(顶点着色引擎)编程将比以前复杂得多,新的VertexShader标准增加了流程控制,更多的常量,每个程序的着色指令增加到了1024条。

PS 2.0具备完全可编程的架构,能对纹理效果即时演算、动态纹理贴图,还不占用显存,理论上对材质贴图的分辨率的精度提高无限多;另外PS1.4只能支持28个硬件指令,同时操作6个材质,而PS2.0却可以支持160个硬件指令,同时操作16个材质数量,新的高精度浮点数据规格可以使用多重纹理贴图,可操作的指令数可以任意长,电影级别的显示效果轻而易举的实现。

VS 2.0通过增加Vertex程序的灵活性,显著的提高了老版本(DirectX8)的VS性能,新的控制指令,可以用通用的程序代替以前专用的单独着色程序,效率提高许多倍;增加循环操作指令,减少工作时间,提高处理效率;扩展着色指令个数,从128个提升到256个。

增加对浮点数据的处理功能,以前只能对整数进行处理,这样提高渲染精度,使最终处理的色彩格式达到电影级别。突破了以前限制PC图形图象质量在数学上的精度障碍,它的每条渲染流水线都升级为128位浮点颜色,让游戏程序设计师们更容易更轻松的创造出更漂亮的效果,让程序员编程更容易。

DirectX 9.0c

与过去的DirectX 9.0b和Shader Model 2.0相比较,DirectX 9.0c最大的改进,便是引入了对Shader Model 3.0(包括Pixel Shader 3.0 和Vertex Shader 3.0两个着色语言规范)的全面支持。举例来说,DirectX 9.0b的Shader Model 2.0所支持的Vertex Shader最大指令数仅为256个,Pixel Shader最大指令数更是只有96个。而在最新的Shader Model 3.0中,Vertex Shader和Pixel Shader的最大指令数都大幅上升至65535个,全新的动态程序流控制、 位移贴图、多渲染目标(MRT)、次表面散射 Subsurface scattering、柔和阴影 Soft shadows、环境和地面阴影 Environmental and ground shadows、全局照明 (Global illumination)等新技术特性,使得GeForce 6、GeForce7系列以及Radeon X1000系列立刻为新一代游戏以及具备无比真实感、幻想般的复杂的数字世界和逼真的角色在影视品质的环境中活动提供强大动力。

因此DirectX 9.0c和Shader Model 3.0标准的推出,可以说是DirectX发展历程中的重要转折点。在DirectX 9.0c中,Shader Model 3.0除了取消指令数限制和加入位移贴图等新特性之外,更多的特性都是在解决游戏的执行效率和品质上下功夫,Shader Model 3.0诞生之后,人们对待游戏的态度也开始从过去单纯地追求速度,转变到游戏画质和运行速度两者兼顾。因此Shader Model 3.0对游戏产业的影响可谓深远。

DIRECTX - Win 2003中打开DirectX加速 [回目录]

刚刚安装了Windows 2003,但是现在发现很多3D游戏都不能运行,只有一些传统2D平面游戏还能勉强运行,而且速度很慢。感觉上Windows 2003在运行PhotoShop时很快,但是为何不能运行3D游戏?

这并不是因为Windows 2003不支持3D游戏,而是系统设置的问题。首先请确保以正确的方式安装好显卡驱动,然后就要打开DirectX加速。DirectX加速是3D游戏最基本的需要,然而“为了”使Windows Server 2003更为单一地面向服务器平台应用,微软居然默认将其加速功能关闭。即便是在安装了最新的DirectX 9.0之后也不会自动打开加速功能,而必须手动设置。在“开始”→“运行”对话框中输入“dxdiag”以打开DirectX诊断工具。随后在显示一栏中将DirectDraw、Direct3D、AGP纹理加速功能启用。如此一来,Windows Server 2003便能运行各种3D游戏。除此以外,Windows Server 2003还默认关闭了硬件加速,你可以在显示属性的高级菜单中将其设置为完全加速。

DIRECTX - 用Delphi开发DirectX控件 [回目录]

Microsoft推出的DirectX使我们在Windows9x下开发游戏软件便利了许多。一般在介绍DirectX 的资料里都讲的是如何用VC++来开发,其实inprise公司的语言也可以用来开发基于DirectX的游戏软件。我们这里用的是DirectX控件,它有Delphi3和Delphi4不同的版本。在处你可以download,是由一个日本人写的,而且,这套控件是完全免费的,你可以自由使用。在这套控件里有DirectX的各种范例程序,我们今天来讨论一下其中基于DirectX的网络通信程序如何开发。

想必大家都看到过那些硝烟纷飞的即时战略游戏,这些游戏中一个很诱人的买点就是可以几个人同时加入战斗,各自扮演一方高手,杀它个你死我活。那么这些即时战略游戏中的网络对战部分是怎么写的呢?其实在Microsoft的DirectX中专门有一类API就是负责网络通信的,不管是基于IPX,还是TCP/IP,或者是Modem,它都可以圆满解决。而作为程序设计的我们一般来说不用操心这些连接方式不同而带来的代码的不同,我们可以一视同仁,只要写一套统一的代码就可以了,各种连接方式的细节问题我们就交给DirectX去处理了。

下面我们具体分析一下一个chat聊天程序的构造。运行samplesnetworkchat.dpr,我们就看到了一个最简单的聊天程序了。首先程序会让你选择连接的方式:IPX连接、Internet TCP/IP连接、调制解调器连接和串行连接;选择好连接方式后(下面假设你是选择用TCP/IP方式连接),你可以选择是创建一个新游戏还是进入一个已经存在的游戏(当然现在这里的游戏就是指一个聊天程序!);如果你是选择建立一个新游戏,那么接下来要你输入游戏的名字和你的名字,然后聊天就开始了;如果你是选择加入一个已经存在的游戏的话,那么你可以通过输入指定的IP地址来连接或者索性让程序去搜索有哪些已经存在的游戏名字。如果你在连接方式中选择的是调制解调器连接的话,就稍微复杂一些,需要选择调制解调器,并准备拨号和应答等。有没有发现这些连接的方式和过程和我们通常在游戏中看到的很相似?由于这些关于连接的对话框都是由DirectX提供的,因而会有一点语言上的问题。如果你安装的是DirectX的中文版本的话,那么你看见的将全部是中文。(顺便说一句,这套Delphi 控件所支持的DirectX必须在5.0版本以上。)
这个程序本身并不复杂,下面是其主要的几个过程,我们已经加上了较为详细的注释:

  //增加游戏者
  procedure TMainForm.DXPlay1AddPlayer(Sender: TObject; Player: TDXPlayPlayer);
  begin
   Memo1.Lines.Add(Format(' %s entered a room.', [Player.Name]));
  end;


  //游戏者离开
  procedure TMainForm.DXPlay1DeletePlayer(Sender: TObject;Player: TDXPlayPlayer);
  begin
   Memo1.Lines.Add(Format(' %s left a room.', [Player.Name]));
  end;

  
  //DirectPlay打开
  procedure TMainForm.DXPlay1Open(Sender: TObject);
  var
   i: Integer;
  begin
   for i:=0 to DXPlay1.Players.Count-1 do
if DXPlay1.Players[i].RemotePlayer then
Memo1.Lines.Add(Format(' %s is entering a room.', [DXPlay1.Players[i].Name]));
end;

 procedure TMainForm.FormDestroy(Sender: TObject);
  begin
   DXPlay1.Close;
  end;

  //窗口创建执行事件
  procedure TMainForm.FormCreate(Sender: TObject);
  begin
   try
   //DirectPlay 打开
DXPlay1.Open;
   except
   //防错处理
on E: Exception do
begin
Application.ShowMainForm := False;
Application.HandleException(E);
Application.Terminate;
end;
   end;

   //显示有关信息在窗口的caption
   MainForm.Caption := Format('%s : %s', [DXPlay1.ProviderName, DXPlay1.SessionName]);
  end;

  //当有消息发送时
  procedure TMainForm.DXPlay1Message(Sender: TObject; Player: TDXPlayPlayer; Data: Pointer;DataSize: Integer);
  var
   s: string;
  begin
   case DXPlayMessageType(Data) of
DXCHAT_MESSAGE:
begin
if TDXChatMessage(Data^).Len %s', [Player.Name, s]));
end;
  end;
  end;

  //发送按钮
  procedure TMainForm.Button1Click(Sender: TObject);
  var
   Msg: ^TDXChatMessage;
   MsgSize: Integer;
  begin
   MsgSize := SizeOf(TDXChatMessage)+Length(Edit1.Text);
   GetMem(Msg, MsgSize);
   try
Msg.dwType := DXCHAT_MESSAGE;
Msg.Len := Length(Edit1.Text);
StrLCopy(@Msg^.c, PChar(Edit1.Text), Length(Edit1.Text));

//发送消息到所有的人
DXPlay1.SendMessage(DPID_ALLPLAYERS, Msg, MsgSize);

//发送消息到自己
DXPlay1.SendMessage(DXPlay1.LocalPlayer.ID, Msg, MsgSize);
Edit1.Text := '';
   finally
   FreeMem(Msg);
   end;
  end;

TDXPlay控件是写这类程序的关键,其属性、事件和方法并不多。GUID属性用来程序的自我识别,具有相同GUID的程序互相之间就能识别,所以你可以看到GUID是一个很长的数字;Open方法用来打开通讯端口,Close用来关闭通讯端口;SendMessage方法是用来发送消息到所有的游戏者,当你的程序收到消息的时候,会产生OnMessage 事件。

这个程序的代码应该是相当简练了,但是却完成了点对点的多点聊天功能。如果你在自己的程序里约定好一套规则,那么你的程序也就具备了互相的通信能力,是不是感觉很简单?可以说,利用DirectX来写这方面的通信程序是最佳的选择,你可以对网络的知识完全不懂,因为这一切已经由Microsoft花费了大量人力物力进行优化的代码来完成了。如果说有什么缺点,就是要求用户的电脑上一定要安装上DirectX,这在现在win98越来越普及的情况下,并不是一件难事。再说,Microsoft的DirectX也是一套完全免费的软件。利用DirectX优秀的性能加上功能强大的 Delphi语言,相信你一定能写出一套优秀的游戏软件(当然拥有设计良好的对战功能)。

DIRECTX - 在Delphi中使用DirectX [回目录]

Delphi作为一种方便的可视化程序设计语言,一 直非常受大家喜爱。但它在图形处理、3D表现等方面 不很让人满意。如果说你要开发一个Windows95下的 3D游戏,你会用什么工具呢?DirectX!不少人会不加 思索地答道。然而接触过DirectX的朋友们都知道它 内部的结构复杂,一般来说结合VC开发是一个理想 的组合。而要在Delphi中利用DirectX SDK真是难上 加难。但现在一切都好啦,有了本文介绍的DelphiX 组件,你终于可以用你熟悉的Delphi来开发漂亮的图 形程序了。
DelphiX是由日本人Hiroyuki Hori开发的使Di rectX5.0在Delphi中更容易使用的一套控件,从网上 下载时叫DelphiX.zip,837KB。解开后在bin目录下 运行install_for?(根据你的Delphi版本号,支持3.0和 4.0),DelphiX会自动将控件安装到你的Delphi中,帮 助文件也自动融合到Delphi的帮助里,真是好用极 了!
DelphiX包括的控件有如下这些:
TDXDraw 最重要的控件,是DirectDraw和Direct3D的基础;
TDXDIB 一个代表DIB图像的控件;
TDXImageList 代表一组 TPicture;
TDX3D Direct3D控件,要与TDXDraw共同使用;
TDXSound DirectSound控件;
TDXWave 一个代表波形Wave的控件;
TDXWaveList 一组Wave;
TDXInput 输入控制控件(操纵键盘和摇杆要靠它);
TDXPlay 通讯控件;
TDXSpriteEngine “精灵”引擎;
TDXTimer 高速时间控件;
TDXPaintbox TDXForm 专为DelphiX优化过的Form。

DirectDraw中重要的对象有:

TDirectDraw对象
DirectDraw应用程序的核心,它是你创建的第一个对象。创建了DirectDraw对 象后,可以在它的基础上创建其它所有相关的对象。 在DelphiX中的TDXdraw.ddraw属性即是一个Tdi rectDraw对象。

TDirectDrawSurface对象
表征了一块内存区 域,在该区域的数据将作为图像显示在屏幕上或移动 到其它表面上。

TDirectDrawPalette对象
表征了一个用于表面 的16色或256色的索引调色板,它包含了一系列描述 同表面相关的RGB颜色索引值。

TDirectDrawClipper对象
帮助你禁止向表面的 某一位置或超出表面的位置块写数据。

TSprite对象
代表了“精灵”,在许多视频游戏都 使用了精灵。从最基本的意义上来讲,一个精灵就是 在屏幕上移动的图像。精灵画在一个表面上,覆盖在 已有的背景上,合成后的图像被送到屏幕上显示出 来,在DelphiX中通过TspriteEngine实现对Tsprite的 控制。

TDirectDrawSurfaceCanvas对象
提供方便的 访问机制,你可以像访问一般Canvas对象一样访问 它。TDXDraw.Surface.Canvas即是这样一个对象。

TdirectDrawDisplay对象
控制着DirectDraw的 显示模式,TdxDraw.display是这样一个对象。
DelphiX基本上严格按照Microsoft DirectX SDK 开发包来将其功能在Delphi中实现出来。所以,如果 你对DirectX SDK比较熟悉的话,你会发现大多数程 序从C移植到Delphi是很容易的事。DelphiX中没有 提供帮助的地方,你可以在DirectX SDK中获得答 案。

下面通过一个简单的例子对如何利用DelphiX编 程作一介绍,只涉及Ddraw二维的一小部分。
unit Unit1;
interface
uses
Windows.Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
DXClass, DXDraws, DIB;
type
TForm1=class(TDXForm)
DXDraw1:TDXDraw;
DXTimer1:TDXTimer;
DXDIB1:TDXDIB;
procedure DXDrawlFinalize(Sender:TObject);
procedure DXDraw1Initialize(Sender:TObject);
procedure DXDraw1RestoreSurfase(Sender:TObject);
procedure DXTimer1Timer(Sendsr:TObject;LagCount:Integer);
procedure FormActivate(Sender:TObject);
private
{Private declarations}
public
{Public declarations}
private
Fsurface:TDirectDrawSurface;
end;
var
Form1:TForm1;
x,y:integer;
implementation
{$R *.DFM}
procedure TForm1.DXDrawlInitialize(Sender:TObject);
begin
FSurface:=TDirectDrawSurface.Create(DXDraw1.DDraw);
{创建抽象图像表面}
end;
procedure TForm1.DXDraw1Finalize(Sender:TObject);
begin
FSurface.Free; FSurface: = nil;
{释放表面}
end;
procedure TForm1.DXDraw1RestoreSurfare(Sender:TObject);
begin
FSurface.LoadfromGraphic(DXDIB1.DIB);{将位图送入抽象表面}
end;
procedure TForm1.DXTimer1Timer(Sendsr.TObject;LagCount integer);
begin
if not DXDraw1.CanDraw then Exit;{在绘制之前检验是否允许}
DXDraw1.Surfaca.Fill(0);
x: = x + 1;
y: = y + 1;
DXDraw1.Surface.Draw(X, Y, FSurface.ClientRect,FSur face, True);
DXDraw1.Flip; {将内存中的表面再将映射入实际显存}
end;
procedure TForm1.FormActivate(Sender:TObject);
begin
X: =0;
y: =0;
end;
end.
首先要在程序开头包含DXClass、DXDraws两个 Unit(TDXtimer、TDXForm在DXClass中定义,TDX Draw在DXDraws中定义)。程序用的Form不要从一 般的TForm派生,而应从TDXForm中派生。在Form 中放入TDXDraw控件和TDXTimer控件,将其inter val值设为0。对DXDraw1控件改变其属性,使其与 Form大小一致。再放人一个TDXDIB控件,在其属性 中的DIB一项调人一个位图,如Windows下的bub bles.bmp。定义一个DirectDraw表面Fsurface,这是一 个抽象内存表面,以后会将它映射到DXDraw对象的 Surface上。在DXDraw的Events一栏中编写OnIni tialize、OnFinalize、OnRestoreSurface三个过程,之后便 可以根据需要对表面进行操纵。
另外,要完成上面程序的功能,还有其他不少办 法。例如利用TDXImageList对象,可以用它的方法 Imagelist.items[N].draw来完成同样功能。
总之,DirectX博大精深,希望本文能为大家掀开 冰山的一角。

词条内容仅供参考,如果您需要解决具体问题
(尤其在法律、医学等领域),建议您咨询相关领域专业人士。

标签: DIRECTX

同义词: Direct x

词条统计

浏览次数 : 7133 次

编辑次数 : 1 次 历史版本

更新时间 : 2009-07-11

双语连环画