【撒利学 Shader】写在前面的话

作为一个 Unity3D 开发者,我时常提醒自己并不是一个 3D 游戏开发者,甚至都不是一个游戏开发者,更多的时候只是一个脚本程序员。这是我对自己的一个定位,也是一种现状的描述,我身边有不少做 Unity3D 开发的朋友,他们对于 3D 程序开发实际上了解得并不多,但是貌似也能胜任他们正在做的工作。

这是 Unity3D 带来的一种效应,有其积极的一面,同样也有其消极的一面。积极的一面是,更多原本对 3D 编程敬而远之却对游戏编程怀有兴趣的人,可以就着 Unity3D 直接开工,上手去做一些有趣的事情了,降低了整个 3D 游戏开发的门槛,让游戏编程更加的亲民了;消极的一面呢,这部分半路出家杀到 Unity3D 开发圈子里头来的童鞋们呢,由于 3D 编程基础几乎为 0,所以在涉及到 3D 图形技术领域很可能直接就抓瞎了,整半天完全摸不着头脑的并不是啥奇事。我就是这半天摸不着头脑的人之一,为了让自己能摸着头脑,那么就只能从零开始,一点点琢磨了。

3D 编程中诸多的技术问题,Unity3D 通过它那万能的 Editor 实际上已经解决了很多 3D 编程中需要去面对的问题了,例如摄像机、坐标运算和坐标系转换、光照、投影,渲染等等等等。而在 Unity3D 开发过程中,可能让我这种非正规 3D 游戏开发者最为头疼的可能就是对 Shader 的一知半解了,而在一个 3D 开发者的成长之路上,这个问题早晚得是我们需要直接面对并且勇敢翻过去的一座山,唯有如此我们才能看到更加美丽的风景,如果我们有女朋友的话,还可以带着女朋友一起看。

作为一个 Shader 小白,我们最好的学习方法是啥?当然是看书咯,不过貌似这方面的书真心不多,曾经有一本《GPU 编程精粹》如今依然绝版,今天在网上搜寻了一番,最近貌似新出了两本 Shader 相关的图书,直接立刻下单 《Unity 3D ShaderLab 开发实战详解(第 2 版)》和《Unity 着色器和屏幕特效开发秘笈 [Unity Shaders and Effects Cookbook],买回来看看先。

不过作为程序员的我们,在碰到问题之后的第一反应通常都是找文档,第二反应就是找 Google,对吧。不过相信所有 Unity3D 的开发者都会有一个这样的感受,Unity3D 的开发文档跟翔的区别可能都没有半毛钱那么多,所以我们也就能从官方文档中获得有限而又可怜的帮助了。剩下的我们就交给 Google 吧,Google 了一番之后,我倒是发现了两个比较不错的教程。

一个是猫大 @onevcat 的猫都能学会的 Unity3D Shader 系列文件两篇:

另一个是 90 后大神 @浅墨_毛星云的【浅墨 Unity3D Shader 编程】系列文章了:

感谢两位非常棒的分享,让我能快速地理解了 Shader 的基础用法,用了差不多 3 天时间消化了一下这几篇文章,现在已经能对着各种 Shader 插件中提供的 Shader 逐句分析其用意和用途了。

不过本着记录和分享,以及锻炼一下自己技术写作能力,敦促自己继续学习的目的,我想把我自己持续学习 Shader 的整个历程记录下来。所以这个系列并不会像浅墨_毛星云或者 onevcat 的文章一般抽丝剥茧地从头细说 Shader 的学习路线,而是会以一个对 Unity3D 开发已经较为熟悉,但是对 Shader 不是那么了然的程序员的视角来记录学习过程中遇到的小问题,以及在解决这些问题的过程中获得的信息以及其相应的延伸内容。