● 沙子-沙漠效应
为了接近真相,我们要在这里引入一个重要的概念——沙子-沙漠效用。所谓沙子-沙漠效应,其实是几个从量变到质变的过程的集合。
如果您手里有一粒沙子,而你想要一小堆沙子,那好办,只要再找几十几百粒沙子就可以凑成一小堆了。
如果您手头有了一小堆沙子,想要一捧沙子,那也好办,不过是几百万粒沙子而已,弄起来不会很难。
如果您有了一捧沙子,想要一大堆沙子,也不是不能办,几百上千亿粒沙子而已,找个铲子一铲子下去就能有几亿,不几下就搞定了。
如果您有了一大堆沙子,想要一片沙地,这可能就不好办了,沙子有多少是数不过来了,不过也不是不能办,多花点时间就可能做得到。
如果您有一片沙地,想要一个沙漠……
这就是沙子-沙漠效应。他的描述性解释应该是——在最小单位不变的前提下,体系在简单的基础上向复杂方向的每次质变都会比前一次质变更加困难,更加接近不可完成。
这个概念我们将会在今后的文章中遇到两次,作为其中的第一次,就让我们把这个效应应用到shader过程中,去看看究竟发生了什么吧。
最开始,透过几十段shader代码就可以实现单纯的纹理操作无法做到的效果,它可能只是改变了几百个关键像素而已,您的眼前一亮。
接下来,这种效果看多了,您习惯了,于是希望看到更加真实的效果,这种效果的提升导致代码从几十段变成了几千段,而且其中开始出现了各种复杂的比如跳转和条件分支之类的操作,它开始面向所有场景中的像素了,您的眼前又是一亮。
然后,新的效果您又看厌倦了,为了迎合您的需求,代码从几千段变成了几十上百万段,它不仅面向场景中所有的像素,而且其中开始出现了复杂的光线和颜色交互关系的变化,您的眼前勉强的又亮了一下。
现在,很明显新的效果您再一次厌倦了,于是代码开始变成上千万段,它在原有的基础上甚至将直接执行的数学代码都引入进来以便为体系计算更加真实的光线关系提供运算能力,所要处理的像素也经常要根据实际需要再次甚至多次的重新回到流水线中一遍一遍的处理正确的颜色表现。
每一代微软发布的新API所能够产生的特效都是美好的,越来越趋近真实的,但这种真实是建立在日益累积的复杂度之上的,这些特效的基础,也就是每一段代码都是程序员一个字母一个符号的敲打而成的。如果在这么发展下去,当您对现在的特效再一次厌倦了的时候,程序员们该如何去面对可能会达到几十亿段代码级别的编程需求呢。