更新时间:2023-12-17 11:42
由微软公司所制定的3D规格界面,与Windows 95和Windows NT操作系统兼容性好,可绕过图形显示接口(GDI)直接进行支持该API的各种硬件的底层操作,大大提高了游戏的运行速度。
Direct 3D是基于微软的通用对象模式COM(Common Object Mode)的3D图形API。它是由微软(Microsoft)一手树立的3D API规范,微软公司拥有该库版权,它所有的语法定义包含在微软提供的程序开发组件的帮助文件、源代码中。Direct3D是微软公司DirectX SDK集成开发包中的重要部分,适合多媒体、娱乐、即时3D动画等广泛和实用的3D图形计算。自1996年发布以来,Direct3D以其良好的硬件兼容性和友好的编程方式很快得到了广泛的认可,现在几乎所有的具有3D图形加速的主流显示卡都对Direct3D提供良好的支持。但它也有缺陷,由于是以COM接口形式提供的,所以较为复杂,稳定性差,另外,目前只在Windows平台上可用。★
Direct3D(简称:D3D)是微软公司在Microsoft Windows操作系统上所开发的一套3D绘图编程接口,是DirectX的一部分,目前广为各家显示卡所支援。与OpenGL同为电脑绘图软体和电脑游戏最常使用的两套绘图编程接口之一。
Direct3D的抽象概念包括:devices, swap chains和resources。
有4种device type,D3DDEVTYPE定义了设备类型。
Device
每一个设备至少要有一个swap chain.一个swap chain可用来产生一个或多个back buffer surfaces。渲染目标(render target)也是back buffer surface。back buffer是属于渲染(render)的部份。所有的back buffer都是合理的render target,但是并非所有render target都是back buffer。surface是一种资源,包含一个矩形集合的像素数据,如color, alpha, depth/stencil。
资源有4个属性:
Graphics pipeline process
Direct3D 10 API定义了vertices, textures, buffers,以及state组群转换到屏幕上的流程。这样的流程被描述成rendering pipeline有着许多不同的stages. The different stages of the Direct3D 10 pipelineare:
Direct3D有两种display modes:
1992年,Servan Keondjian开创RenderMorphics公司,成立了一个Reality Lab实验室,专事3D图形技术及API技术研究。有两种版本的API被发布。1995年2月微软买下RenderMorphics,由Keondjian在Windows 95上开发3D图形引擎,主持Direct3D项目的开发。
Window 95推出之时,微软一口气发表了DirectX 1.0、DirectX 2.0和DirectX 3.0。DirectX 1.0推出时,只包括DirectDraw、DirectPlay、DirectInput、DirectSound四部分,DirectX 2.0内附了Direct 3D,但功能阳春,无法与OpenGL、3dfx等API函数相提并论。1996年9月发布的Direct 3.0被认为是DirectX的第一套完整版本。不久,DirectX 3.0更新3.0a、3.0b,版号从4.04.00.0068增加到了“4.04.00.0069”,仅是附加了一个被称为Direct3D的组件,这正是Keondjian的杰作。当时的Direct3D有两种模式,一是Retain模式,另一个是Immediate模式,皆以COM建构而成。1996年Westwood工作室发布以DirectX开发的即时战略游戏《红色警戒》,大卖1200万套。
DirectX 4.0并未推出就有DirectX 5.0。1997年6月推出DirectX 5.0,加入DrawPrimitive API,加入了对MMX的支持,不久微软又推出支持D3D加速卡的DirectX 5.0a版和5.1版、5.2版。
Direct3D 6.0,1998年秋微软推出,引进多重贴图(multitxture)以及stencil buffer
Direct3D 7.0引进硬件座标转换以及光影计算(Hardware Transform and Lighting),并支持.dds档。
Direct3D 8.0引进了可编程管道(Programable Function Pipeline)的概念,Direct3D在8.0版以前只能工作在固定管道(Fixed Function Pipe-line)的模式下。2001年微软正式发表的Direct3D 8.0支持处理顶点的Vertex Shader,以及处理像素的Pixel Shader。使Direct3D的技术正式超越劲敌OpenGL。DirectX 8中的着色器是用低级着色器语言(Low Level Shading Language)编写的。
Direct3D 9.0使用HLSL(全称High Level Shading Language)编写Vertex Shader和Pixel Shader,有助于着色器的编写和所产生代码的效率,并且大幅地缩短设计时间。Windows Vista推出DirectX的两种新类型:Direct3D 9Ex和Direct3D 10。Direct3D 9Ex是DirectX 9的扩充版,除了Direct3D 9外,还增加了Windows Vista driver部分新功能的应用程序而设计。Direct3D 9Ex和Direct3D 10均构建于WDDM之上。只有通过WDDM才能在Vista上使用Direct3D。
Direct3D 10相对Direct3D 9大量代码重新编写,Direct3D 10着眼在高级绘图程序,所有render都要写shader。但本质上功能并没有太大改变,只能算是对旧XP时代的问题重新更正,提供更高的可编程化及资源运用,以适合Vista使用。
Direct3D 10新特色:
新的resource type: constant buffer、texture array。Texture array可容许最多512个Texture。
resource引进view的概念
guaranteed feature set
GPU呈现多任务(multitasking)
Direct3D 10.1是Direct3D 10.0的小型的更新,2007年8月微软发布Direct3D 10.1以及Shader Model 4.1的测试版本。Direct3D 10.1规定几个更多图像质量标准为图表供营商,给予开发商对图像质量(image quality)的更多控制。XAudio 2将取代DirectSound,成为最新的跨平台音频API。
Direct3D 11架构于Direct3D 10的基础之上,但相较于Direct3D 10只支持Vista操作系统, Direct3D 11更可以支持Windows 7。Direct3D 11新增以下的功能:
其他还有面向对象化的Shader Model 5等功能。之前DirectX 10还是单线程,文件访问与绘图指令共用同一个线程,容易造成画面迟缓的现象,与DirectX 10相比,Direct3D 11有了更好的解决方案。
DirectX 11的pipeline新增Hull Shader、Tessellator、Domain Shader来实现tessellation, 可以快速让成像3D的小三角型快速增加。至于Computer Shader则是GPGPU的实现,以GPU的平行处理能力与浮点运算能力来实现CPU的运算,能够同时支持ATI以及Nvidia的显卡,不受绘图流程的限制。DirectX11还支持Intel的支持Ray Tracing(光线跟踪)与Rasterization(光栅化)技术,使3D效果更真实,更加逼真。
以Direct3D开发3D图形程序,可以采用COM inteface,也可以采用.NET Framework的方式,WPF会使用Direct3D 9与GPU。Direct3D 11技术是DX10.1的超集,支持DX11.0、DX10.1/10.0、DX9.3/9.2/9.1等。
Windows 7Desktop Windows Manager将会支持Direct3D 10.1 API。可将显卡带宽的占用率降低大约50%。DirectX 11可向下兼容于DirectX 10的显卡,同时也能够在Windows 7与Vista上运行。
Direct3D 与 Windows Vista
Vista 引入了 DirectX 的两种新类型:Direct3D 9Ex 和 Direct3D 10。DirectX 10仅适用于Windows Vista,针对 Windows Vista 进行了全新构建,构建于Vista 显示器驱动程序模型 (WDDM) 之上,并引入新的硬件模式、绘图管线和渲染特性,让开发人员更接近硬件。一些由于游戏需要SM 2.0,Vista 将使用SM 2.0来渲染桌面。
用Direct3D 9画三角形:
// A 3-vertex polygon definitionD3DLVERTEX v[3];// Vertex establishedv[0]=D3DLVERTEX(D3DVECTOR(0.f,5.f,10.f),0x00FF0000,0,0,0);// Vertex establishedv[1]=D3DLVERTEX(D3DVECTOR(0.f,5.f,10.f),0x0000FF00,0,0,0);// Vertex establishedv[2]=D3DLVERTEX(D3DVECTOR(0.f,5.f,10.f),0x000000FF,0,0,0);// Function call to draw the trianglepDevice->DrawPrimitive(D3DPT_TRIANGLELIST, D3DFVF_LVERTEX, v,3,0);
用Direct3D 11画三角形:
structVertex{floatx, y, z;D3DCOLOR color;};Vertex triangle={{0.f,5.f,10.f,0x00FF0000},{0.f,5.f,10.f,0x0000FF00},{0.f,5.f,10.f,0x000000FF}};// set Flexible Vertex FormatpDevice->SetFVF(D3DFVF_XYZ|D3DFVF_DIFFUSE);// Draw - UP stands for 'user pointer', that is data// that is provided through a pointer and not through bufferspDevice->DrawPrimitiveUP(D3DPT_TRIANGLELIST,1, triangle,sizeof(Vertex));
1995年2月,微软收购了英国的Rendermorphics公司,将RealityLab 2.0技术发展成Direct3D标准,并整合到Microsoft Windows中,Direct3D在DirectX 3.0开始出现。后来在DirectX 8.0发表时与DirectDraw编程接口合并并改名为DirectX Graphics。