作为一个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 编程】系列文章了:
- 【浅墨 Unity3D Shader 编程】之一 夏威夷篇:游戏场景的创建 & 第一个 Shader 的书写
- 【浅墨 Unity3D Shader 编程】之二 雪山飞狐篇:Unity 的基本 Shader 框架写法 & 颜色、光照与材质
- 【浅墨 Unity3D Shader 编程】之三 光之城堡篇:子着色器、通道与标签的写法 & 纹理混合
- 【浅墨 Unity3D Shader 编程】之四 热带雨林篇: 剔除、深度测试、Alpha 测试以及基本雾效合辑
- 【浅墨 Unity3D Shader 编程】之五 圣诞夜篇: Unity 中 Shader 的三种形态对比 & 混合操作合辑
- 【浅墨 Unity3D Shader 编程】之六 暗黑城堡篇: 表面着色器 (Surface Shader) 的写法 (一)
- 【浅墨 Unity3D Shader 编程】之七 静谧之秋篇: 表面着色器的写法 (二)—— 自定义光照模式
感谢两位非常棒的分享,让我能快速地理解了 Shader 的基础用法,用了差不多3天时间消化了一下这几篇文章,现在已经能对着各种 Shader 插件中提供的 Shader 逐句分析其用意和用途了。
不过本着记录和分享,以及锻炼一下自己技术写作能力,敦促自己继续学习的目的,我想把我自己持续学习 Shader 的整个历程记录下来。所以这个系列并不会像浅墨_毛星云或者 onevcat 的文章一般抽丝剥茧地从头细说 Shader 的学习路线,而是会以一个对 Unity3D 开发已经较为熟悉,但是对 Shader 不是那么了然的程序员的视角来记录学习过程中遇到的小问题,以及在解决这些问题的过程中获得的信息以及其相应的延伸内容。