- Unity 3D 内建着色器源码剖析
- 熊新科
- 1373字
- 2020-08-27 16:35:02
序
1999年,我刚读大一,当我用Turbo C写下第一句绘图代码时,就对使用计算机绘制五彩斑斓的图形产生了浓厚的兴趣。计算机游戏正是把计算机图形学理论实践到极致的典范。当时,每次看到同学们玩《星际争霸》《帝国时代》等游戏,我就总是在思索:这些游戏中如此漂亮的画面是怎么绘制出来的?带着兴趣和疑问,我陆续学习了C++语言、Windows编程和DirectDraw图形绘制技术。经过漫长的学习和积累之后,在2001年,我终于用DirectDraw做出了一个小作品。这个小作品很简单,就是一个小人在一个可卷动的场景中走来走去。完成这个小作品之后,我就已经很清楚自己大学毕业后的工作目标了。2003年毕业前夕,我获得了去珠海市金山软件股份有限公司西山居实习的机会。在西山居我结识了很多业界朋友,也了解到我当时所熟悉的基于DirectDraw的2D图形编程技术已经过时。未来的计算机游戏,无论是2D游戏还是3D游戏,在图形领域都使用统一的3D编程接口,充分利用硬件加速性能已是大势所趋。同样是在西山居,我首次了解到了DirectX 8.0的第一代可编程着色器语言,开启了我长达十余年的图形着色器学习的历程。
从2004年年初到2010年年底,我先后在深圳市、厦门市参与了若干款PC网络游戏的开发,先后接触了LithTech 6.7和Gamebryo 2.3这两款3D引擎。由于购买了这两款引擎的源代码,在工作之余,我也尝试深入分析引擎的架构实现,从中学习了很多知识。随着手机游戏的爆发,Unity 3D以其易用性和良好的多平台支持性得到广大用户的青睐,成为国内开发手机游戏厂商的首选。我也于2013年年底加入了学习Unity 3D的大军。
在学习Unity 3D的过程中,除了学习基本的逻辑开发外,我还深入地学习了着色器的实现。作为一个商业闭源引擎,它由C++语言实现的引擎底层是一般用户无法接触到的。但幸运的是,Unity 3D开放了着色器层的源代码实现。基本上,官方所开发的各种效果的着色器源代码都可以免费获取。我在学习Unity 3D着色器开发时,除了查阅官方教程外,更多的是研究内置着色器的源代码以了解其实现原理。在长达4年的学习过程中,我积累了很多关于Unity 3D着色器编程的心得和经验,同时做了一些笔记。囿于工作繁重,无法花太多精力去组织文字,这些心得经验都比较零散且不成篇幅,而写一本技术专著则是我多年来的夙愿。直至2017年,我离职在家专心写作,把这些年的积累写成了本书。
作为一名用C++语言开发过若干游戏的程序员,我通读了著名华人技术作家侯捷的《STL源码剖析》《深入浅出MFC》等深入剖析C++源码框架的书籍。我被侯捷剖析大系统和大架构的能力深深折服而心向往之;对侯捷的“通过剖析经典作品的源码吸取养分,从而提升自己能力”的观点也深以为然。因此,本书也效法侯捷的《STL源码剖析》,以深入剖析Unity 3D内置着色器的功能实现为主,希望能给读者在开发工作中提供最大的帮助。
在写作本书的过程中,我得到了各方的大力支持,没有这些支持,我很难完成技术写作这项繁重的工作。首先要感谢本书的策划编辑张涛,他以独到的眼光和无限的信任促成了本书的诞生。同时,要感谢我的父母。作为一名就读于邮电院校的学生,虽然最后没有进入电信行业,可能和父母对我的期盼有所偏离,但他们对我选择游戏开发行业这条路是理解和支持的。其次要感谢我的妻子,没有她对我离职在家写书的支持和理解,我就不能在无后顾之忧的条件下专心写作。最后要诚挚地感谢每一位购买了本书的读者,你们对本书的喜爱和肯定是我继续钻研Unity 3D着色器编程技术并写出好的作品回报各位图形编程爱好者的最大动力。
熊新科