Pixel Shader中的帧缓存操作
我们时常会遇到一些对图象进行附加处理的工作,比如说数字图象分层、色彩校正以及对某些部位增加色调。然而,在DirectX 9中,由于大部分情况处于实时渲染模式,我们无法读取正在处理的某一帧图象中的某一个象素值,同样我们是否写入了某个值也是不被保证的。事实上,绝大部分的图形处理芯片(GPU)都能够让我们读出当前渲染的某一帧图象中的纹理数据,但这并非是一个合法的行为,因为在任意时刻这样的操作都可能被中断,而开发人员通常都不鼓励使用这项功能。解决的办法就是建立两个独立的纹理,并从中选一进行附加操作,但这样就要消耗两倍的存储空间。到了下一代DirectX技术,开发者终于如愿获得他们最希望得到的功能——直接在Pixel Shader中对帧缓存进行操作的功能(目前仅限于Pixel),但拥有支持下一代DirectX技术的显卡并不意味着实时渲染模式就没有问题,或者是在新一代显卡中甚至根本就放弃了对这种技术(直接的帧缓存操作)的支持。这项技术很可能只是作为一种可选的功能出现,如此一来,程序员在开发程序的时候就可能会忽略这项技术的存在或者采用旧的办法来解决问题。
帧缓存操作 | |
#$[*106951.jpg*#a*#0*#0*#center*]$# | 帧缓存操作
|
点击看清晰大图 |
如果这项技术被要求为强制性的标准,那么我们就必须在Pixel Shader当中实现目前已有的固定混合函数的功能,但我们可以省去附加对象定位的开销。而实际上,不少硬件厂商都可能选择放弃在硬件中实现固定混合函数,取而代之的做法就是在Pixel Shader中模拟混合函数的功能,ATi已经在他们的GPU芯片中加入了类似的做法,他们通过Vertex Shader来模拟原有的固定Vertex处理函数。这样就意味着图形处理器设计厂商需要在Shader处理器上增加额外的晶体管以更加高的效能实现以上的功能。我们也期待硬件厂商能够实现这方面的功能。