经常听说显卡加速的事情。这个加速度是什么概念?
首先说词:图形加速卡。是用来加速图形处理的扩展卡。所谓的图形处理是什么?纯文本时代的计算机,那种一行行的命令和文字,不叫图形处理。-P图形和文字是计算机输出给人“看”的两种东西。
一,文本,被遗忘的时代
真正的文本处理,很遗憾,在DOS之后已经完全被淘汰了。所以没有所谓的“文字加速卡”是因为现在的显卡即使完全没有文字处理功能也能在Windows下正常工作。此时,也许有人会问:Windows中的文字不就是“文字”吗?答案是:对你来说,是的。但对于计算机来说,它不是文本。Windows中的文本也是一种图形。那些字是窗户画的。在控制面板中打开字体。你看到了什么?各种各样的字体,对吗?这些不是存储在显卡里,而是在硬盘里。当Windows接收到在窗口上打印一行的命令时,它会调度一个“绘图”程序,从硬盘中读取字体并在屏幕上绘制出来。现在很清楚了:Windows的界面完全是基于图形的。所以图形加速卡对于Windows来说非常重要。好了,现在,让我们忘记“文本”!-_-
二、图形、像素等的定义
我们来看看图形的定义。计算机中的图形有两种截然不同的定义。第一种叫做光栅图形,第二种叫做矢量图形。所谓“光栅图形”,每个电脑玩家都有广泛的接触。现在你打开Windows的“画笔”程序,随意画几个圆圈、线条、颜色,然后把你的图片放大8倍(我不需要指导你这么做吧?!)你看到了什么?你的身材是由小方块组成的吗?每个小方块称为一个像素。换句话说,你的图形是由小像素组成的。
盯着一个像素,你发现了什么?没错一个像素只有一种颜色!( #%@#%^@)。稍微懂一点色彩学的人都应该知道,光是由红、绿、蓝三原色按任意比例组成的。该图中的一个像素也是由红、绿、蓝组成的。在最广泛的cg动画中,每种原色都是由8个二进制数0或1组成,即8位,即每种颜色的表现力是2 ^ 8 = 256,称为“色标”。你学过统计学吗?每个原色有256个色阶,那么三原色R/G/B的表现力是多少种颜色呢?嗯,算了,我会告诉你的。你必须把它们相乘。结果是256x256x256 =...1677 7216种。哇?!这么多?好了,我们用电脑惯用的千位制来分:16,777,216 = 16m。这就是人们常说的:16兆彩,真彩等等。
这里有一个小插曲。如果一种染色占8个位置,那么R/G/B总是占8+8+8 = 24个位置。但是对于目前的32位计算机系统来说,24位是一个非常不舒服的长度。应该是24位太小了,计算机一次处理不了32位,但是一次处理两个24位就超出了32位的处理能力了。我们做什么呢只有在24位的颜色之后,才能添加8位的空数据。这样一个像素的颜色会占用32位,正好对应一个32位系统的处理能力。手感舒服多了。“空数据?你是说每个像素浪费8位数据?”答案是否定的。虽然最后八位对图形的显示没有影响,但人们总是试图充分利用现有资源,因为这里多了八位。所以像素上加了另一个概念:透明度。也就是大家都知道的像素的Alpha值。用8个没用的位保存α是个好主意。这样,我们可以根据像素的透明度将一个像素与另一个像素混合,以产生重叠效果。这就是传说中的阿尔法混合特效。很简单,对吧?在这里,我们用一种更专业的格式来表示最常用的像素:R8G8B8A8。哇,什么?好了,把它拆开:R8、G8、B8和A8,也就是红色8、绿色8、蓝色8和透明8。虚张声势挺好的~ :P
光栅图形到此为止。接下来,是另一个英雄出场的时候了:矢量图形。不要小看它,现在的3D影像基础很大一部分都是基于它的。
光栅图形是点,但什么是矢量图形?其实也是点,但是有数学公式。这么说吧:如果光栅图形告诉计算机在每个点上画什么颜色,那么矢量图形就教会计算机如何画一个图形。例如圆形。如果用光栅图形来表示,那就必须有大量的像素来描述圆所在区域内每个点的颜色。用矢量图形表示:它是一个圆,圆心,圆的半径(也可能是圆的颜色)。就这么简单。当计算机绘制这两幅图时,这是完全不同的工作。在绘制光栅图像时,计算机读出所有的像素数据,然后将原始模型复制到显示缓冲区,这样我们就可以在屏幕上看到圆。画一个矢量圆就完全不一样了:首先计算机必须确定圆的圆心和半径,然后找出圆会落在屏幕的哪个区域。这个非常重要的步骤叫做设置。找到圆圈所在的屏幕区域后,可以用指定的颜色填充这个区域。这一步称为光栅化。圆所在的区域填好了,我们自然就看到了圆。b)
这是cg动画最初的基础。牢记光栅图形和矢量图形的定义,以及矢量图形的绘制方法。一般来说有两个步骤,即设置和栅格化。这在以后的3D图形知识中是非常重要的。
图形加速的逻辑加速
很久以前,所有的绘图工作都是由我们伟大而神圣的CPU来完成的。那时候显卡真的是用来“显摆东西”的。它的工作是将CPU处理过的数据“移动”到显示器上。那时候CPU工作真的很辛苦。现在,CPU越来越快,工作却越来越少。我先说一下图形加速的几个阶段。2D图像加速、Windows加速和3D图像加速。:rolleyes:
第一,简单而刚性的2D加速度
2D加速是一个历史悠久的产品。它的作用是用显示芯片代替CPU,将内存中的数据逐块移动。比如你要移动一个窗口,在没有2D加速的时代CPU都是怎么做的:1,在显存里找到窗口的地址,2,复制一行数据到目的地址,3,重复2,直到所有行都复制完。完成了。这样,当窗口很大时,CPU要处理的数据量会成倍增加,导致窗口移动速度比蜗牛爬行还慢...想体验一下吗?好,进入设备管理器,删除你的显卡驱动,然后重启...好好享受吧!嗯。多有趣啊
有了2D加速,CPU做的事情少了很多,但还是要引导显示芯片做搬运工的工作。CPU的工作:1,在显存中找到窗口的地址,2,向显卡发送“将此行复制到目的地”的命令。3.重复2,直到复制完所有的行。乍一看,好像和以前差不多,但第二步才是关键。
现在我们来分解第二步:没有2D加速:1,读取32位数据(在入门文章里!),将32位数据写入目的地。2.重复1,直到处理完一行中的所有像素。有了2D加速,唯一的任务就是:1,发送命令给显卡复制这条线。这样,2D加速确实可以在很大程度上释放CPU的负担。所以现在大家只要提到一个窗口,移动它。很光滑,不是吗?显卡负责窗口的移动。
第二,奇怪的Windows加速
对于每一个PC程序员来说,Windows都可以用“怪异”来形容。Windows专有的东西太多了,显卡不得不为Windows自己做一个加速计划。几乎没有具备全部Windows加速功能的显卡,目前CPU的速度足以弥补Windows不具备全部硬件加速的缺陷。一般来说,包括鼠标光标、图标、特殊窗口等的加速。
鼠标加速就是用显卡的硬件来处理Windows的鼠标光标。你现在看到的鼠标光标和桌面上的其他内容不属于同一层。是画在显卡的“顶层”的。具体内容不用我详细介绍了。总之我告诉你一个辨别的方法。打开一个动画窗口,即内容一直在变化的窗口,然后向上移动鼠标光标。如果光标一直闪烁,那么显卡不会加速鼠标光标。相反,如果鼠标光标不移动,则显卡会加速鼠标光标。
图标加速是显卡画Windows图标的功能。这个功能确实不多见,但是对于目前Windows xp普遍使用的32位透明图表,现代的图形加速卡可以起到一定程度的加速功能。
特殊窗口加速:窗口加速不是由2D加速功能处理的吗?它有什么特别之处?当然有。移动一个窗口,呵呵,现在你知道电脑在做什么了吧。然而,当顶部窗口挡住你移动的窗口时,也就是说,一个“总是在前面”的窗口(Windows称之为“总是在前面”)挡住了桌面,你移动了它下面的一个窗口...怎么解释呢??这时候Windows要做的事情就略有不同了。它先找到窗口暴露的部分,然后把整个窗口一个个分割成小块,再一个个移动到目标位置。是不是比较麻烦?而如果你用的是带Windows加速功能的显卡,显卡可以自己处理这一切。先不说Windows加速了,因为它太庞大了,我还没有完全理解。然后,轮到我们的主角出场了——:查尔斯:
第三,复杂而巨大的3D加速
大家都喜欢渲染3D动画(除了第一眼看晕的)。看到虚拟主角在屏幕上跳来跳去,杀戮拯救世界,谁不兴奋?说到3D加速,因为太复杂了,我打算分成五个部分,从简单到复杂,从过去到未来,涵盖3D加速的基础知识,让大家更加了解我们不为人知的3D加速卡的工作。
3.1:颜色三角形
世界就是这样开始的。人们想到用三角形来表示3D物体。其实很简单。高中学过几何的同学都知道,三点决定一个平面。所以三角形总是平的。这样复杂的曲面物体用小平面近似表示,在绘画时会方便很多。我们来看看画三角形的过程:我在上一篇文章里已经讲过画矢量图的过程了。其实三角形也相当于矢量图。它由三个顶点组成。画的过程有两步:1。找出三角形在屏幕上的位置。2.让这个地方充满色彩。也就是我说的设置和栅格化的过程。因为对象是三角形,我们给这两个过程取了另一个名字:三角形设置和三角形栅格化。呵呵,有点现代图形的味道!刚开始的时候,3D图形只有颜色,没有纹理、质感等等,所以生成的图像感觉都像是突然的光。那时候根本没有3D游戏的概念,专业人士也不会关心这些...
3.2:贴图?皮肤...+混色
显然,人们不会满足于永远看着由裸露的三角形组成的东西在屏幕上跳来跳去。于是慢慢有人想:我们在三角形上贴纹理贴纸怎么样?说到质感,看看你家的家具。它们表面的木纹真的很像三角形用的纹理贴图!纹理映射在3D图形领域的作用类似于真实家庭中的壁纸和贴纸。当时在纹理映射发明的初期,就有人强烈反对!有些人认为纹理映射没用,以至于那段时间甚至有公司生产了不支持纹理映射的显卡(你能想象没有TMU的显卡吗?我忘了公司的名字!然而,纹理映射仍然显示出其强大的魅力。在当今的3D图形技术中,纹理映射是一门独立的学科。
可能有人会问,纹理贴图是怎么粘在三角形上的?这个过程的解释是复杂的。你可以试着想象一下,纹理贴图需要坐标来指定,就像你在刚做好的桌子上画一个固定点,让贴纸对准固定点粘贴。换句话说,每个三角形的顶点都包含贴图坐标,这样在处理时就可以根据贴图坐标将纹理贴图粘贴到相应的位置。怎么贴?!我还没说呢?哦,对了,呵呵,怎么贴?事情是这样的:在三角形设置阶段,贴图坐标也被应用到每个像素。具体来说,知道了顶点的映射坐标,那么三角形中任意一点的映射坐标也要计算出来吧?!对了,是插值。利用插值,就可以得到要画的三角形的像素的每一点对应的映射坐标,对吗?有了这个映射坐标,就简单多了。我们用坐标从地图上得到相应的坐标颜色,那不就是贴地图吗?呵呵,这一段有点迂回,也是我文字功底差。请仔细读几遍。不好意思!
此外,纹理映射带来的颜色混合也应该包括在这一节中。颜色混合...我知道!不就是用一个像素的Alpha值把两个像素的操作混合成一个像素吗?没错,但是,颜色混合并不仅限于阿尔法混合。混合方法有很多种。例如,将三角形像素的颜色添加到屏幕上原始像素的颜色中,这样看起来就像三角形被“突出显示”了。游戏中的火焰、光晕等等都是通过加法完成的。同样,两个像素的颜色做减法、乘法或除法也是可以的,这一切都是——混色。正是因为有了混色,才能实现各种酷炫的游戏特效。
3.3:显卡革命
上面提到的功能,人们已经把它们放进了一些图形芯片中。这样,所有这些工作都从CPU中解放出来了。好吧!但是CPU还是不满足:我要更多的自由!人们想尽办法减轻CPU的负担。所以,最后连三角形设置和三角形栅格化过程之前的潘多拉魔盒都解放了。这就是:几何变换和光照运算(transform & amp;照明、温度和湿度;l).
说到这里,就不得不说说这两个纯数学过程了。几何变换:众所周知,我们在屏幕上看到的3D图形是从某个视点绘制的。这是怎么做到的?还有,3D物体如何在整个场景中移动?这就涉及到图形处理之前的话题:三维空间几何。每个3D对象都有一个数据数组来表示它的位置和方向,我们称之为矩阵。这个矩阵存储了场景中物体的位置、旋转方向、缩放大小等信息。所以当一个物体移动时,我们不需要详细改变所有三角形的位置,只需要改变矩阵中的信息,整个物体就移动了。而矩阵的应用不仅于此。最后,整个场景要转换到以摄像机为中心的3D空间,这也和矩阵有关。
光照,另一个数学过程,是通过三角形的顶点相对于场景中光源的位置、距离和夹角,来计算三角形接收到的光照强度。
以前这两个纯数学过程都需要CPU来完成。CPU计算完所有三角形数据后,将这些数据发送到显卡进行设置和栅格化。但是后来人们发现这些操作太死板了,竟然可以集成到显示芯片里!这就是硬件几何变换的由来。
因此,在这一点上,CPU没有什么可做的。修改对象的矩阵,设置好需要的参数,然后给显示芯片发一个命令:draw!其他的不用担心...
3.4:新CPU的诞生:GPU
那么这里的显示芯片可以称为图形处理单元吗?NVidia是这么说的,但是作为真正的处理器,没有可编程性是不完整的。厌倦了用显卡设置的层层套,程序员们大喊:放我自由!他们迫切需要一个打破当前硬件僵化功能的设计。因为一切都是硬件做的,灵活性完全丧失了。显示芯片根据电路设计只能处理三角形,成了死板的“三角形处理器”。这时,人们开始反思,人们觉得给程序员最大的发挥自由是写出好的3D程序的关键。于是——设计了一个可编程图形芯片。这种芯片不同于以往的T & amp;L芯片最大的不同就是它的所有行为都是可以编程的。从而将其功能提升到了一个无限的高度。
另一方面,在没有硬件3D加速的时候,一切都是由CPU来完成的,虽然慢,但是很灵活。然后,所有的硬件,灵活性也一再下降。最终,可编程图形芯片实现了速度和灵活性的完美结合。这个时候,程序员做的事情似乎又回到了原始时代:自己编写程序对三角形进行光照、改变和栅格化。但是这个呢?他们喜欢自由!
一切都很好,我们很高兴地说:这就是我想要的。满意了吧?但事实并没有你想的那么完美。上帝喜欢捉弄人.....
3.5:真相?谬误?
经过这么多年的发展,栅格化3D图形的技术可以说是成熟了。然而,它生成的图形似乎从来没有这么真实过。不管人们怎么努力,它的画面还是动画的,总比人们心目中的“电影级质量”差那么一点点...
到底怎么了?与此同时,三维图形学的另一个分支:光线跟踪也在迅速发展。光线追迹图形和光栅图形是基于完全不同的理论,它们的研究结果也是不兼容的。光线追迹图形学的理论基础是以眼睛为起点,追踪每一条光线,精确计算这些光线经过反射、折射、散射后的后续颜色。由于其原理复杂,这门学科比光栅图学需要更少的人力物力,所以它的优势才刚刚逐渐显现出来。而真正投入民用和实时处理阶段,还需要十年左右的时间。如果它成功了,现在所有的光栅图形理论都将被彻底推翻。