图形加速卡技术

转自:http://www.opengpu.org/bbs/forum.php?mod=viewthread&tid=4197

前言:眼泪的多年收藏啊,这是篇相当好的文章。
首先本文非常专业地道,当然,新手朋友们肯定会晕的,我看着都头大…… 不过其讲解的知识非常系统详细。

基本上,显卡的所有基础知识都涵盖了,有兴趣的朋友可以仔细看看、学习一下。眼泪我也同样再复习复习。

另外,这篇虽然是转载,但个人感觉应该是精华的模范(可惜太深奥了点),小星星不是要写精华定义么,给你个参考。
当然了,这篇帖子归入索引就行了,精华就没必要了,毕竟我们还是要提倡适合新手的好文章。

最后,感谢下本文的作者,HeavenPR,原文发表在GZ论坛。


---------------------------

图形加速卡技术论坛:1.入门篇--图形加速之 图形
(发表于GZeasy.com: Jul 20 2003, 04:14 PM)
来了这么久,也对这里的朋友有了一个大概的了解。

恕我罗索一两句,这里的名字是图形加速卡技术论坛,可是情景完全不是这样啊。选购,改卡,甚至游戏也是技术,我倒不说什么,可是n 多人在这里说些完全没有关系的话题,或者让人看了完全摸不着头脑的东西,给我们留下不好的印象。

总的来说论坛里的朋友也有几个对软件,硬件和编成比较在行的人,从他们的一言一行中我们也能察觉出来。可是绝大多数用户,虽说是电脑爱好者,可是可能由于对电脑的各个方面接触不很多,不很广,所以总是来问一些重复的,基本的问题。有的朋友甚至连显卡是干什么用的也不很清楚。鉴于此,我抽了一些时间,来写这篇文章,稍后可能还有什么中级篇,高级篇,xx 级篇(!) 啦等等的推出,主要的目的是给广大的硬件爱好者指点一下迷津,也考验一下我 8 年的电脑知识经验。如果有说的不妥当的地方,大家可以指正出来,我肯定虚心接受。

还有,这篇文章是我自己写出来的,其中的部分可能会参考一些有意义的文献,不过我会标明的。我平时说话,回贴都懒懒散散的,不过这个学术说明之类的东西,我会尽量谨慎用词。在这里呢,我不想把大家带回到古代,从头开始温习电脑的发展史,因为我对电脑发展史,不好意思地说,也学的很差。还有,谢谢大家捧场来看喽!

正题:入门篇 ---- 图形加速图形

首先,我们先来咬文嚼字:图形加速卡。就是用来加速图形处理的一张扩展卡。所谓的图形处理是什么呢?纯文本时代的电脑,那一行一行的命令和文字,不叫图形处理。:-P 图形和文本是电脑输出给人们“看”的两样东西。

一、文本,被遗忘的时代

真正的文本处理呢,很不幸在 DOS 之后已经被完全淘汰了。所以没有什么“文本加速卡”之流的东西,是因为现在的显卡,即使完全没有文本处理的功能,也能在 Windows 下正常的工作。到这里,也许有人要问了:Windows 里的文字,不是“文本”吗?答案是:对你来说,它是。可是对电脑来说,它就不是文本了。Windows 里的文本,也是图形。那些文字是被 Windows “画”出来的。打开控制面板里的“字体”,你看到了什么?种类繁多的字体是吧。这些都不是存放在显卡里的,而是在硬盘上。当 Windows 接收到在窗口上打印一行字的命令的时候,它会调度“画”字程序,从硬盘里读出字体,然后画到屏幕上来。现在就明了了:Windows 的界面是完全基于图形的。所以图形加速卡对于 Windows 来说是十分重要的。好了,现在,让我们忘掉“文本”吧!

二、图形的定义,像素及其他

再来看图形的定义。图形在 电脑里有两种截然不同的定义。第一种叫 光栅图形(Raster Graphics)第二种叫 矢量图形(Vector Graphics)所谓的“光栅图形”,每个电脑玩家都有广泛的接触。你现在打开 Windows 的“画笔”程序,随便画几个圆,几条线,图几块色,然后把你得图放大 8 倍(这个不用我指导你做吧?!) 你看到了什么?是不是由一个一个的小方块组成了你的图形?每一个小方块,被称作一个像素“Pixel”也就是说,你的图形是有小小的像素们组成的。

盯着一个像素,你发现了什么?对了!一个像素只有一种颜色!( #%@#%^@)。而懂一点色彩学的人,都应该知道,光是由 红(Red) 绿(Green) 和 蓝(Blue) 三种基色以任意比例组合而成的。这图形里的一个像素,也是由 红,绿 和 蓝 组成的。在最为广泛的电脑图形之中,每一个原色,由 八个 0 或 1 的二进制数,也就是 8 位组成,也就是每种颜色的表现能力为 2^8 = 256 种,称之为“色阶”。学过统计吗?每个原色 256 种色阶,那么 R/G/B 三种原色的表现能力为多少种颜色?……… 你在翻高中数学书?咳,算了,还是我告诉你吧。要把它们乘起来。结果是 256 x 256 x 256 = …. 16777216 种(2^24)。哇?!这么多?好,让我们用电脑习惯的千进制来吧它分开:16,777,216 = 16M。这就是人们常说的什么 16兆色(就是我们通常看到的24位色)啦,真彩色啦等等。

这里来一点插曲。如果一种染色占 8 位的话,那么 R/G/B 总共占 8 + 8 + 8 = 24 位。可是 24 位对现在的 32 位的电脑系统来说,是一个很不舒服的长度。应为 24 位对于电脑一次处理的 32 位来说,太小,可是一次处理两个 24 位,又超出了 32 位的处理能力。怎么办?只能在 24 位的颜色后面,再补上 8 位的空数据。这样一来,一个像素的颜色将占用 32 位,正好和 32 位系统的处理能力相应。这样处理起来就舒服多了。“空数据?你的意思是说每一个像素要浪费 8 位数据?”答案并不是肯定的。最后的 8 位虽然在图形的显示上没有作用,可是由于这里多了 8 位,人们总要想办法充分利用现有的资源的。所以另一个概念被加入到了像素里:透明度。也就是大家耳渲目染的像素Alpha 。用原本没用的 8 位来保存 Alpha,不错的创意吧。这样,我们就可以根据像素的透明度,来把一个像素和另一个像素混合,做出重叠的效果。这就人传说中的 Alpha 混合 特效 呵呵。挺简单的吧。到这里,我们用比较专业的格式来表达一下最常用的像素:R8G8B8A8。 哇,什么?好,拆开看:R8, G8, B8, A8 也就是 红 8 位,绿 8 位,蓝 8 位,透明度 8 位。用来唬人蛮不错的啊~

光栅图形就介绍到这里的。接下来该另一个英雄登场:矢量图形。别小看了它,现在的 3D 图像基础可是有很大一部分是基于它的。

光栅图形是一个一个的点,而矢量图形是什么呢?其实也是一个一个的点,不过还有数学公式。这样讲:如果说光栅图形是告诉电脑在每个点画什么颜色的话,那么矢量图形就是教给电脑该怎么样画一个图形。比如一个圆。如果用光栅图形来表示,那么就要有一大堆的像素,来描速在圆所在的区域里,每个点的颜色。而用矢量图形来表示:它是一个圆,圆的圆心,圆的半径(可能还有圆的颜色)就这么简单。在电脑画这两张图的时候,做的就是截然不同的工作了。画光栅图的时候,电脑把所有的像素数据读出来,然后原模原样的 Copy 到显示缓存,这样我们就在屏幕上看到这个圆了。而画矢量的圆,完全不同了:首先,电脑要确定圆的圆心,半径,然后找到这个圆将落在屏幕的哪一片区域。这个很重要的一步,叫做 设定(Setup)找到了圆所在的屏幕区域之后,就可以用指定的颜色来填充这个区域了。这一步叫 光栅化(Rasterize)圆所在的区域被填充了出来,我们就自然而然的看到这个圆了。

这个呢,就是电脑图形的初步基础。要牢记 光栅图形,矢量图形的定义,以及矢量图形的画法。笼统地说有两步,就是 设定 和 光栅化。这在以后的 3D 图形知识部分很重要。

好了,一口气写了这么多,我先歇会儿。大家慢慢消化消化啊。还有哪里不对一定要说出来。

-------------------------
图形加速卡技术论坛:2.原理篇--图形加速之 加速

(发表于GZeasy.com: Jul 20 2003, 06:38 PM)

回顾:上一篇,我给大家简单的介绍了一下什么是图形,图形有几种类型,以及它们的画法,大家能记的起来吗?

正题:原理篇 ---- 图形加速加速

很久以前,绘图工作全部是由我们伟大而神圣的 CPU 来完成的,那时候的显卡,就是真正意义上用来“显示东西的卡”。它的工作就是 CPU 处理好的数据到显示器上来。那时候 CPU 的工作可真是辛苦。现在好了,CPU 越来越快,可是做的工作却越来越少了。我先来说说图形加速的几个阶段。2D 图像加速,Windows 加速 和 3D 图像加速。

一、简单死板的 2D 加速

2D 加速,是早就有的产物了。它的作用是显示芯片来代替 CPU,整块整块的移动显存里的数据。比如,你要移动一个窗口,在没有 2D 加速的时代,CPU 所作的工作:1、找到窗口在显存中的地址,2、把一行数据拷贝到目的地址,3、重复 2 直到拷贝完所有的行。完成。这样一来,当窗口很大的时候,CPU 要处理的数据量就会成倍的增长,导致窗口的移动比蜗牛爬还慢…. 想体验一下吗?好,进入设备管理器,把你的显卡驱动删掉,然后重起…. 好好享受啊!呵呵

有了 2D 加速呢,CPU 所做的事,减轻了很多,不过还是要指导 显示芯片 来干这搬运工的活。CPU 的工作:1、找到窗口在显存中的地址,2、给 显卡发送 “拷贝这一行到目的地”的命令。3、重复 2 直到拷贝完所有的行。初看起来好像和没有加速以前差不多,可是第 2 步就是关键所在哦。

现在让我们把第二步分解来看:没有 2D 加速:1、读 32 Bit 数据(入门篇里的哦!),把这 32 Bit 数据写入目的地。2、重复 1 直到一行所有的像素被处理完。而有了 2D 加速后的工作只有:1、发送命令让显卡去拷贝这一行。这样看来,2D 加速确实能很大程度的释放 CPU 的负担。所以大家现在随便提起一个窗口移动一下,很平滑不是吗?显卡负责了窗口的移动。

二、诡异的 Windows 加速

Windows 对于每位 PC 程序员来说,都可以用“诡异”二字来形容。Windows 有太多专有的东西,以至于显卡也要为 Windows 本身制定一套加速计划。拥有全部的 Windows 加速功能的显卡几乎没有,而且现在的 CPU 的速度足以弥补 Windows 没有全部硬件加速的缺陷。总的来说,包括 鼠标光标的加速,图标的加速 和 特别的窗口加速等等。

鼠标加速就是用显卡的硬件来处理 Windows 的鼠标光标。大家现在看到的鼠标光标 和桌面上的其他内容其实不属于同一个层。是画在显卡单独划分出来的“顶层”里的。具体的内容也就不用太详细的介绍的,总之我告诉大家一个辨别的方法。打开一个动画窗口,也就是内容一直在变动的窗口,然后把鼠标光标移动上去。如果光标不断的闪动,那么显卡没有给鼠标光标加速。反之如果鼠标光标纹丝不动,那么显卡给鼠标光标加速了。

图标的加速,就是显卡来画 Windows 图标的功能。这个功能真是少只又少,不过对于目前 Windows xp 惯用的 32Bit 透明图表,现代的图形加速卡能起到一定程度的加速功能。

特别的窗口加速:窗口加速不是用 2D 加速功能来处理吗?有什么特别的?当然有。移动一个窗口,嘿嘿,现在你知道电脑在做什么。可是,当一个顶端窗口挡在你移动的窗口上面的时候,也就是一个“总在最前面”的窗口(Windows 定的称呼) 挡在桌面,而你在它的下面移动一个窗口….. 怎么样,解释不了了吧!? 这个时候,Windows 要做的事就稍有不同了。它首先找到窗口露在外面的部分,然后这样把整个窗口分割成一个一个的小块,再一个一个移动它们到目标位置。是不是比较麻烦?而如果用有 Windows 加速功能的显卡来做,显卡自己就可以处理这一切了。Windows加速就讲这么一点吧,因为它太庞大了,我都没有全部弄清楚。那么接下来,该我们的主角出场了 ------

三、复杂庞大的 3D 加速

人人都喜欢渲染 3D 动画(一看就头晕的除外)。看到虚拟的主角在屏幕上跳来跳去,杀来杀去,拯救世界,谁不激动啊!说起 3D 加速,由于它太复杂了,我准备分 5 个部分来讲,涵盖从简到繁,从过去到未来的 3D 加速基础知识,好让大家能多了解一点我们默默无闻的 3D 加速卡们的工作。

3.1: 彩色三角形

世界就是这样开始的。人们想到了用三角形来表示 3D 的物体。其实很简单,学过高中几何的同学都知道,三点确定一个平面。所以三角形永远都是平面的。这样一来,复杂的曲面物体被近似的用小的平面来表示,在绘画上面会方便很多。来看画一个三角形的过程:前面的文章我已经讲了绘制矢量图的过程。其实一个三角形也相当于一个矢量图。它由三个顶点组成。而绘制的过程一样有两步:1、找到三角形将会坐落在屏幕的哪个地方。2、用颜色填充这个地方。也就是我提到的 设定(Setup) 和 光栅化(Rasterize) 的过程。而由于对象是三角形,我们给这两个过程另起名字叫做:三角形设定(Triangle Setup)三角形光栅化(Triangle Rasterize) 过程。呵呵,有点儿现代图形学的意思了吧!一开始的 3D 图形,只有颜色,没有现在人们所说的贴图啦,纹理啦等等,所以生成的图像都是光突突的感觉。那个时候根本还没有出现 3D 游戏的概念,而专业人士是不会在乎这些的……

3.2: 贴图?皮肤… + 颜色混合

人们显然不会满足永远看着光秃秃的三角形组成的东西在屏幕上乱跳。于是慢慢的有人想到:我们给三角形贴上纹理贴纸怎么样?说起纹理,看看你家里的家具,它们表面的木纹啦什么的,还真的和三角形用的纹理贴图有点相似之处呢!纹理贴图在 3D 图形领域所扮演的角色,和现实家居里的墙纸,贴纸确实功能差不多。而当时在纹理贴图发明的初始时间,还有人强烈的反对它呢!有人认为纹理贴图是没有用的东西,以至于那段时间有公司竟然出品过不支持纹理贴图的显卡(没有 TMU 的显卡,你能想象的出来吗?公司的名字我忘了)!不过纹理贴图还是显示出了它强大的魅力。现在的 3D 图形技术里,纹理贴图也算是单独的一门学问了。

有人会问,纹理贴图怎么贴到三角形上去的?这个过程的解释比较复杂,你可以试着想象:纹理贴图需要坐标来指定,就像你在刚刚做好的桌子上画上定点,让贴纸对齐定点贴上去一样。也就是说,每个三角形的顶点都包含有贴图坐标,这样处理的时候就能按照贴图坐标把纹理贴图贴在对应的位置。怎么贴?!我还没有讲?哦,对啊,呵呵,怎么贴呢?是这样的:在三角形设定的阶段,贴图坐标也被应用到了每一个像素上。具体的说,知道了顶点的贴图坐标,那么三角形内任一一个点的贴图坐标也应该能计算出来吧?!对了,是插值。利用插值,我们可以得出要画的三角形所在像素的每一个点所对应的贴图坐标,不是吗?有了这个贴图坐标,就简单多了。我们利用坐标,到贴图里去取对应坐标颜色来,不就把图贴上来了吗?呵呵,这段有点绕,也怪我的文字表达能力欠佳,大家仔细多看几遍吧,不好意思啊!

还有,伴随着纹理贴图而来的颜色混合,也应该归到这一节。颜色混合…. 我知道!不就是用像素的 Alpha 值来把两个像素运算混合成为一个像素吗?对了!不过颜色的混合不是仅限于 Alpha 混合。还有很多种混合方式。比如把三角形像素的颜色屏幕上原有像素的颜色加起来,这样看起来,三角形所在的地方像是被“加亮”了一样。游戏中的火焰啦,光环啦,等等,就是用了加法来完成的。同样,把两个像素的颜色相减、相乘 或 相除 也未尝不可,这一切就是 – 颜色混合。正因为有了颜色混合,各种酷炫的游戏特效才能实现。

3.3: 显卡的革命

上面所说的功能,人们早就把它们做到一些显卡芯片里了。这样一来,这些所有的工作,都被从 CPU 里解放了出来。好啊!可是 CPU 还是不知足:I want more freedom! 人们想尽方法把 CPU 的负担减轻。所以,最后,就连 三角形设定,三角形光栅化 过程之前的 潘多拉盒,也被解放了出来。这就是:几何变换光照运算(Transform & Lighting, T&L)

说到这里,就不得不讲一下这两个纯数学的过程。几何变换:大家都知道,我们在屏幕上看到的 3D 图形,是以某一个视点为观察点绘制的。这是怎么完成的?还有,3D 物体如何在整个场景里移动?这就牵扯到了图形处理之前的话题:3D 空间几何。每一个 3D 物体都有一个说明其位置,方向的数据阵列,我们把它叫做 矩阵(Matrix)这个矩阵储存了物体在场景里的位置,旋转方向,缩放大小等等的信息。所以在物体移动的时候,我们不需要更改所有三角形的位置,仅仅修改 矩阵 里的信息,整个物体就一动了。而 矩阵的应用不仅如此。最后要把整个场景变换成一摄像机为中心的 3D 空间,这个过程也和 矩阵有关。

光照,另一个数学过程,就是用来通过三角形的顶点相对于场景中光源的位置,距离,夹角等等来计算这个三角形接受到光照的强度的过程。

以前,这两个纯数学的过程,需要 CPU 来完成。CPU 计算完所有的三角形数据后,把这些数据发送给显卡进行 设定 和 光栅化的过程。可是后来,人们发现,这些运算是如此的死板,以至于可以把它也集成到 显示芯片里来做!这就是硬件几何变换的由来。

所以,到此,CPU 需要做的已经没有什么了。修改一下物体的 矩阵,设置好需要的参数,然后给 显示芯片 发送命令:画吧!剩下的全不用操心……

3.4: 新 CPU 的诞生:GPU

那么到此显示芯片就可以称作 Graphics Processing Unit 了吗?nVidia 是这么说的,可是作为一个真正的处理器,没有可编程性的话,也是残缺的。在用腻了显卡设好的层层套套之后,程序员们大声疾呼:还我自由!他们迫切需要一种打破现在硬件死板功能的设计。因为一切都由硬件完成了,所以灵活性完全丧失了。显示芯片只能按照电路设计来处理三角形,成了一个呆板的“三角形处理机”。这个时候人们开始反省了,人们觉得给程序员最大的自由度让他们发挥才是写好的 3D 程序的关键。所以 – 可编程图形芯片 被设计了出来。这种芯片和以前的 T&L 芯片的最大不同之处在于:它的所有行为都是可以被编成的。使得它的功能被提升到了无限的高度。

反过来想想,当时没有硬件 3D 加速的时候,一切都是 CPU 完成的,虽然慢,但是很灵活。然后,全部硬件化了,灵活性也一降再降。到最后,可编程图形芯片 把速度和灵活性一起实现了。这时程序员所做的事,似乎回到了原始时代:自己写程序对三角形做 光照,办换,和光栅化。不过这又怎样呢?他们喜欢自由!

一切都很好,我们很高兴的说:这才是我想要的。很满足不是吗?可是事实并不像你想象的那样完美,上帝爱捉弄人……..

3.5: 真理?谬论?

发展了这么多年,光栅化的 3D 图形可以说是技术很成熟了。不过它所生成的图形,好像永远都不那么真实。即使人们尽再大的努力,它的画面始终还是动画,和人们心目中的“电影级别的画质”总是差那么一点……

究竟哪里错了?与此同时,3D 图形学的另一门分支:光线追踪图形学(Ray-Tracing) 也在快速的发展着。光线追踪图形学 与 光栅化图形学 是建立在完全不同的理论基础上的,它们的研究成果也是格格不入。而 光线追踪图形学 的理论基础是以眼睛为出发点,追踪每一条光线,精确的计算这些光线经过反射、折射和散射等等随后的颜色。这门学问由于原理及其复杂,所以研究的人力物力都比光栅化图形学要少,以至于到现在它的优势刚刚慢慢显现出来。而它真正的投入到民用、实时处理的阶段,恐怕还要十年左右的发展。而如果它成功了,现在一切的 光栅化图形学 理论,就会被全部推翻。

究竟谁会得到最后的殊荣?我们拭目以待….

后记:写完这篇,我才惊奇的发现,原来人类的每一方面的发展史,都是那么的神奇,充满神话与机遇。作为一个图形学的研究者,我在看到了未来的喜悦的同时,也对人类的进步发出了深深的感慨….

-------------------------
图形加速卡技术论坛:3.进阶篇--显卡的职责

(发表于GZeasy.com: Jul 21 2003, 03:20 PM)

图形加速卡技术论坛:进阶篇 ---- 显卡的职责

回顾:原理篇里,我简要的讲了一下图形加速是什么,显卡是怎么给图形处理加速的,以及长长的 3D 加速发展史。其中 3D 加速的 5 个阶段都是里程碑式的,希望每个图形爱好者都能了解一下。另外,网友们在后面提到了“辐射度”(Radiosity) 渲染的概念,这个概念也是 3D 图形学里的另外一个分支。它的原理与 Ray-Tracing 又有很大的不同之处。这样最后的技术竞争将会更加的激烈…

正题:进阶篇---- 显卡的职责

如果要从头开始讲光栅化图形学的一切,不仅我写不完,也不可能写完。因为我的知识也是有限的,我只能把我认为现阶段主流,有用的知识写出来。学习呢,要抱着开放的心态,即使明天你所学的知识被判死刑,也不要觉得自己没有用了,因为学习的过程中所得到的经验,将使你更快的学到新的知识。今天,我们来讲 3D 加速卡的图形处理过程。

在前面的“原理篇”中,大家也应该知道 3D 图形处理需要经过的 4 个阶段了吧,快想!看你能不能在我之前把它们说出来 …… 对了,它们是:

一、几何变换(Transform)

大家知道,3D 物体是由三角形组成的。每个三角形呢,有三个顶点。而只要把这三个顶点的位置移动了,那么这个三角形也就自然跟着移动了(%$%$$#&%$#)。所以,几何变换所对应的处理对象就是顶点(Vertex)大家想一想,一个物体在 3D 空间能做哪些动作呢?最基本的应该有:平移,旋转,缩放,扭曲,投影 等等… 具体的过程以及运算呢,我想学过大学的线性代数的朋友应该很清楚,我不想在这篇里谈的太深,所以,大家只需要把几何变换看成一个黑盒子,左面输入未经处理的顶点,右边输出处理好的顶点。具体的过程,大家可以在网上查找一下 矩阵(Matrix) 的操作。

矩阵具有特殊的性质,它可以把通过相乘把所有的变换组合成一个单一的矩阵。也就是说,比如 T1 是平移,T2 是旋转,T3 是缩放,那么 T’ = T3 * T2 * T1。这样,T’ 就是把一个物体先平移,然后旋转,最后缩放的矩阵。这个特性非常的重要,它为计算机图形处理节省了大量的工作。

在几何变换之后,还有一个工作要做,那就是裁剪。简单的说,裁剪就是把物体落在屏幕外面的部分去掉,这样就不需要处理看不到的东西,从而节省了处理量。

二、光照(Lighting)

说起光照,这里就必须提一下顶点的另外一个元素:法线。法线就是垂直于平面的一条线。当顶点要被光照处理的时候,顶点的法线参与了很重要的过程。有人会问:要法线干什么?既然法线是简单的面的垂线,那么我们根据面来计算不就可以了麽?答案是:这样做太慢了,而且一个顶点在很多时候会被很多不同的三角形所共用,这样处理的过程就会更加复杂。所以每个 3D 模型,都应该有预先计算好的法线。到这里,我们认识到了顶点所拥有的 3 个特性:位置,法线 和 – 贴图坐标。什么?不知道贴图坐标是什么?回去温习我的第二篇文章!呵呵

光照的数学模型可谓变换万千。在利用了新的 GPU 的可编程处理特性之后,人们尽可以写出无穷的光照效果。这里我将举最最简单的一个光照模型为例子。要是大家觉得不够,可以到网上搜索以下“3D图形学 光照”,我保证你能被光照知识喂饱。首先,我们要得到光源的方向。假设场景里有一个太阳,那么它的方向为 L。顶点呢,有法线 N。我们要得到光照的强度,只需要做点乘:C = L • N。这么简单?!就是这么简单。点乘的结果就是光照的强度。试试看……可是当你试过之后,你会发现,当法线面向光的方向的时候,计算的结果却是负的… 看来一定出错了。是这样的,应为我们要根据法线和光线的夹角来近似计算光照的强度,所以光的方向要被反一下,这样的点乘,得到的才是夹角的关系。所以,我们来改正它:C = -L • N,而且当运算结果为负的时候,表明方向背向光源,这个时候,用全黑来表示吧!好了,最简单的方向光模型已经诞生了!恭喜 恭喜 呵呵

以上两个过程(几何变换和光照啦!) 在第一、二代的显卡里,是由 CPU 来完成的,在第三代的显卡里呢,则是由固定的硬件完成的,我们称之为 Hardware T&L 显卡。而在第四代的显卡里,就是由可编程的几何流水线来完成了。也就是现在流行的 Vertex Shader 单元。(就是大家熟知的顶点渲染单元)

三、设定(Setup)

这个过程比较简单,而且很死板。所以即使最新的 GPU 也不把这个功能开放给程序员,而是固定的完成的。就是,给了三角形的三个顶点,我是说经过 几何变换,裁剪和光照 的三个点,把它们落在屏幕上的位置给找出来,当找到位置时候,就可以进行下一步 ---- 填充这个三角形了。这下一个过程,就是传说中的 Pixel Shader像素渲染单元)的重头戏:

四、光栅化(Rasterize)

找到了三角形在屏幕上的位置,也就是像素群,我们就可以开始把它画出来了。基本的工作有三个:一个就是按照贴图坐标(Again…) 去纹理贴图里读到颜色数据(Texture Reading)第二个是把读到的数据和前面算好的光照强度进行一系列的运算,得到这个像素的颜色(Texture Blending)而第三个,就是把它和屏幕上当前像素的颜色进行一定的处理,然后画到这个像素上(Alpha Blending)。

在以往的显卡里,这三个过程是固定而顺序进行的,也就是说,显卡先用前面的周期读取纹理贴图数据,在以预先设定好的方法之一进行贴图的混合,最后同样用预先设定好的方法把新的颜色和屏幕当前像素的颜色混合起来,最后写到屏幕上。而按照这种方法,给显卡的像素渲染管线配备一个以上的贴图单元,就可以成倍的提高第一个过程的速度。比如著名的 GeForce 4 Ti 系列显卡(我目前的台式就是这个,嘿嘿),它的每条像素渲染管线配备了两个贴图单元,这样,当三角形要用到两层贴图的话,GeForce 4 Ti 在一个周期内就可以把两张纹理贴图的数据都读取到,而相反 Radeon 9000 系列显卡因为只有一个贴图单元,所以要花两个时钟周期才能读到两层纹理贴图数据。事实也是这样的,GeForce 4 Ti系列显卡*在运行现有的多贴图的游戏时,速度非常的快。(*这里似乎作者犯了笔误,应该是Radeon 9000 而不是Ti吧。

而自从 GPU 诞生以来,可编程的流水线的灵活性就被完美的显现了出来。用来处理像素的单元, DirectX 里叫做 Pixel Shader 单元。但是为了兼顾以前的显卡架构,Pixel Shader 的第一个版本 1.x 在制定的时候,需要 Shader 代码还是按照传统的流程执行,也就是贴图读取在先,贴图混合在后,最后颜色混合。这样灵活度还是很低的。在 Pixel Shader 第二个版本,也就是 2.0 的制定过程中,人们意识到了灵活的重要性,所以第二版本的 Shader 将可以把贴图读取和颜色混合过程混起来执行。其中的一个例子就是:环境反射贴图。它的计算过程是这样的:从第一张贴图里读取顶点法线的偏移量,对当前的法线进行偏移,然后用偏移后的法线来读取第二张贴图。大家都能看出来,在两次贴图读取之间,有运算的过程。这样用 Pixel Shader 2.0 写起来很方面,可是 Pixel Shader 1.1 就是很困难的事情了,即使能实现,整个过程也显得很不透明。

在上面的情况下,流水线的第二个贴图单元会被浪费,因为读取这两张贴图,同样花了两个周期,第二个贴图单元没能起到加速处理的功能。在这个前提下,例如Radeon 9700 的设计就体现出了灵活的方式,它只用一个贴图单元,却有两倍于上代显卡的像素处理流水线,能在保持性能的前提下,尽量减少不必要的晶体管浪费。

好了,四个过程就到这里了,我们来总结一下:

顶点进入显卡的处理管道 => 几何变换 => 光照 => (裁剪 =>) 设定 => 光栅化 => 屏幕上的像素

怎么样,是不是直观明了?大体地说 光栅化图形 的处理方法就是这样的。其实每一步又都有很多详细的内容,我将在后面的章节里慢慢的讲喽

下次再见~~

-------------------------
图形加速卡技术论坛:4.拓展知识—显卡的接口和功能

(发表于GZeasy.com: Jul 22 2003, 05:06 PM)

图形加速卡技术论坛:4.拓展知识—显卡的接口和功能

回顾:“显卡的职责”里,我重点的给大家介绍了一下显卡作为 3D 加速卡时的工作流程,与每个流程的大概功能。我们再来回顾一下有哪四个过程:几何变换,光照,设定 和 光栅化。对了,在几何变换后面,还附加有裁剪。这就是光栅图形的基本生成步骤了。可是呢,显卡也不光是为了玩游戏的,否则就该叫“游戏卡”了。好,让我们来看…

还有,感谢网友们的支持和厚爱,正是有你们的支持,我才有信心一直写下来,希望大家都能学到有用的知识

正题:拓展知识 ---- 显卡的接口和功能

其实除了 3D 处理,显卡还有很多的功能,尤其是具有视频相关的一些功能。不过,这些功能有些是做为扩展功能被制造商附加在显卡上的,所以我下面说的,并不是每个人的显卡都有这些功能哦!我们先来看最简单的:

一、VGA 输出接口

呵呵,你一定在笑我吧,VGA 接口,这个也说?我想所有用电脑的朋友都知道 VGA 这个缩写吧,可是既然要介绍显卡,当然要全面一点喽。VGA 接口是很早以前就制定出来的接口规范了,最早的 VGA 标准分辨率为 640x480, 16 。VGA 的输出信号呢,是模拟信号,也就是说它通过输出不同的电压强度来达到表示不同色彩的目的,R,G,B 分别用 3 条信号线来传输。

大家都应该知道 CRT(阴极射线管) 显示器是怎样工作的吧,通过电子枪从左到右,从上到下的扫描,一幅图像就呈现在了显示器上。关于显示器的详细原理呢,由于不涉及到显卡的范畴,我就不详谈了,具体的资料也有很多。我介绍 CRT 的主要目的,是因为 VGA 接口的信号本身就是为 CRT 显示器量身制定的(Oh, 我的 LCD 怎么会是 VGA 接口…. faint)。显示器不断的扫描,而电子枪的电压强度也要随之而变化,这个变化的信号就是显卡的 VGA 接口提供的。

这里我要提醒大家,既然是模拟信号,那么必然存在信号衰减的问题。所以这时候模拟信号的传输质量,就和显卡的模拟输出电路,VGA 接口 和 线缆,以及显示器内的电路设计息息相关了。好,让我们来看看 VGA 接口部分有什么东东:

1.1 模拟输出电路

模拟输出电路,主要有 RAMDAC低通滤波电路(Low-Pass Filter) 组成。RAMDAC 的全称是:RAM Digital/Analog Converter。也就是内存数字/模拟转换器。它的职责是把显卡内存(也就是显存啦!)里储存的屏幕数据 (也被称作帧缓存 Framebuffer) 转换成高低变化的电信号,然后输出给显示器用的。要显示图像,显卡输出信号的速度和显示器接受信号的速度必须是完全一致的,也就是要做到同步。这么一来,RAMDAC 也要搭载一定的频率来给显示器提供模拟信号了。以前的显卡,RAMDAC 都是独立的芯片,所以我们拿一张老的显卡,可以看到卡上有一个(或多个) 芯片,上面赫赫写着 RAMDAC 的,就是这个了。而新型的显卡,它们的图形核心都有很高的集成度,所以 RAMDAC 也被集成到了图形核心里了。

低通滤波电路的作用,我想看名字大家也能猜得差不多,就是滤掉高频杂讯,让低频信号通过… 其实这个低通滤波电路也不简单呢!凡是模拟信号电路,都存在一个信号保真度的问题。滤波电路也一样,存在一个信号截止频率范围的设定。也就是说,模拟信号不可能从一个频率一刀切下,总会存在还原度不佳的可能,所以在低通滤波电路的设计上,较好的显卡往往采用 4 层,甚至 5 层电路来逼近,也就是尽量做到能把高/低频信号分割的干净,这对于模拟信号输出质量的提高很有帮助。比如 Matrox Parhelia-512 的模拟输出部分就采用了 5 层低通滤波电路来保证信号的纯净。(按我个人理解,简单的说,优秀的低通会提供更好的2D画质)

1.2 EMI 电磁屏蔽电路

拿起一张显卡,大家都能看到,在蓝色的 VGA 接口后面,有着密密麻麻的元件位置,可是你仔细看的话,可以发现有好多的元件位都是空着的。这是怎么回事呢?其实在 VGA 的输出端前面的很多元件,是为了降低显卡输出信号的电磁辐射而设计的。这个电路的元件的使用尤其挑剔,如果元件不好的话将严重的降低信号的质量。所以只有很少数的高档显卡真正的使用了这部分的设计。而其他的显卡,在电磁辐射量允许的情况下,会省略这部分的电路,所以有很多的显卡 VGA 端口处都空很多元件,那些就是给 EMI 电磁屏蔽电路预留的位置(预留?它会回来吗?呵呵)…

二、TV 输出功能 (TV-OUT)

这个是现在民用级显卡上很常用的功能,很多中/高档的显卡已经把它当作标准配置了。TV-OUT 的功能当然就是输出显示信号到电视咯,而 TV-OUT的接口一般有两种,即 TV 上常用的 同轴信号端口S-Video 信号端口,而信号的格式,也有 NTSC 和 PAL 两种国际标准。为了支持 TV-OUT 功能,显卡上也必然要有负责处理这部分信号转换的电路。同样的,以前的显卡会有外置的 TV-OUT 芯片,而新型的图形处理核心也把它集成到了里面 ( 哇噻,好厉害!什么都能集成?)

TV-OUT 功能对于民用级的显卡来说,是非常实用的,因为它可以把电脑的屏幕输出到电视上,从而让播放视频,玩游戏的功能可以在大屏幕电视的帮助下变得更有趣。

三、VIVO:我们是视频采集卡

很多朋友都问:VIVO 是什么?顾名思义,VIVO – Video In Video Out,即视频输入输出。相对于 TV-OUT 来说,VIVO 最大的不同就在于它的视频输入上。这种显卡可以通过同轴信号接口 或 S-Video 接口把 NTSC/PAL 图像信号接收进来,也就是说,它可以完成视频信号的采集功能。大家都知道,把显存里的数字信号输出到模拟信号接口,需要 DAC(数字/模拟转换器)的帮助,而 NTSC/PAL 信号也属于模拟信号,那么采集它们的时候,就要进行互逆的过程了:ADC(Analog/Digital Converter 模拟/数字转换器)。VIVO 功能一般都通过外置的芯片来支持,因为需要 ADC 的过程。而一些最新的图形核心,把 VIVO 功能也集成到了里面(…) 如 GeForce FX 5900 系列。

拥有 VIVO 功能的显卡数量就没有只拥有 TV-OUT 功能的显卡那么多了。有少数的厂商才给某些型号的显卡配备 VIVO 功能。这样的功能对于需要录制影片节目,或拥有摄像机的朋友来说,比较实用。因为它可以把影片或摄像机的信号输入电脑,保存在硬盘上。可是要想通过显卡看电视,VIVO 功能是不行的。因为它缺少了接受电视信号所特有的部分:高频头。

四、TV 接收功能

拥有TV 接收功能的显卡,属于真正的多功能复合卡。它的种类就更加少了。如果大家见过 TV 卡(就是单纯用来接收电视信号的扩展卡) 的话,一定见过它上面那个用金属包着的,大大的,方方的,怪怪的盒子。这个就是高频头。高频头所起的作用就是把从空中,或有线电视网络接受到的调制好的电视高频信号,转换成可供采集的视频信号。正因为是高频信号,所以很容易受到干扰。所以优质的高频头用料,做工都非常的棒,而价格也很昂贵。我们最常见的带 TV 接收功能的显卡有 ATI 的 AllInWonder 系列显卡 等等。

有了 TV 接收功能,你的电脑就变成电视机了 呵呵。很多 TV 接收卡还附赠了遥控器,以使你的电脑看起来更像个电视(1万多元买个小电视……)。最重要的是,你不仅能看电视,还可以把好看的节目录下来,以后慢慢回味,或留作纪念。

五、数字时代的开始:DVI

显卡上配 DVI 接口,大概在近两年里才开始兴起。DVI 的全称是 Digital Visual Interface。即:数字视频界面。相比 VGA 接口的模拟信号,DVI 输出的则是数字信号。这样,显示信号将 100% 的被完好的传输到显示器里。DVI 所对应的是数字显示设备,即 LCD 液晶显示器,Plasma 等离子显示器 等等的显示装置。原因是液晶显示器和等离子显示器的显示原理都是基于数字信号的,这样当接受到 DVI 所输出的数字信号后,就可以方便的直接将它显示出来了。

关于 DVI 的详细信息,我给大家一个网址,这是 DVI 的制定组织 DDWG 的网站,大家可以到这里找自己想要得信息:http://www.ddwg.org/
这里我想解释两个大家常见的问题:

5.1 DVI 转 VGA 的接头是怎么回事?

其实 DVI 接口在制定的时候,保留了模拟信号输出的通道。DVI 一共有两种接口:DVI-D (Digital only) 和 DVI-I(Integerated)。DVI-D 的信号就是单纯的数字信号,而 DVI-I 则是保留模拟信号通道的 DVI 接口,大家可以找一个 DVI 接口的显卡来看 (怎么不贴图?哦,你自己找找看实物,印象比较深嘛!),它的左边有一个十字形的接口,这个呢,就是模拟信号的通道,而右边则是三排规则的接口,这个就是 数字信号通道啦!

所以,可以利用 DVI-I 的模拟信号通道,来输出模拟信号。到这里,大家就别再问 DVI 能转 VGA,VGA 怎么就不能转 DVI 的傻傻问题了哦 呵呵

5.2 液晶显示器的 VGA 接口又怎么解释?

这个问题,是不太好解释(#%@#%#@%#@)。按道理说,LCD 液晶显示器都应该配备 DVI 接口来接受纯净的数字信号,这样现实效果会好很多。VGA 信号输入到液晶显示器后,还要进行 ADC 的转换,才能被显示出来。这样看:如果用 DVI 接口来接液晶显示器的话,路径是这样的:

显存的数字信号 => 编码 => DVI => 显示器 => 解码 => 显示

其中的“编码”和“解码”过程,是 DVI 标准所制定的,不过因为是纯数字无损编码,所以没有任何损失的

而用 VGA 接口,则变成了这样:

显存的数字信号 => DAC => VGA 传输(损耗) => 显示器 => ADC => 显示….

大家都能看出来后面的做法是多么的可笑啊!从数字到模拟,然后把模拟信号传输过去,加上损耗和干扰,再还原成数字信号……可是为什么家用级的显示其都只有 VGA 接口呢?我想可能是出于兼容性的考虑。由于现阶段 VGA 接口的显卡占绝大多数,所以商家怕出现“买到显示器插不上”的尴尬情况,决定用 VGA 接口。另一方面的原因,则是商业原因。DVI 作为后来才发展起来的接口技术,虽然对于数字显示有着先天的优势,而且成本并不高昂,可是厂商出于利益考虑,就只能通过这种手段来提高 DVI 制品的收入了。一旦数字显示技术普及,DVI 接口一定会受到更广泛的应用。

六、3D 立体眼镜

好玩吧,3D 立体眼镜。我想绝大多数人都没有体验过戴上它玩 3D 游戏是什么感觉。

其实它的原理是这样的:人的眼睛判断物体的远近,其实是由物体在两个眼睛里成像的细微差别来判断的。你可以做一个试验,伸出双手,两手各握一支笔,一上一下的顺着视线对成一条直线。用两只眼睛的话,你一定可以轻而易举的把两只笔对成一条竖线(做不到?%#$%$#%快去找眼科医生检查…)。好了,现在闭上一只眼,再试着把它们对成一条直线… 是不是很困难了 呵呵。就是这样,要看到真正的立体物体,两眼的图像是不同的。

3D 立体眼镜的原理,就是通过让左/右 眼看到不同的图像,来让大脑认为你看到的东西是“立体”的。怎么能看到不同的图像?!是这样的:当 3D 立体眼镜被激活的时候,游戏的 3D 场景渲染过程会发生一些变化。这时候显示器将以换页交替的方式,轮流的显示出左/右眼的画面(怎么做的?就是移动游戏里摄像机的位置啊!)。而此时,3D 眼镜便偷偷的轮流挡住你的右眼和左眼(通过液晶片的变色),这样显示器显示左眼画面的时候,你用左眼看;显示器显示右眼画面的时候,你用右眼看…你看到立体画面了!呵呵 基本的原理就是这样的。

这篇写了这么多有关显卡功能的东西,有的地方可能比较难理解,不好意思咯… 大家慢慢的看,一定能看懂的!呵呵 我们总结了显卡的 六大功能/接口:VGA, TV-OUT, VIVO, TV-IN, DVI, 3D Glasses。其他一些奇异的功能,我就不说了,我们只讲潮流嘛 呵呵

就到这里了,再见哦~~

-------------------------
图形加速卡技术论坛:5.解惑篇--游戏的东西,专业的东西

(发表于GZeasy.com: Jul 28 2003, 04:39 PM)

回顾:“显卡的接口和功能”篇中,我给大家大概的介绍了一下显卡拥有的各种接口,以及这些接口的基本原理和功能。其中 VGA 和 DVI 是使用最广泛的接口,我也做了相对较详细的介绍。读完前四章,大家应该对显卡的功能有了一定的了解了吧。可是我看到有很多朋友对于 3D 加速卡除了游戏的另外一个领域非常的陌生,所以,今天我来介绍:

正题:解惑篇--游戏的东西,专业的东西

说起专业绘图卡,大家有什么感觉呢?是不是“哇,好神圣!买不起!和我没关系!...”的敬而远之的态度呢?呵呵,其实 3D 加速卡最初是在专业领域发展起来的。我们现在用到的游戏卡,只不过是一种“军转民”的产品罢了。所以,在了解到 3D 游戏卡的同时呢,我们大家也因该对它的前身—专业 3D 绘图卡有所了解。好了,让我们来看专业绘图卡的职责。

大家来想象一下,如果游戏中所有的三角形,都不去填充,而只用直线把它们的三个边画出来… 你会看到什么??哇,乱死了!是乱七八糟的一堆… 呵呵,这就是 3D 绘图人员每天所面对的东西。

一、线筐的世界

在专业领域,图形设计者往往要求不单看到物体的表面颜色和材质,更要求看到物体内部的结构和精确的形状轮廓。这样呢,花里胡哨的纹理贴图和材质不仅不能起到应有的作用,反而还会干扰设计者对形状的掌握。所以,快速,精确,大量的绘制线条就成了专业绘图卡的“基本功”了 呵呵。

两点确定一条直线,所以在专业领域,物体不一定要用三角形来表示也一样可以被编辑和显示出来。所以专业绘图更偏向于使用四边形来绘制物体。这样一来看起来整齐,二来容易和外部的一些采集设备,比如 3D 扫描仪的数据接口。

在绘制游戏的过程中,要用少量的三角形,加上大量的纹理贴图来绘制场景。由于纹理贴图的读取和颜色运算占绝大多数处理时间,所以游戏卡的显存带宽和像素处理能力就显得非常重要,导致现在出现了 4 条 乃至 8 条 像素管线并行运作的显卡,和高达 256bits, 20GB/s 的显存带宽。

而在只绘制线筐这种情况下,专业绘图卡的工作模式以及瓶颈分布也和游戏卡有所不同了:在专业软件的编辑窗口里,线条填充了所有空间。专业绘图卡需要可以接受的速度处理数量巨大的顶点数据,而这些数据量,通常都在游戏场景的成千上万倍。而画线的过程相比顶点的处理过程,就显得比较轻松了。这种工作方法,使得专业绘图卡需要有非常强劲的顶点处理能力。这点,在顶点处理能力相似的显卡专业性能也相近的表现中也能看得出来。

既然画线条是主要任务,人们当然想让专业卡把它的主要任务完成的更好。所以,人们想到了用一种方法来让画出来的线更漂亮:

二、线筐反锯齿 (Anti-Aliased Lines)

现在打开 Windows 的 画笔 画一条斜线,你看到了什么?(当然是线啦!@#%@#%$#^$)你看到的是锯齿!其实斜线也是由很短的水平或竖直的线段组成的。这个就是线段光栅化的缺点。怎么才能让画出来的线更平滑,更漂亮呢?这就要用到光栅化的高级技巧了:浮点坐标光栅化法则(Floating Point Coordinate Rasterization: 具体的名字可能不是这样的,不过这个名字绝对能说明问题!)。以往,在画线的时候,都要把线段顶点的坐标先转换成整数,再画在屏幕上,比如( 124.5, 11.2 ) => ( 125, 11 )。因为屏幕上像素的坐标都是整数的,所以这种方法简单快速,可是画出来的线就是那样的充满锯齿…

而浮点光栅化法则呢,就是把浮点数表示的坐标直接映射到屏幕上,而取该点邻近的四个像素做颜色的权重分配(最复杂的地方哦,别急,我来慢慢讲):比如线上有一个点,它的坐标是 ( 124.5, 11.2 )。那么我们来取这邻近四个点:( 124, 11 ), ( 125, 11 ), ( 124, 12 ), ( 125, 12 )。而用坐标的小数部分表示该点的权重的话,四个点的颜色浓度分别是这样的:

( 124(0.5), 11(0.2) ) : 50% * 20% = 10%, ( 125(-0.5), 11(0.2) ) : 50% * 20% = 10%;
( 124(0.5), 12(-0.8) ) : 50% * 80% = 40%, ( 125(-0.5), 12(-0.8) ) : 50% * 80% = 40%;

这样,就把一个浮点坐标映射到了四个整数坐标上,由于色彩的浓度是随浮点坐标在整数坐标映射的权重来计算的,所以整个线就变得非常的平滑了。

我上面介绍的只是反锯齿光栅化的方法之一,有很多种更快速的方法已经被广泛的使用了。由于这些方法涉及到的知识太专业了,所以我就不再多做引申了(其实有的我也不很清楚…)。线筐反锯齿在新型专业绘图卡里做了良好的优化,所以使用专业绘图卡时,可以通过使用线筐反锯齿而得到更清晰精确美观的线筐效果图。

三、专业 OpenGL 和后起之秀 D3D8/9

说到专业绘图卡,我就不能不提起 OpenGL。OpenGL 是什么?你首先想到的一定是 Quake!, Doom! @%#%#@%@^#$^% 拜托,我们在讲专业知识哦!Open Graphics Library 是由 Silicon Graphics Inc. 于 1992 年提出的专业绘图接口。它被广泛的应用在了几乎所有的计算机绘图领域。包括 SGI, DEC, IBM, PC 和MAC 等等,都提供了对它的支持,所以说 OpenGL 是一个跨平台的专业绘图接口。大家平常玩的游戏里使用的 OpenGL,只是整个 OpenGL 绘图库函数的很小很小一部分,而这一部分足以让我们的广大玩家体验惊心动魄的 3D 世界了!呵呵。

既然这么神,那么支持它的软件肯定不少喽!对了。像 3dsmax, Maya, SoftImage 这PC 3D 制作工具的“三巨头”就提供了对 OpenGL 图形接口的支持。既然是接口,也就代表了“与硬件无关的隔离层”。所以专业绘图卡只需要专心做好对 OpenGL 接口的支持,也就是支持了所有主流的 3D 制作软件。大家看到目前的专业绘图卡价格如此的高昂,其实除掉优秀的硬件,它的驱动研发也占了很大一部分的成本。

也许有不少朋友还在纳闷:OpenGL 到底是干什么用的?每天听你们说呀说,我怎么没有看见!其实,OpenGL 的常用功能说起来让你吓一跳:画点,画线,画多边形,就是这些。作为游戏,使用OpenGL 提供的这三个功能就足够了。而在专业领域,它提供了曲线,曲面绘画的支持,三角形分割,顶点变形以及其他一些专业人士津津乐道的功能(别说我糊弄你,我了解的真的不多!)而在最新版本的 OpenGL 之中,也引入了可编程图形流水线的概念(比 D3D8 晚了半拍)这样一来,也可以通过对显卡编程来灵活的实现个性的图像效果。

也许大家从我的话里能看出来,OpenGL 在后来的发展中,正如大家所料的,掉到了 D3D 的后面。说起 D3D,就要提一下 Microsoft 的 DirectX 娱乐多媒体引擎了。DirectX 对广大玩家一定如雷贯耳吧。事实上,现在市面上的游戏,有 80% 的都采用了 DirectX 的 D3D 图形引擎,而不是 OpenGL。这也是受 OpenGL 和 D3D 开发使得定位不同所影响。D3D 更偏向于为游戏设计者提供直接的,功能强大的与游戏绘图直接相关的功能,所以对于游戏设计者来说更具亲和力。

而 D3D 的快速发展也得益于它是独家技术:由 Microsoft 亲自制定,亲自研发,提供详细强大的技术支持。以往的 D3D 总是给人小气的感觉,而 D3D 也把 OpenGL 作为竞争目标而努力的发展;而在 DirectX 8.0 推出的时候,D3D8 从功能和易用性上一举超越了 OpenGL。它首先提出了可编程几何/像素处理流水线的概念。配合当时上市的 nVidia GeForce 3 系列显卡的完美硬件支持,从视觉上给了人们全新的震撼。题归正传:当 D3D8 在游戏接口方面超越了 OpenGL 之后,贪婪的 Microsoft (!) 更开始让 D3D 在专业功能上也发展起来。时至今日,D3D 得到了众多专业绘图软件的支持,比如 3dsmax 从 4.0 起加入了对 DirectX 8.0 的支持,使得近似最终渲染效果的材质/灯光在可编程GPU 的支持下,在预览窗口里显示了出来。

DirectX 9.0 的绘图组件 D3D9,又是一个里程碑。它重新定义了可编程图形流水线的概念,使全浮点精度,无失真的图像在 PC 游戏里成为可能。而且 D3D9 引入了另一个新的概念,就是在继承了 D3D8的汇编语言给显卡编程的同时,提供了用高级语言来撰写显卡的程序的功能,这个语言被命名为 HLSL(High Level Shader Language)。到此,D3D 超越了 OpenGL,也使的 OpenGL 新版本的制定开始向 D3D 靠拢。OpenGL 所支持的 Vertex Program / Fragment Shader 就是在 D3D 的 VertexShader / PixelShader 的基础上发展起来的。

D3D 的功能已经足够强劲,也在游戏领域得到了完全的支持。可是要想在专业绘图领域真正的拥有一席之地,还需要各大专业绘图软件开发商对其表示肯定和投入支持。让我们衷心的祝 D3D 和 OpenGL 一路走好...

四、预览 vs. 渲染

有很多专业绘图的初学者,常常分不清两个概念:预览和渲染的区别,以及图形加速卡是给哪里加速的。下面我就来讲一下这些到底是什么东西

使用过专业绘图软件的朋友,一定见过它的交互式编辑窗口吧。不同的软件和设置,开有不同数量的交互式编辑窗口,也被称为预览窗口。这些窗口里的内容呢,就是由图形加速卡绘制的(如果启用硬件加速的话)。一般除了有一个窗口里的物体是由颜色和纹理贴图填充的以外,其它的窗口里的图像都是线筐。呵呵 说道这里,大家应该明白专业绘图卡对线筐加速的意义了吧。其实,在专业绘图软件里,有且只有这部分的绘图工作是由图形加速卡来完成的。另一部分绘图功能,则超越了图形加速卡的功能:

这就是成品渲染。当你调整好所有参数,包括摄像机的位置和灯光以后,按动“渲染”( Render )按钮,电脑在做的就是这一步。稍微复杂的场景,这一步通常要花费数小时的时间,有的甚至于要好几天才能完成。为什么这么慢呢?!你如果打开预览窗口的图像,和渲染好的成品对比一下,马上就能发现区别所在:成品比预览图细腻真实的多。其实这一步是完全由 CPU 来完成的。而它们所使用的算法的复杂度,也远在显卡的光栅图形之上。有的是用了 Ray-Tracing 光线追踪来计算物体的材质和光线的反射/折射,有的甚至利用到了辐射度( Radiosity ) 来计算物体表面接受光线照射的强度。这些真实的算法异常的复杂,而且灵活度很高。所以目前的 GPU 的可编程特性根本不能“代劳”,唯有我们可怜的 CPU 孤军奋战了。

到这里,大家应该明白,专业绘图卡在绘图软件的使用过程中充当了预览视口加速的功能。别认为只能加速预览视口没有什么大用处,其实绘图工作者们有 90% 的时间是用来绘制图形的,也就是图形加速卡在 90% 的时间里,都在为系统起着重要的加速作用。好了,看着激动人心的 Hollywood 特效大片,欣赏着美轮美奂的 3D 动画片的时候,让我们为默默无闻的专业绘图卡门致敬…


后记:这篇文章写的乱七八糟的,连我自己都不知道在写些什么 总的来说,我是想给初步涉及专业绘图领域的朋友做个引路人,让他们对自己的工作环境有一些浅显的了解。其实,我本人对专业绘图应用领域,也只是稍知一二,真的是书到用时方恨少啊!希望大家一起努力学习新的图像技术,来为我们建筑 3D 世界的梦想添一份力气!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值