ccidnet????

出版日期:2003-03-24 总期号:510 本年期号:10

本期导读
综合报道
零组件
软件.net
游戏空间
数字新生活
办公新人类
网络与安全
教育信息化
社会培训
提升多重渲染效能
F-Buffer技术介绍
《中国电脑教育报》Jim

  目前显卡市场中ATi和NVIDIA两家你争我夺好不热闹,在高端产品方面更是你方唱罢我登场。GeForce FX还没有热几天,ATi又发布了RADEON 9800 Pro,从技术规格上看RADEON 9800 Pro更像是一块高频版的9700 Pro,并没有太多的新东西。但是,ATi宣传为其装备的SmartShader 2.1中首次加入了F-Buffer。那么这个F-Buffer是什么呢?


  概要


  实时图形硬件和应用程序正迅速地从固定的Shading(着色)运算法则转变为完全可编程的Shading。其重大意义在于可编程Shading能真实再现现实世界中的大量物品和光影效果。然而,今天的可编程像素渲染通道虽然能支持数目众多的指令,但shaders(着色器)仍将被各种资源耗尽。解决硬件资源限制的方法一般是联合硬件和软件技术。


  图1

  在现今的3D图形技术中,Multi-pass rendering(多重渲染)在提升画面效果的同时,也一定程度上克服一些硬件资源限制。当前主流的多重渲染技术是使用RGBA(红绿蓝+Alpha透明度)framebuffer(帧缓存)储存每个周期的结果(如图1)。然而,这种方法很难正确渲染局部透明的表面。另一方面,由于需要保存多于1个周期所得的中途结果,因此减低了着色器的性能。2001年,斯坦福大学电脑科学部的William R.Mark教授和Kekoa Proudfoot教授提出了解决方案。这种方法是把每个渲染周期里产生的颜色(或其他值)结果作为片段通道(Fragment Pipeline)的输出值储存在FIFO(先进先出)缓存里。进入下一个渲染周期时,储存在FIFO缓存里的内容将被输出到上层片段通道。由于该种FIFO缓存能够联合各个周期的结果(特殊的光栅化片段),因此,它被认为fragment-stream buffer (片段流缓存),也就是我们所说的F-Buffer(如图2)。

  技术

  F-Buffer能解决传统多重渲染技术使用RGBA帧缓存储存中间结果所带来的三个问题:每次只能储存一个结果、内存浪费及局部表面的透明问题。


  图2

  结果储存

  使用帧缓存储存多重渲染过程中的临时结果会导致着色器的效率低下。多重渲染着色器需要至少两个同时有效的临时结果,也就是说在着色器的执行过程中两个临时单像素变量至少被读取一次。然而,帧缓存每次只能储存一个临时结果,因此,帧缓存必须放置到其他存储空间(通常是纹理内存)为第二个临时结果腾出空间。如图3,该着色器需要帧缓存转移至一个双纹理渲染管道。当Result A运算完成后,作为结果的图像将被储存在纹理内存里使得帧缓存能被用以运算Result B。


  图3

  当然,如果硬件具有统一的纹理/帧缓存内存,这个问题可以避免,但仍留下别的问题。当今的图形卡具有很长的可编程管道,在每个周期里可以生成1个以上的中途结果。然而,由于每次只能保存这些RGBA结果中的一个,因此,其他的结果将等待在下一个周期中重新运算。这个瓶颈使同步结合着色片段变得非常困难。


  图4

  F-Buffer很好地解决了这个问题。由于片段在第一周期内完成光栅化,因此,那些包含着一个或更多RGBA颜色(或其他值)的片段数据将被储存在F-Buffer里。通常情况下,除了第一个周期外其他周期都需要读取1~2个F-Buffer,而除了最后一个周期外其他周期都需要写入1个F-Buffer,最后一个周期将把结果写入帧缓存(如图4)。虽然每次只能写入一个F-Buffer,但内存可以储存多个F-Buffer。因此,可以储存多个中途结果。一些渲染周期需要联合前两个周期的结果,在传统的流程里,一个结果在帧缓存里而另一个在纹理内存里。使用F-Buffer则可以同时从两个F-Buffer中读取所需数据,效率不言而喻。

  内存浪费

  与帧缓存相比F-Buffer能更有效、更弹性地利用显存。以渲染一个茶壶为例,帧缓存使用内存储存所有的像素包括那些并不需要进行渲染的。就算使用screen-space bounding box(屏幕窗口限制盒)减少纹理尺寸仍会造成内存的浪费。而F-Buffer只需要使用足够的内存来储存需要进行渲染而生产的片段。


  图5

  局部透明

  传统的多重渲染技术往往不能正确渲染重叠的局部透明表面。两个表面使用同一个着色器渲染在一个像素里时,后表面的中途结果会被前表面的中途结果所覆盖。当这两个值不同时(例如不同的贴图纹理坐标),下一个渲染周期便会得出不正确的后表面运算结果,从而最终造成颜色混合的结果(如图5)。当前的解决方案并不令人满意,其中一种简单的解决方法是完整、独立地渲染每个局部透明的三角形。然而,F-Buffer使用自己的储存空间来联合每个片段。因此,每个透明像素都可以被分别地写入前景与背景的信息。把F-Buffer置入片段管道使得储存在内的中途结果能被管道内的任何功能单位使用,而不仅仅是混合单元。尽管局部透明表面的渲染仍需遵循后面到前面的顺序,而F-Buffer具有自己的储存空间使得多个三角形覆盖在同一像素上时不再发生存储空间冲突的问题,从而能得出正确的渲染结果(如图6)。


  图6

  看到这里读者也许不禁会问:F-Buffer究竟存放在哪里呢?答案是F-Buffer可以存放在图形芯片(on-chip)、显存、主存或三者联合存放。最有前景的架构是以大小适中的on-chip方式和置于显存内的off-chip方式来存放F-Buffer。前者的好处是能节约显存带宽,但由于容量有限而很快被大量的几何数据所填满。折中的做法是优先使用on-chip F-Buffer,当它被填满后再使用off-chip F-Buffer,这样便能获得两者的好处。当然,F-Buffer同样存在buffer overflow(缓存溢出)的问题。一种处理方法是允许F-Buffer“溢出”到主存中。因为F-Buffer是先进先出缓存而不是随机访问缓存,所以,为它们提供多层次内存系统并不复杂。好处是把使用软件处理缓存溢出所引起的冲突减至最小。

  通过这些我们可以看出,F-buffre最大的功效在于通过更加合理的方法,使得多重渲染获得更高的效率,很大程度上减低了3D渲染过程中性能的损失,在保证速度的前提下让更精美细致的3D画面成为可能。而对于OpenGL和D3D双API的支持,更使它可以得到更广泛的支持。