● 上帝说,像素要有光
要方便的了解Deferred shading(延迟着色)技术以及他跟Compute Shader的关系,我们首先要回顾一些关于像素和光线的基本知识。构成我们所看到的场景的最基本元素是顶点和像素,其中顶点负责几何构造的形状以及一些特定参数的表达和搭载,比如重力或者高度,而像素则负责最终图像的颜色表现问题。不管是怎样的场景,要达到真实的感觉,像素表达出正确的符合物理规律的颜色是重中之重。
所谓正确的符合物理规则的颜色,指的就是物体固有的颜色与光线交互作用之后的结果。任何物体处在自然环境之中都要与周遭的光线发生关系,最基本的包括反射,折射,漫反/散射等。如果剔除了这些光线关系,物体的立体感不仅会丢失,整体上给人的感觉也会极为不真实。而如果使用了错误的光线关系,日常生活中的经验也会让我们敏锐的产生各种不真实感。所以,要表达趋近于真实的视觉效果,正确的符合光学规律的像素是必要的要素。
让像素表达正确的颜色有两个途径——开发者可以在预制阶段事先烘焙好含有正确颜色表现的材质,再结合光照材质和预先设定的颜色信息来完成场景效果的光影关系。或者在编程阶段为程序添加含有正确光线关系的代码,让程序在运行过程中实时计算像素应该具备的正确颜色,然后通过fillrate过程将正确的像素填进纹理。
预制纹理的方式对硬件没有多少运算能力的要求,只需要进行单纯的材质操作即可完成场景的表达,对硬件来说操作效率很高。但因为所有效果全部需要预先烘焙而成,在游戏过程这种讲究高自由度高互动性的场合,开发者不可能把所有可能性都考虑进去——玩家总能在最意想不到的地方做出最意想不到的事情,靠对行为的猜测来构筑的场景最终总能被好奇心爆棚的玩家用各种方式找出破绽,所以单纯依赖这种操作方式必定会导致很多错误的或者说不真实的效果表达。
如果在程序运行过程中根据场景的互动需要实时的进行计算,然后将计算好的正确结果填充进纹理,就可以在过程中顺应实时变化的要求,使用正确的像素来表达正确的效果了。Pixel Shader的出现就是对应了这种要求。只不过这种操作方式需要专门的运算单元来处理关于颜色相关信息的计算和操作,对硬件的速度和效率有极高的要求,在实际应用中必须考虑硬件执行环境的能力以及其对最终图形过程的影响。为了平衡效率和对硬件的要求,现代的图形应用如游戏的特效都是大量采用Pixel Shader结合烘焙纹理和光照贴图的综合手段来的完成的。