原文链接 http://blog.csdn.net/stevetan81/article/details/1745062
终于,在前3篇文章里面聊完了基本的空间几何概念,现在可以说到实际的东西了。
一直以来,都希望用最浅显易懂的语言,把我对3D的一些了解记录下来,作为一个系列的科普文章,供大家消遣时看看。
大约十年以前,我拥有了第一台电脑,不久见识到了3D游戏的魅力。听说了OpenGL,再后来又听说了微软的DirectX 3D(简称 D3D)。早期的游戏对比来看,基于OpenGL的游戏画面效果似乎要比D3D略好一些,不过在微软在windows平台给OpenGL穿小鞋之后,OpenGL逐渐被D3D所超越。到今天,D3D的效果似乎已经略优于OpenGL了。
那么,到底什么是OpenGL和D3D呢?
这就要从商业、技术、计算机发展史等角度来看了。
当年ID soft的卡马克他们,发明了游戏引擎这个概念之后,人们开始用引擎来开发大量的游戏,当游戏的画面拟真度越来越高时,仅仅靠CPU来进行图形图像处理已经不能满足游戏的需要了。于是,人们开始尝试用硬件加速卡来协助CPU进行3D图像处理,此举在技术上和商业上都大获成功。早期比较出名的比如 Voodoo等。
于是,大量的加速卡及GPU(Graphic Processing Unit)设计公司开始迅速推出自己的设计,如 ATI(刚被AMD收购),NVidia,PowerVR(市场萎缩,转向嵌入式系统的3D加速单元,参考PowerVR MBX及OpenGL ES)等开始展露头角。
问题随之出现:每家公司可能都有自己的设计方案,那么游戏和3D应用程序开发者所设计开发出来的软件就很难在不同的厂商之间的加速卡上运行,很难很好的使用这些加速卡的加速功能。也就是说,这类应用程序的移植性将会降低。
要解决移植性的问题,可以通过将加速卡功能抽象出来,统一定义接口的形式来实现。于是,人们采用了典型的分层模式(参阅:设计模式),将一套应用程序分为3个层次:
应用程序层 -> 硬件抽象层 -> 硬件层
其中,应用层 就是游戏和应用软件开发人员的开发主体,他们调用统一的加速卡API来进行上层开发,而不用考虑移植性问题;
硬件抽象层 则抽象出硬件的加速功能,进行有利于应用层开发的封装,并向应用层开放API;
硬件层 将硬件驱动提供给抽象层,以实现抽象层加速功能的有效性。
这个结构有效的将游戏和应用程序 与 硬件加速卡隔离开,这就很好的提升了程序的移植能力。并且,还有一个好处就是,开发人员的知识复用率得到提高,从而降低了这类软件的开发门槛。
于是,众多的加速卡厂家就联合起来,形成一个组织,共同制定出了这个硬件抽象层的接口标准,这就是OpenGL。
而出于同样的目的,微软也定义了一套平行的类似于OpenGL的接口集合,就叫做 Direct 3D。
这就是OpenGL和D3D的起源。
不同的是,OpenGL只包含了3D加速接口,而DirectX除了D3D之外,还包含了声音接口Direct Sound,然后还有输入输出设备的接口,统称为DirectX。
不论OpenGL还是D3D,他们的工作流程其实是大同小异的。
后续均以D3D为例,进行讨论。
3D加速卡的主要功能就是协助CPU,负责将内存中的矢量图像数据(顶点集合)进行变换、光照计算、裁剪等操作,最后经过光栅化将图像呈现给人眼。这个过程就叫做渲染,D3D把整个渲染分为9个步骤,9个步骤的组合,就叫做流水线,或者叫 管线 (参阅 设计模式 之 流水线模式)。
D3D的渲染管线(Rendering Pipeline):
局部坐标变换 -> 世界坐标变换 ->观察坐标变换->背面消除->光照->裁剪->投影->视口计算->光栅化
(这9个环节在后续文章中会逐一介绍)
固定管线 和 可编程管线都要经过这9个步骤。
首先介绍 可编程管线。顾名思义,就是说管线中的某些环节是可以被控制的。人们可以通过对GPU中的着色器进行编程的方式,来控制、管理加速卡的渲染效果。着色器分为 顶点着色器和像素着色器。 顶点着色器是在进行 坐标变换 和 光照计算时工作,像素着色器是在光栅化环节工作。人们对着色器进行自定义编程时,这个流水线就叫做 可编程管线。
同时,D3D还提供默认的着色器程序,当游戏或应用程序完全使用默认着色器程序时,这个流水线就叫做 固定管线。
后续的章节,会首先介绍固定流水线及其各个环节,之后会介绍着色器编程。