第四节
Direct3D立即模式的体系结构这一部分向我们介绍了立即模式的一些高层次的内容,我们分以下几个部分来讨论:
(Architectural Overview of Immediate Mode) 立即模式的对象类型(Immediate Mode Object Types) 立即模式的COM接口(Immediate Mode COM Interfaces)无论使用保留模式还是立即模式,
Direct3D程序与图形硬件之间的通信方式是相似的。在与HAL交互作用之前,它们都可以选择是否使用软件策略。因为Direct3D是DirectDraw?对象的接口,所以HAL也就被看作是DirectDraw/Direct3D的HAL。 Direct3D与DirectDraw紧密的结合在一起。DirectDraw表面被用来作为渲染目标(前、后表面)和z-buffers。Direct3D COM接口实际上是一个DirectDraw对象的接口。 Direct3D立即模式是由一系列的对象组成的。我们利用这些对象来操纵我们所建立的虚拟的世界,利用这些对象来建立Direct3D程序。DirectDraw
对象 DirectDraw对象规定了Direct3D的功能性;IDirect3D,IDirect3D2和IDirect3D3是DirectDraw对象的接口。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设备”部分。