荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: belong (属于......), 信区: Hardware
标  题: 图形加速卡技术论坛:3.进阶篇--显卡的职责
发信站: 荔园晨风BBS站 (Tue Jul 29 15:14:24 2003), 站内信件

http://bbs.gzeasy.com/index.php?showtopic=35274

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

回顾:原理篇里,我简要的讲了一下图形加速是什么,显卡是怎么给图形处理加速
的,以及长长的 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 系列显卡在运行现有的多贴图的游戏时,速度非常
的快。

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

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


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

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

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

下次再见~~

--
※ 来源:·荔园晨风BBS站 bbs.szu.edu.cn·[FROM: 61.144.235.40]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店