既然像素处理过程就是处理像素,那我们为什么还要现在物体表面蒙上一层预先烘焙好的材质作为基础呢?反正这些材质上大部分的颜色都不是正确的,到头来还是需要ALU对其进行运算并完成修改,那为何不直接让像素处理单元直接在正确的位置上生成正确的像素呢?这样既可以避免改错这么一个看上去似乎没有必要的步骤,又可以用原本进行材质操作的单元的晶体管来进一步强化ALU部分,让其拥有更强大的功能,何乐而不为呢。
shader与Texture是一对“好碰友”
答案很简单——因为现在的ALU根本没有那个本事面对直接生成像素所带来的运算量。
我们在本文中反复强调过,像素的处理过程从本质上来说并不复杂,其巨大的执行难度并不来自步骤的繁琐,而是来源于对大量像素进行数学关系运算所导致的运算量,这10年来针对shader反复的折腾其实也只是因为人们对执行单元能够更加高效的处理数学关系的渴求。在以前的文章中我们曾经面对过类似的问题,当方程的数量达到一定级别之后,对于运算单元的压迫将让任何本来看上去很和谐优雅的方程式变得丑陋无比。而随着程序员和用户对效果要求的不断提升,对于像素处理的方程总量在未来将呈现出明显的只增不减的态势。更加复杂真实的光照模型,更加多变且逼近现实的光线传递效果,甚至包括更多像素透明度遮蔽所带来的混合,这些都让目前的ALU单元承受着巨大的压力。在这种情况下,要让ALU去独立生成全新的像素,为ALU添加一个近乎于100%增幅、甚至比这个还要大得多的像素处理压力,显然是不现实的。
为了减轻这种压力,人们历经10年,不断地压榨着半导体工艺的极限,以期能够在GPU内部塞下更多的运算单元;不断地改进着运算单元集合的逻辑关系,以期能够让它们尽可能高效率甚至全功率的运作起来;不断地开发着如Compute Shader之类能够尽可能多的以灵活的运作手段和更加贴近纯数学的应用方式来解决问题的方法,以此来进一步提升ALU在处理过程中的效率,并进一步压榨ALU的价值。对于材质的操作,也是这些努力中的一部分。预先烘焙好的材质可以带来大量已经具备基本效果关系的像素,这些操作上相对廉价的像素中会有相当一部分不需要被处理,直接使用材质可以大大减轻ALU单元的负担,让已经不堪重负的ALU得到喘息。
所以,在我们可见的未来中,对于shader的处理依旧只能跟材质操作紧密的联系起来,Direct Pixel这种东西,相对来说还是一个遥远的梦想。