由
微软公司所制定的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个属性:
Pipeline
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 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
Direct3D 10.1
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 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来渲染桌面。
示例
// A 3-vertex polygon definition
D3DLVERTEX 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。