精华内容
下载资源
问答
  • 什么是图形加速卡(二)

    千次阅读 2013-01-26 19:47:13
    原文:http://www.azillionmonkeys.com/qed/accelerator.html作者:Paul Hsieh-潘宏 译-2013年1月-email: popyy@...但作为理解GPU发展的历史性、技术性材料,本文真是不可多得)主机和显卡的通信粗略来说,将图形操作从

    原文:http://www.azillionmonkeys.com/qed/accelerator.html

    作者:Paul Hsieh


    -潘宏 译

    -2013年1月

    -email: popyy@netease.com

    -weibo.com/panhong101


    (译注:本文写于2000年左右,很多内容稍显过时。但作为理解GPU发展的历史性、技术性材料,本文真是不可多得)


    主机和显卡的通信


    粗略来说,将图形操作从主机传送到显卡,会通过某种命令队列(或者FIFO)来完成。主机端的图形API(比如GDI,DirectDraw/3D/X,或者OpenGL)会被分解为显卡的特定命令。这些命令会被显卡执行,完后以先进先出的方式出队。对命令队列进行写入以及调度,经常会牵扯到对内存映射显卡寄存器,或IO端口的读写。此外,也可能会牵扯写系统内存,以及使用显卡DMA等策略(我相信nVidia和3DLabs,以及Matrox都会这么做)。


    早期显卡的瓶颈之一是命令队列经常过短(通常有16个位置,原始ATI Mach64即如此),以至于主机和显卡不能充分并行工作。为此,主机端驱动程序通常可能被阻塞,等待着队列给下一个操作腾出足够位置。现代显卡中,队列的位置都进行了大量扩充,通常都会超过512个。此外,尽管显卡寄存器窗口(译注:寄存器窗口(Register Window)技术用来改善因处理器寄存器有限而造成的公共操作性能问题)已预留了一个小型队列,但仍有一部分显存会被用来当作一个溢出队列(Spill Queue),这实质上是对寄存器窗口队列的一个扩展(我认为S3是这样的)。


    有些显卡使用另一个技巧来改善队列访问性能,就是把队列内存映射到连续的内存地址上,这样,显卡将有机会利用主机芯片组的PCI突发传送(Bursting Capabilities)能力(MPACT和3DFX都是这样)。


    三角形剔除(Culling)也是越来越重要的显卡特性。对此存在一个争议:剔除应该在主机端执行以减少PCI带宽,还是在显卡中执行以最小化计算开销。问题是很多软件都是自己做剔除(因此不需要显卡驱动或显卡本身帮着弄)。究其原因,是在这些软件中,被渲染的物体往往携带诸多复杂属性,因此提前进行裁剪有利于减少后面牵扯这些复杂属性的计算开销。这也有弊端,因为有些写得比较保守的图形库程序本身也会进行背面剔除,这会导致二次剔除开销。所以,提供某种“渲染前请不要剔除这些三角形”开关,可能非常有用(对!微软,就是在提醒你!)。


    对此,我认为nVidia的方案会是:利用AGP的更高吞吐量(这就不算个瓶颈了),把所有数据都丢给显卡,让它做剔除。


    通常情况下,显卡会配有一个快速的(在PCI总线情况下足以说快了)帧缓冲,所以若需要,CPU会代替显卡,或者同显卡一道,对显存进行更新。有些显卡,比如TSENG ET6000,实际上会维护一个帧缓冲和PCI总线之间的缓存,这种情况下来自主机的访问可能只需最小的延迟等待(这可能是图形系统中RAM仲裁器的一部分)。因为没有使用任何并行机制(这对于显卡的高性能来说是关键),大家也就不奇怪为何ET6000不是顶级显卡了。


    说到主机和显卡并发存取显存,这种技术鲜为使用,因为这需要一个先进的仲裁系统,用来隔离将被用于显卡操作的显存区域。Chromatic的MPACT媒体处理器实际上有这么个仲裁特性,它对于增强Windows DIB(桌面应用程序使用的2D位图数据结构)的性能特别有用。而对于3D性能提升,MPACT存在设计上的问题。但MPACT媒体处理器软件的并行性,可以说在它的时代是最好的。


    几乎所有的显卡都有个共性,就是当主机有读写显存之需求时,显卡都要先等待所有积压的图形操作完成,命令队列被清空,才继续进行。这样,也就造成了写显存的额外代价,就是在访问显存的间隔时间中,那些积压的图形操作所产生的总等待时间(Latency)的均值。大多数显卡厂商都认定,减少操作本身的等待延迟才是唯一的解决方案。我不同意此观点。


    当前方案有这样一个前提机制来保证:一个复杂的多存取显存仲裁机制并不需要同等复杂的硬件来支持。用个简单的“操作计数器”机制就能搞定了。基本思想是,每当一个图形操作完成,操作计数器(用内存映射寄存器,或者只是显存中的一个值来保存)就递增。实际工作时,显卡驱动程序会保存一个计数的拷贝(用一个主机端计数器影射图形端计数器),该计数就是针对相应内存对象(表面、前缓冲、后备缓冲、Windows位图等等)进行操作,最终完成时的累加值。有了这个值用于计数比较,也有了命令队列长度限制用于避免计数器越界回绕,你就能知道显卡针对某个内存对象,什么时候完成了所有操作(这需要很稳定的硬件和软件以避免显存崩溃而导致死机)。


    而我的方案是:减少主机等待延迟,从而提高显存带宽。该方法的一个典型应用情景是:有一些图形操作正在传输,还有一些被积压等待执行,此时主机突然通过PCI发送了一个操作请求过来,接着显卡马上挂起当前动作,并排空内部显存仲裁器(PCI事务必须比其它设备访问内存有更高的优先级)。所以实际上,从显卡角度看,这种方式会强烈冲击性能。然而从主机角度看,直接PCI显存访问在很大程度上,可以说用马上用,不用等了(不像过去,因为过度担心安全性,必须得等到所有积压的操作完成,才能访问显存),这也就减少了主机等待。换言之,在这种方案中,系统在每个周期可以干更多活。


    我这办法不错吧?过去我跟行业里的人说过这想法,他们都不以为然,很诧异地觉得我在忽悠。现在不管那些了,反正这些东西都做出来了,也看到它们确实提高性能了,我已经证明了自己。这办法确实有用。可编程显卡,比如MPACT媒体处理器和Rendition的Verite,甚至Matrox GXXX系列,都可以毫无压力地使用我这个方法。如果是通过纯硬件方法而没有用我的办法,那还是做个硬件的操作计数器吧。


    最后,我想对前面提到的那个DMA概念,再多说一点。拥有总线控制能力(BUS-mastering)的显卡,可以通过PCI或者AGP总线,在无需CPU插手的情况下,访问非cache的系统内存(需要通过DMA)。使用这种机制进行纹理交换,以及其他内存传输操作,可增强主机和显卡间的并行性。但还得注意,这仍存在一些协调性问题(试想主机怎么能知道当前DMA传输完成?)。关于这一点,我在前面已经讨论过了(最近经常被提到的Permedia 3显卡,就可以把系统内存当作其内存控制器中的L3缓存一样使用——这提高了纹理传输的透明性和效率。比如,如果只需要某张纹理的一部分,那么显卡就可以通过AGP总线以DMA的方式,直接从系统内存里拿走那部分纹理)。

    展开全文
  • 什么是图形加速

    千次阅读 2018-04-24 15:58:41
    入门篇 ---- 图形加速 之 图形首先,我们先来咬文嚼字:图形加速卡。就是用来加速图形处理的一张扩展卡。所谓的图形处理是什么呢?纯文本时代的电脑,那一行一行的命令和文字,不叫图形处理。:-P 图形和文本是电脑...
    入门篇 ---- 图形加速 之 图形

    首先,我们先来咬文嚼字:图形加速卡。就是用来加速图形处理的一张扩展卡。所谓的图形处理是什么呢?纯文本时代的电脑,那一行一行的命令和文字,不叫图形处理。:-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 三种原色的表现能力为多少种颜色?……… :blink: 你在翻高中数学书?咳,算了,还是我告诉你吧。要把它们乘起来。结果是 256 x 256 x 256 = …. 16777216 种。哇?!这么多?好,让我们用电脑习惯的千进制来吧它分开:16,777,216 = 16M。这就是人们常说的什么 16兆色啦,真彩色啦等等。

    这里来一点插曲。如果一种染色占 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 位。用来唬人蛮不错的啊~ :P 

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

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

    这个呢,就是电脑图形的初步基础。要牢记 光栅图形,矢量图形的定义,以及矢量图形的画法。笼统地说有两步,就是 设定 和 光栅化。这在以后的 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 直到拷贝完所有的行。初看起来好像和没有加速以前差不多,可是第 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) 也在快速的发展着。光线追踪图形学 与 光栅化图形学 是建立在完全不同的理论基础上的,它们的研究成果也是格格不入。而 光线追踪图形学 的理论基础是以眼睛为出发点,追踪每一条光线,精确的计算这些光线经过反射、折射和散射等等随后的颜色。这门学问由于原理及其复杂,所以研究的人力物力都比光栅化图形学要少,以至于到现在它的优势刚刚慢慢显现出来。而它真正的投入到民用、实时处理的阶段,恐怕还要十年左右的发展。而如果它成功了,现在一切的 光栅化图形学 理论,就会被全部推翻。
    展开全文
  • 什么是图形加速卡(三)

    千次阅读 2013-02-14 10:47:40
    早期PC平台上的图形加速还只局限于2D(伴随着1989年IBM 8514显示标准问世)。但随着DirectDraw、Direct3D(最早叫3DDI)的出现,以及支持3D加速游戏(雷神之锤)的发展,3D显卡开始领军。 别看显卡厂商2D玩得转,...

    原文:http://www.azillionmonkeys.com/qed/accelerator.html

    作者:Paul Hsieh


    -潘宏 译

    -2013年2月

    -email: popyy@netease.com

    -weibo.com/panhong101


    (译注:本文写于2000年左右,很多内容稍显过时。但作为理解GPU发展的历史性、技术性材料,本文真是不可多得)


    硬件特性和主机模拟


    现阶段显卡市场受三个因素影响:价格,对游戏的支持度,以及Benchmark评分。早期PC平台上的图形加速还只局限于2D(伴随着1989年IBM 8514显示标准问世)。但随着DirectDraw、Direct3D(最早叫3DDI)的出现,以及支持3D加速游戏(雷神之锤)的发展,3D显卡开始领军。


    别看显卡厂商2D玩得转,面对3D可就为了难。不仅渲染需求复杂一大截,输出模式也增加不少。但幸运的是,对于PC供应商,前段时间以来(大概从1994年开始),大量SGI的3D加速领域专家,已开始由于SGI对PC市场的漠视态度而表现出强烈的不满(同时也对SGI要购买Cray超级计算机的疯狂想法不满)。再加上诸多高端图形公司(比如Kubota,ShowGraphics,以及Convex)先后倒闭,相关人才市场又开始活跃起来。


    有的公司(ATI,nVidia,3DFX,Chromatic Research,Rendition)抓住了这个时机,开始招兵买马,攻城夺地,在整个图形市场掀起了一场3D大战。而另一些公司(比如Cirrus,TSENG以及Trident)则损失惨重,失败出局。


    总之,很多早期的3D基本问题现今都得到了解决并产品化。下面这个次序不分先后的列表向你展示了3D行业的血泪史:


    • nVidia NV1(Diamond公司推出的EDGE 3D系列显卡所采用的芯片)使用了特殊的API来加速二次面片(Quadratic Patches)的渲染。然而,这块芯片却自立标准,并且运行缓慢,还申请了专利。这一切注定了它的灭亡(nVidia因此放弃了该方案,走D3D专用显卡路线,并强调显卡品质)。
    • ATI Rage 3D-尽管在市场上表现良好,但它最初版本的架构却不尽如人意,而且还无法正确地进行纹理透视矫正。(Ziff-Davis对于该缺陷的公开评测和宣传对ATI产生了必然的影响。)
    • Virge-如Rage一样,在市场上表现良好,但这主要归功于其低价格。它无法对纹理映射进行3D加速,并且需要非常频繁地和主机进行交互。(消费者对于该产品的失望态度,导致了S3几乎一年的亏本。虽然后来他们对“Savage”架构进行了精简并收到了一些市场反馈,但却是杯水车薪,并在近期被VIA收购。)
    • Matrox Mystique-也没有对纹理映射进行硬件加速,该架构由于主要采用软件渲染,失去了同真3D显卡的竞争力。(Matrox已经重新设计了3D架构并与推出了G系列显卡,完全抛弃了之前的产品。)
    • MPACT媒体处理器-对3D完全设计不足。尽管架构有所创新且功能强大,但并未针对现代3D性能进行优化。(Chromatic被分拆并卖给了ATI和mcc在线。)
    • Pyramid 3D-其超长指令字(VLIW)并不能作为超标量(Superscalar)硬件图形管线的替代品。像MPACT一样,它设计得足够灵活,可以支持的基本特性包括:凹凸贴图、置换贴图、非三角形图元,但不支持行业标准API,所以也就没法产品化。(TriTech已不再支持Pyramid 3D架构。Pyramid 3D已经更名为“BitBoys Oy”,其架构师们早已在开发一个叫做Glaze3D的新架构,但该架构仍差强人意。)


    现在消费者都追捧nVidia RIVA 128这样的显卡。它完美支持D3D API,没多余特性,而对于微软的图形要求又毫不含糊。OpenGL仍是二等公民,但越来越多的显卡厂商开始采用它来支持Quake,这让微软也不得不给它留有余地(这是一个重要参考信息)。


    基本上,支持透视矫正纹理映射就可以称为一块3D显卡。然而,显卡所支持的特性却越来越丰富,这主要由于厂商竞争加剧,以及大量的软件图形需求,包括:内建三角形装配,mipmap,雾化,双线性、三线性以及各向异性纹理过滤,alpha混合,(边缘)抗锯齿,图像点画/抖动,纹理压缩以及多重纹理。


    这些特性在SGI架构下经常被分成一个大的3D流水线的不同阶段。流水线大致如下所示:




    我同一些硬件专家进行过讨论,追求3D流水线的最高性能,其实可以归结为“靠门电路解决问题”。举个例子来说,某些特定阶段有必要多周期化(Multicycle),比如透视矫正除法。但是一个除法(或者其近似)可以通过完全流水线化的单独时钟周期来完成。所以除法阶段可以转换成多个部分的除法周期。这虽增加了等待延迟(Latency)但允许吞吐量增加到每时钟周期一个像素。


    为了超越每周期一个像素的吞吐量,可以用多条流水线在每个周期计算多个像素。最简单直接的办法就是并行地计算和该像素邻接的一堆像素。这也是nVidia的TNT所使用的方法。然而有些厂商(3DFX)则采取了扫描线交错方式。该方法实际上更简单,因为它可以被分解到多个处理器中(对于后面的内存带宽分解来说也方便一些),但这种方式对于硬件的使用并非高效,因为并非所有阶段都可以被重复,或需要被重复。也就是说很多重复的门电路应该可以重新排布以提高性能。3DFX经常将其标榜为保持“扩展性”的绝佳方案,因为这是一个提高3D性能的快速方案,而不是等待公司重新设计一个架构。(这也是为什么Voodoo架构代替了RIVA成为领头羊,直到遭遇TNT架构。)


    三角形装配在输出到扫描线之前,需要花费几个周期进行预计算(排序、增量计算、边界设定)。所以,很容易将其并行化,以很高的速率进行扫描线输出,并将结果缓冲到扫描线队列中。通过这种方式,前面被输出到相应扫描线的三角形就可以被后面输出到这些扫描线的三角形在必要时自然地覆盖掉。这种缓冲方式也可用于补偿未被缓存的纹理源初始访问开销。


    最后一个方法,也就是粗暴地增加一个更大的纹理缓存,这只不过是“靠门电路解决问题”的另一个更贴切的例子。其实这也就是门电路数量如此简单的事儿。


    硬件端不支持某个渲染特性,经常意味着软件端会在无该特性下继续运行,当然质量会降低一些。来自微软、图形厂商以及软件开发商三方的合力将会提高硬件特性的标准,并让传统桌面PC纳入到图形工作站市场。


    像MPACT媒体处理器或者Rendition Verite这样的可编程架构,在产品定型后仍允许在软件中加入一些特性。可惜的是,由于市场并未大量接受这样的产品,这样的产品灵活性也并未被实现。


    更新(译注:本文跨越多年,作者不断对其补充更新):ATI已经增加了多个MPEG加速组件(动态补偿以及IDCT)。nVidia已经增加了蜡板缓冲(译注:或模板缓冲,Stencil Buffer)(一种低成本的基于OpenGL的方法,以用于实现阴影或其他类型的投影)。Matrox增加了凹凸贴图。3DFX以及BitBoys将增加积累缓冲以应付抗锯齿(3DFX管它叫T-Buffer)。ATI、3DFX以及Matrox已经加入TV信号接收能力。高端市场中,3DLabs增加了板载的变换与光照处理(T&L)硬件。这些近期的硬件特性,极具代表性地体现了图形市场的不断创新精神。如3DFX的多重纹理特性所体现出地,所有这些硬件特性终归会被所有厂商所支持。


    更新:nVidia和ATI增加了T&L,以及复杂的像素着色器,以支持逐像素凹凸映射以及光照效果。3DFX的T-Buffer已经出了,幸运地受到了好评(特别是对比其竞争对手们通过软件实现的该特性)。但我们还没有看到Matrox的任何动作。

    展开全文
  • 什么是图形加速卡(四)

    千次阅读 2013-03-02 11:44:58
    原文:http://www.azillionmonkeys.com/qed/accelerator.html作者:Paul Hsieh-潘宏 译-2013年2月-email: popyy@...但作为理解GPU发展的历史性、技术性材料,本文真是不可多得)显示器刷新最后一个瓶颈,关于显示器刷

    原文:http://www.azillionmonkeys.com/qed/accelerator.html

    作者:Paul Hsieh


    -潘宏 译

    -2013年2月

    -email: popyy@netease.com

    -weibo.com/panhong101


    (译注:本文写于2000年左右,很多内容稍显过时。但作为理解GPU发展的历史性、技术性材料,本文真是不可多得)


    显示器刷新


    最后一个瓶颈,是关于显示器刷新问题的。如我们在显存带宽一节中所说,显卡会消耗一定量的内存带宽用来更新显示器。然而为了避免画面撕裂(Tearing)和闪烁(Flickering),3D应用程序一般会采用双缓冲。也就是在两个帧缓冲之间进行切换的过程中,显示器会使用当前没有被更新的那个帧缓冲(稳定的、可显示的那个缓冲)来刷新自己。如果你想更深入地了解非硬件加速的,用来解决闪烁问题的双缓冲机制,可以阅读我的这篇“无闪烁动画”文章。


    在任何情况下,当准备用显存的某一部分刷新屏幕以更新画面前,为了避免画面撕裂,必须等到当前刷新动作(还没完成的)完成后才能继续进行。通常这需要等待“垂直回扫(Vertical Retrace)”的完成。然而该“等待周期”,是由显示器本身的规格决定,而非CPU或者显卡决定,这和处理器标准相比太慢了(比如,在一个72Hz的显示模式下,该速度是平均1/36秒刷新一次)。


    下图展示了显示器扫描枪的路径:


    如图所示,有些固有的实时事件会按时发生(否则显示器就无法正确工作)。每个事件的长度由显示器的当前模式所决定,这些模式被编好,并放入显存数模转换器中,该转换器通常被称为RAMDAC。RAMDAC必须拥有一定的显存用于在需要时立即执行行刷新(Line Refresh)。有些旧式显卡由于显存带宽限制而无法工作在特定模式下。甚至一些现代显卡也会因严格的显存带宽原因,在高分辨率下(比如1280x1024x24,72Hz)运行缓慢,或根本无法工作。


    前文曾提到,VRAM最初用于试图解决带宽问题(允许每周期多次显存访问),但它的成本较高,并且由于其复杂度导致时钟频率受限。较新的解决方案,是简单地将前面刷新时访问到的数据,缓冲(Buffer)到RAMDAC中的一个小的缓存(Cache)中,这样新的行刷新数据访问,就可以和之前访问时的RAMDAC输出,或水平回扫事件,存在时间上的交集。这种方案比较经济,比VRAM方案有更好的伸缩性,但要在技术上达到准确,这需要一个灵敏的显存仲裁器。


    一般来说显卡厂商并不会开发精密的显存仲裁器,而只会给予足够大的显存带宽,以满足任何实际的带宽需求。这就导致在特定(经常会重复发生)情况下(比如一个比较大的通过总线传输的数据进入帧缓冲中),画面会产生“闪烁”,因为它无法访问到还没有传输完成的必要数据,以更新屏幕的特定部分。但市场证明了该方案无法被消费者接受,因此显卡厂商要么降低了最大刷新率,要么禁止了高分辨率,都是为了避免这样的显示问题。


    过去还有一种方案,就是显示器的“交错模式(Interlaced Mode)”。这种模式下,每次屏幕刷新时只进行隔行刷新,奇数行和偶数行交替进行(NTSC制式的电视就是这种模式)。这降低了一半带宽,但导致了低质量、不稳定的输出。这种方案仍无法被市场接受,从此消失了。


    在任何情况下,准确决定翻转帧缓冲的时机都是很重要的。大多数显卡都配有一个内存映射寄存器,用来返回当前正扫描的模拟信号显示行,也可能配有一个标识回扫结束的触发器或中断这种能够被主机监测到的机制。所以很简单:等待命令队列清空,接着等待扫描枪光束抵达屏幕底部,然后就开始翻转帧缓冲(把扫描地址设置为另一个帧缓冲的首地址)。如果显卡的渲染速度大于等于显示器刷新率,就不会对渲染速度产生影响,但在当前(1998)的技术水平下,这基本无法做到,因此高分辨率往往会产生较大的性能波动。


    以上这个同步问题很棘手,这促使了厂商Ziff-Davis让两个评测软件(3D WinBench以及他们的一个新的纯应用评测程序)避开了这个同步问题。此行为让我感到很厌恶。Ziff-Davis还有那些对其施压让其就范的显卡公司,难道就不能意识到,完全可以通过适当的架构而不费力地解决该瓶颈吗?就像我们解决遇到的其他那些问题一样。


    总之,这里的主旨是尽量避免“回扫等待”。对此我提出过一些实施策略,这里我通过一个例子来概述了我的观点(MS-Word DOC格式,StarOffice也能打开它)。文章的中心思想是:越靠近RAMDAC做帧缓冲翻转,所需等待的时间就越短。另外这些策略也没有什么开销。


    最后,为了避免在SGI流水线架构下的各种等待开销,显卡必须必须引入一个三缓冲模式,这在我的“无闪烁动画”文章中有所描述。这当然不是最令人满意的方案,因为专用的纹理显存经常会带来更全面的性能提升。


    当然,如果显卡厂商仍然很白痴(比如nVidia)的话,就算三缓冲也并不能解决所有问题。实现三缓冲机制的一个典型错误,就是当两个后备缓冲填充完毕的时候,渲染被暂停以等待前缓冲完成其显示,然后再按照顺序翻转两个后备缓冲,这总是以特定的顺序进行。这种错误的实现方式只会不断地导致暂停而没有根本解决该问题(这让人们错误地以为,未来他们应该需要四缓冲、五缓冲、六十九缓冲...)。


    正确的实现会分清楚4种显示缓冲类型:


    (1)当前正在显示的;

    (2)当前正在填充的;

    (3)填充完毕还没显示的;

    (4)废弃的或还没填充的。


    基本上规则是:显示指针会被设置到(3),然后把之前指向的缓冲设置为(4)。当要找一个新的缓冲来渲染的时候,应该选择(4)或者最长时间没有更新的(3),完成后把缓冲设置为(3)。使用这个规则,显卡或主机都不需要暂停。


    以上我们分析了在SGI架构下所有可能产生回扫延迟的可能。然而,延迟渲染(Deferred Render)却产生了更多的延迟可能,这将在后面架构一节进行讨论。

    展开全文
  • 什么是图形加速卡(一)

    万次阅读 2013-01-23 15:22:59
    当前图形加速卡质量通过以下这些指标来衡量,包括:屏幕分辨率、刷新能力、TV输出兼容性、视频回放、图像质量、2D GUI图元绘制。但当前都看它们的3D能力,只支持2D的显卡已不再被重视。关于2D和MPEG视频方面,虽然...
  • 图形加速卡技术

    千次阅读 2004-11-09 18:33:00
    入门篇 ---- 图形加速之图形 首先,我们先来咬文嚼字:图形加速卡。就是用来加速图形处理的一张扩展卡。所谓的图形处理是什么呢?纯文本时代的电脑,那一行一行的命令和文字,不叫图形处理。:-P 图形和文本是电脑...
  • 图形加速卡技术(大众扫盲篇)

    千次阅读 2013-09-04 15:11:09
    恕我罗索一两句,这里的名字图形加速卡技术论坛”,可是情景完全不是这样啊。选购,改卡,甚至游戏也技术,我倒不说什么,可是n 多人在这里说些完全没有关系的话题,或者让人看了完全摸不着头脑的东西,给我们...
  • [资料] [转载] 图形加速卡技术 [专业的基础技术文章] 图形加速卡技术论坛:1.入门篇--图形加速之 图形 (发表于GZeasy.com: Jul 20 2003, 04:14 PM) 正题:入门篇 ---- 图形加速 之 图形 首先,我们先来...
  • GPU图形加速处理器 GPU(Graphic Processing Unit),中文翻译为“图形处理器”。与CPU不同,GPU专门为处理图形任务而产生的芯片。从这个任务定位上面来说,不仅仅在计算机的显卡上面,在手机、游戏机等等各种有...
  • 恕我罗索一两句,这里的名字图形加速卡技术论坛”,可是情景完全不是这样啊。选购,改卡,甚至游戏也技术,我倒不说什么,可是n 多人在这里说些完全没有关系的话题,或者让人看了完全摸不着头脑的东西,给我们...
  • 显卡全称显示器适配卡,现在的显卡都3D图形加速卡。它是是连接主机与显示器的接口卡。其作用将主机的输出信息转换成字符、图形和颜色等信息,传送到显示器上显示。显示卡插在主板的ISA、PCI、AGP扩展插槽中,...
  • 显卡什么用的?

    千次阅读 2007-04-05 15:17:00
    显卡又称显示器适配卡,现在的显卡都3D图形加速卡。它是是连接主机与显示器的接口卡。其作用将主机的输出信息转换成字符、图形和颜色等信息,传送到显示器上显示。显示卡插在主板的ISA、PCI、AGP扩展插槽中,ISA...
  • 很久以前,大概2000年那时候,显卡还被叫做图形加速卡。一般叫做加速卡的都不是什么核心组件,和现在苹果使用的M7协处理器地位差不多。这种东西就是有了更好,没有也不是不行,只要有个基本的图形输出就可以接显示器...
  • Pytorch-GPU加速

    2021-04-19 20:03:45
    Pytorch-GPU加速1、什么是GPU加速计算2、在Pytorch使用GPU加速 1、什么是GPU加速计算 GPU,又称显卡、视觉处理器,一种专门在个人电脑、工作站、游戏机和一些移动设备(如平板电脑、智能手机等)上图像运算工作的...
  • AGP是什么接口

    2021-05-25 09:36:54
    AGP 即为加速图形端口,用于高速视频输出的点对点通道。此端口用于将显卡连接到计算机主板。AGP 的主要目的是加速高清视频的 3D 图形输出。与 PCI 相比,AGP 提供更快的连接和吞吐量。AGP 主要用于 3D 图形,高清...
  • 什么是GPU呢

    2019-09-17 08:44:03
    显卡的处理器称为图形处理器(GPU),它显卡的“心脏”,与CPU类似,只不过GPU专为执行复杂的数学和几何计算而设计的,这些... 时下的GPU多数拥有2D或3D图形加速功能。如果CPU想画一个二维图形,只需要发个指...
  • GPU硬件加速

    2016-03-26 00:18:31
    了解什么是GPU硬件加速,需要先了解什么是GPU; GPU(Graphic Processing Unit)图形处理芯片: 它显示的“心脏”,也就相当于CPU在电脑中的作用,它决定了该显卡的档次和大部分性能,同时也2D显示和...
  • 初探GPU硬件加速

    2021-06-03 10:28:23
    GPU相对于CPU的一个概念,现代计算机中图形处理的重要性日益提高,GPU一个可以专门用来处理图形的核心处理器,现代浏览器大多可以利用GPU来加速页面渲染。 注意,图形渲染GPU问世的初衷,但
  • 什么是计算机图形学: 计算机图形学:真实世界(不限于)的数字模拟(虚拟世界)。研究如何在计算机中...图形硬件:研究图形要有基本的支撑硬件,包括图形加速卡、显示器、图形输出设备等等。(不是本课内容 生...
  • GPU硬件加速概念

    千次阅读 2015-03-04 17:04:56
    在不少人的心目中,显卡最大的用途可能就只有两...那么GPU硬件加速到底是什么?能干些什么呢?下面让我们一起走进GPU硬件加速的世界去看看吧。 GPU硬件加速就是显卡辅助CPU进行图形运算 要说起GPU硬件加速,我们首先要
  • PAGE / NUMPAGES 嵌入式linux中文站发现很多LINUX初学者在学习linux图形方面的知识时会遇到一些概念如XX11 Xfree86WMKDEGNOMEQTQT/EQtopiaDirectFBFramebuffer显卡加速驱动等等理解它们之间是什么关系对我们学习来说...
  • 硬件3D加速指南

    2014-02-22 12:35:34
    什么是硬件3D加速,为什么我需要它? 使用硬件3D加速,三维渲染将会使用显卡上的图形处理器来进行,而不会占据宝贵的CPU资源来绘制3D图像。它也被称作“硬件加速”而不是“软件加速”,因为如果没有这个3D加速,你...
  • 核芯显卡

    千次阅读 2012-05-12 19:58:19
    简介  核芯显卡新一代的智能图形核心,它整合在智能处理器当中,依托处理器强大的运算能力和智能能效调节设计,在... 什么是核芯显卡?核芯显卡建立在和处理器同一内核芯片上的图形处理单元。简而言之,就是与处
  • Windows的图形代理为Teradici的最新协议增强功能PCoIP Ultra提供了支持。 PCoIP Ultra经过优化,可提供真正精确的无损支持,并具有位精确的色彩准确性和以最高帧速率保留内容细节。 最高可以支持到4K/UHD分辨率的...
  • LINUX硬件3D加速指南

    千次阅读 2010-09-21 20:58:00
     解释什么是硬件3D加速,为什么我需要它?使用硬件3D加速,三维渲染将会使用显卡上的图形处理器来进行,而不会占据宝贵的CPU资源来绘制3D图像。它也被称作“硬件加速”而不是“软件加速”,因为如果没有这个3D加速...
  • OpenGL系统设计-1.1什么是OpenGL

    千次阅读 2009-10-24 12:10:00
    1 OpenGL基础1.1 什么是OpenGLOpenGL全称为Open Graphics Language,意思开放的图形程序接口,一种用于3D渲染和3D加入的跨平台标准,换句话说OpenGL一种3D API,3D加速卡硬件和3D图形应用程序之间一座重要...

空空如也

空空如也

1 2 3 4 5 6
收藏数 110
精华内容 44
关键字:

图形加速卡是什么