|
|
首先你要清楚,3D图形是可以用定点数来计算的,包括顶点、setup、z-buffer、fragment、pixel、texture等等,例如现在不少的手机跑的真3d图形都是定点数跑出来的。最初的3D图形芯片最基本的定义就是是否具备z-buffer,然后是setup、透视纠正等等,后来是multi-texture,在这个阶段里,只有setup、depth buffer也许还有透视纠正或者说纹理定址是使用到浮点。
在nvidia提出GPU后,引入了T&L,这个时候GPU开始具备了较大规模的浮点运算单元,但是T&L还只是属于固定功能的,而且无法把结果直接输出到内存里。
到了gf3的时候,人们引入了vertex shader以及所谓的texture shader开始提出,基本上就是纹理定址单元跑一些计算,纹理定址单元式fp32的,算是具备一定的浮点计算功能,vs虽然是fp32,但是作用仍然只是限于计算顶点。
nv3x/r3xx的时候,引入了fp16/fp24/fp32等多种pixel shader精度,ps可以把结果输出到内存(vs也可以但是采用的方式是r2vb,你得到的格式只能是vb),但是仍然是一个个框或者说是矩阵的格式,而不是数据流。到了这个时候,你可以把gpu看作是具备一定限制(精度、流控制等等)的fpu矩阵(事实上gpu此时能跑的不只是浮点,还有继承自前辈的定点纹理、简单的整数计算等等)。
nv4x/g7x/rx1000时代,人们在ps里引入了流控制,可以执行分支指令以及其实在nv3x时候就有的一些简单的整数、字符串指令。
g80/r600时代,配合cuda/ctm等gpgpu界面以及stream out,突破了基于frame的数据格式,能够实现数据流输出。
现在在g80/r600的shader里,不仅有fpu,还有fxu,但是为了方便和tmu、rop等简单的区分,加上其中的一些单元的指令发射端口是重叠的,我们都把fpu、fxp这类可编程资源的运算单元统称为ALU,它们不只是跑浮点。
大家看到的pixel是setup engine把3d坐标转换成屏幕光栅坐标的点,从这一刻开始3d从前面连续的顶点、图元、几何模型开始变成是离散的屏幕栅点,进入fragmet处理阶段(还没变成最终渲染结果的屏幕光栅点),经过fragmet处理、贴图、多取样后的最终结果就是pixel,大家看到的pixel都是离散的,也因为这样才需要在低精度的显示设备上作多取样降低锯齿现象。现在的显示卡提供的pixel rgb精度大都是8-bit int,三原色分别可以显示256个等距灰阶,对于22英寸屏幕大都是1600分辨率等级,跑跑游戏是基本足够了,对于你来说,就是所谓的连续吧。
gpu仍然在不断地向cpu靠拢。
最后,希望大家不要动不动就拉到google上,很多东西都不是简单靠google搜索出来的,类似这样的问题就是例子了。 |
|