第四节 Direct3D立即模式的体系结构

这一部分向我们介绍了立即模式的一些高层次的内容,我们分以下几个部分来讨论:

一.立即模式体系结构综述

  无论使用保留模式还是立即模式,Direct3D程序与图形硬件之间的通信方式是相似的。在与HAL交互作用之前,它们都可以选择是否使用软件策略。因为Direct3DDirectDraw?对象的接口,所以HAL也就被看作是DirectDraw/Direct3DHAL

pic26.gif (6791 bytes)

  Direct3DDirectDraw紧密的结合在一起。DirectDraw表面被用来作为渲染目标(前、后表面)和z-buffersDirect3D COM接口实际上是一个DirectDraw对象的接口。

 

二.立即模式的对象类型

  Direct3D立即模式是由一系列的对象组成的。我们利用这些对象来操纵我们所建立的虚拟的世界,利用这些对象来建立Direct3D程序。

DirectDraw对象

  DirectDraw对象规定了Direct3D的功能性;IDirect3DIDirect3D2IDirect3D3DirectDraw对象的接口。DirectDraw对象可以用来表示显示设备,并且显示设备能够执行Direct3D的许多重要特性,这样Direct3D的功能就与DirectDraw相互联系起来。通过调用DirectDrawCreate函数可以创建一个DirectDraw对象。

  详细内容见“IDirect3D3接口”。

DirectDrawSurface对象

  DirectDrawSurface对象是被作为一个纹理映射来创建的,它包含了Direct3D程序用来作为纹理的那些位图。通过调用IUnknown::QueryInterface方法,并指明IID_IDirect3DTexture2参考标识符,可以得到对应于表面的IDirect3DTexture2接口。

  详细内容见“纹理”。

Direct3Ddevice对象

  Direct3Ddevice对象用来封装(encapsulate)和存储(store)立即模式程序的渲染状态(rendering  state);它可以被看作Direct3D的渲染目标。在DirectX 5之前,Direct3D设备是DirectDrawSurface对象的接口。DirectX 5引入了一个新的设备对象模型(device-object model),从而使得Direct3Ddevice对象完全从DirectDraw表面中分离出来。这个新的对象支持IDirect3DDevice3接口。

  通过调用IDirect3D3::CreateDevice方法可以创建一个Direct3Ddevice对象和得到一个IDirect3DDevice3接口。(注意:不能通过调用QueryInterface来得到IDirect3DDevice3)如果需要的话,可以通过调用IDirect3DDevice3::QueryInterface方法来得到一个IDirect3Ddevice接口。

  详细内容见“Direct3D设备”。

Direct3Dmaterial对象

  Direct3Dmaterial对象描述了三维场景中的一个可见元的照明属性(illumination properties),包括如何处理光线和是否使用纹理。通过调用IDirect3D3::CreateMaterial方法可以创建一个Direct3Dmaterial对象。可以使用IDirect3DMaterial3接口来获得和设置材质以及得到材质句柄(material handles)。

  详细内容见“材质

Direct3Dviewport对象

  Direct3Dviewport对象定义了一个用来投影三维场景的矩形区。调用IDirect3D3::CreateViewport方法可以创建一个IDirect3DViewport3接口。

  详细内容见“视口和裁剪”。

Direct3Dlight对象

  Direct3Dlight对象用来描述程序中灯光的特征。使用IDirect3Dlight接口可以获得和设置灯光。通过调用IDirect3D3::CreateLight来创建IDirect3Dlight接口。

  详细内容见“灯光”。

Direct3DvertexBuffer对象

  Direct3DvertexBuffer对象是一个内存缓冲区,它用来存放顶点的信息,这些顶点用IDirect3DDevice3接口提供的vertex-buffer渲染方法进行渲染。顶点缓冲(vertex buffers)不能和执行缓冲(execute buffers)相混淆。顶点缓冲只包含了顶点的数据,这些顶点由Direct3Ddevice对象来处理;同时,它还提供了可以在渲染中用来提高性能的一些特征。

  详细内容见“顶点缓冲Vertex Buffers”。

Direct3DexecuteBuffer对象

  Direct3DexecuteBuffer对象是一个填充了顶点以及对顶点进行操纵的指令的缓冲区。在DirectX 5之前,立即模式程序仅仅使用Direct3DexecuteBuffer对象来进行设计。DirectX 5中出现的DrawPrimitive方法,使得大多数的程序不再需要执行缓冲才能运行。详细内容见“执行缓冲Execute Buffers”。

三.立即模式COM接口

Direct3D立即模式API包括以下一些COM接口:

IDirect3D3

根接口,可以得到其它的接口。

IDirect3DDevice

执行缓冲程序的3D设备。

IDirect3DDevice3

DrawPrimitive程序的三维设备。

IDirect3DLight

对光线进行操作的接口。

IDirect3DMaterial3

表面材质接口。

IDirect3DTexture2

纹理映射接口。

IDirect3DVertexBuffer

对顶点缓冲进行操作的接口。

IDirect3DViewport3

定义视口特性的接口。

IDirect3DExecuteBuffer

对执行缓冲进行操作的接口。

  对于先前的DirectX版本中的接口,DirectX 6.0都提供支持。

 

四.DrawPrimitive方法和执行缓冲

  DirectX 5中介绍了一种全新的使用Direct3D立即模式的方法。以前,我们必须通过填充和运行执行缓冲来完成各种任务。而现在,我们可以使用DrawPrimitive方法,它允许直接来绘制图元。

  IDirect3Ddevice接口提供对执行缓冲的支持。IDirect3DDevice3接口则提供对DrawPrimitive方法的支持。不要考虑它们的名字,IDirect3DDevice3接口并不是IDirect3Ddevice接口的一种COM迭代(iteration)。尽管在接口功能上有一定的重叠,但实际上它们是独立的来执行的。这就意味着,不能通过调用IDirect3DDevice::QueryInterface来得到一个IDirect3DDevice3接口,而必须调用IDirect3D3::CreateDevice方法才能够达到目的。

  要了解更多有关DrawPrimitive方法的内容,请看“渲染”部分。

  要了解更多有关执行缓冲操作的内容,请看“使用执行缓冲”部分。

  要了解更多有关设备对象(device object)的内容,请看“Direct3D设备”部分。

 

 

上一页 | 目录 | 下一页