崩溃中,终于翻译完了,不管到底翻译得如何。 很久没有这样熬通宵来翻译文章的了,天天被外包折腾,夜里唯有的时间只能用来做自己想做的东西。我应该是属于昼伏夜出动物,这样才能满足自己的喜好和习性吧? 由于机缘的巧合,去年开始,自从在工作中被迫接触到这个技术之后,就不断被Unreal的Deferred Shading所郁闷,灌输和洗脑。事实上,一开始的不熟悉导致我很多的误解,但是,当确实体验到他的强大的时候,我开始不能自拔,痴迷于各种各样的资料——褒的,贬的,中性的。 痴迷并不意味着迷信,事实上,我认为,Unreal无论外面的评价有多好,但他在DS上的实现并不“正统”。以至于我们对一些亟待解决的问题进行处理的时候,显得畏首畏尾,无可奈何,直到最近,才敢于去探索和处理一些必须的东西。不过这也可能是我们的项目类型和中国的大环境所限制的,因为,无论如何,你不得不承认,《战争机器2》是个好游戏——起码看起来是。而基于同一套技术,只是在具体实作方面走向了不同方向的游戏名单,则可能还包括《杀戮地带2》,《星际争霸2》,《Crysis》……只不过,因为引擎其它部分极低效率的影响,无法发挥Deferred Shading的高光源,高面数优势,因此让我们觉得麻烦而已。 对于任何新技术,都有一个从旧到新转化时,所需付出代价的问题,那么,写一个基于Deferred Shading的引擎到底有多难?我觉得不难:从今年的一月份开始铺量,直到现在大约出了效果,也就是两个月的时间——或者说两个月的晚上4小时——请注意这中间并不是在使用原来的那套工具集,而是同时重头开始编写的Gamer Class,而绝大多数时间,其实并不是浪费到了Deferred Shading本身,而是浪费到了这套渲染系统上。 诚然,现在Gamer Class的Deferred Shading还很弱小,弱小到了只能在DEMO里通过硬硬的编码来完成,而无法做到如Unreal,星际,Crysis那样的广度和深度,但从学习这个技术过程中吸取的给养,很可能已经超过了我此前所学的各种技术的总和。 曾经有人把Deferred Shading夸得很强大,也曾经有人把Deferred Shading贬得一文不值,不过可能维持正统思想的程序员还是多数——“没有什么技术是正确的,也没有什么技术是错误的”。技术本无对错之分,就要看技术用在了谁的手里,用在了什么样的目的上。目的是第一位的,一切均服务于目的,目的高于一切,强于一切。Deferred Shading既不强大,也不弱小,它类如其他任何技术一样,只是在享受好处的时候需要刻意去避免麻烦,仅此而已。还是那句话:标榜解决了一切的技术一般都什么没解决,而标榜没有问题的方案只是没遇到问题。真正优秀的技术,永远是能先于别人发现自己的问题。 我对Deferred Shading推崇的一个原因是:Deferred Shading的大体思路,其实就是我们不厌其烦所听说的封装。作为一个程序员,可能我们都需要经历这样的时刻——当你有一段代码,它在90%的地方都有所出现,只是外部形式稍有不同时,你应该把它做成一个函数。 Deferred Shading,就是这样一个函数,而这重复率如此之高的代码段,正好是传统图形光照系统那千篇一律的光照代码。所谓的材质,就是用于描述物体的外在表征的方式,材质本身是没有意义的,光和材质的配合才会有意义。而我们如果回想一下就不难发现:基于传统光照模型的图形技术,无论其他方面有什么样的差别,在一个地方上都是一致的——那就是光照模型的代码:Diffuse是N乘L,Specular是半角H,Emissive是直接狂加,不过如此而已。如果将这个过程中所需的所有用于描述表面的数据,全部缓存到若干张纹理上,而在之后的光照过程中统一计算,那么,至少将享有如下的好处: 首先,硬件Occlusion可以裁切掉那些不需要渲染的光源。而不像传统管道那样,只是影响到了,但其实并不显示的光源也有可能被提交到渲染管道。 其次,最终的效率与场景的复杂度无关。准备材质数据的过程(Base Pass)非常简化,因此这个过程的计算量是很小的。打光的时候,你所面对的无非只是几张纹理,所做的所有工作几乎都是线性的。 第三,强制的基于像素的光照系统,这个可能既是个好处,也是个坏处。好处是品质确实很高,坏处是对于国内这种基于低品质来做游戏的思路,这种方式并不讨好,反倒是有种牛刀杀鸡的感觉。Deferred Shading的优势是多面多光源,而且是动态光源,这在现有的项目中几乎是不可想象的,所要冒的风险不比最后的结果差多少。韩国人之所以敢做,是因为韩国网吧和个人普遍的配置都比较高,中国嘛……正如你我都知道的那样。 假设说你已经准备支持了逐像素光照系统,那么在这样的诱惑面前,你有什么理由放弃Deferred Shading呢? 总结来说,Deferred Shading,就是用最小的代价,换取逐像素光照的品质——但是,诚然,没有任何午餐是免费的,您也将为此付出代价…… 同时,如果您的项目是准备基于逐顶点、少面数、低动态光源的品质的话,那么,Deferred Shading是绝对的不适合。 题外话,毕竟网游总是和图形说拜拜的,这一点,你没法要求太高……