前 言
欢迎来到实用着色器开发。《Shader开发实战》旨在深入浅出地介绍编写视频游戏着色器的理论和实践。编写着色器是一个非常宽泛的话题,当我刚起步时,感到非常迷茫。希望《Shader开发实战》能够帮助你避免同样的感觉,并让你快速而自信地踏入着色器和游戏图形的广阔世界。
《Shader开发实战》的指导思想是:“木匠不需要知道如何制作扳手”。同样,你不必知道如何构建渲染引擎就可以使用着色器创建美观的视觉效果,尤其是在刚入门时。《Shader开发实战》旨在帮助你进行实验、发挥创造力、创造有趣的事物,并希望在此过程中有所收获。为此,《Shader开发实战》不会尝试教你如何成为图形程序员,也不会尝试提供系统的数学知识(尽管将逐步介绍一些数学知识)。相反,《Shader开发实战》将从一开始就讨论现代游戏中如何在屏幕上放置东西,然后直接进入编写着色器,以使我们在屏幕上放置的东西看起来像我们想要的那样。将会有大量示例代码,大量图片,并且到《Shader开发实战》结束时,将从着色器编写的基本知识转向编写与市场上一些最流行的游戏中使用相同光照的着色器。
如果在《Shader开发实战》的最后,你决定想更深入地研究图形编程,甚至编写自己的渲染引擎,或者更复杂的着色器技术,那么《Shader开发实战》将为你提供扎实的基础知识,为你处理更复杂的主题做准备。
0.1 《Shader开发实战》读者对象
《Shader开发实战》适用于想要学习如何使用着色器代码为游戏或实时应用程序创建视觉效果的任何人。假设你已经知道如何编写一些简单的C ++代码,但这就是你阅读《Shader开发实战》之前需要掌握的全部背景知识。将解释我们所需的所有数学运算(你会惊讶地发现其中的数学运算很少),并从3D网格开始,分解将使用的每种图形技术。如果你对C ++有点生疏,那也没问题!由于《Shader开发实战》的重点是着色器开发,因此根本不会编写太多的C ++代码,并且我们即使要写也将保持尽量简单短小,不给读者增加额外的负担。
0.2 如何使用《Shader开发实战》
第1~12章的重点是着色器技术的教学和介绍新的图形概念。如果你完全是初学者,建议你从第1章开始,并按顺序阅读所有内容。每章都基于之前的内容,因此,如果你跳过太多内容,就有可能最终迷失方向。
如果你已经掌握了一些着色器开发知识,那么直接跳到你以前从未学过的章节可能会更有趣。
第13~15章涉及调试和优化着色器代码。如果你是因为项目以10fps的速度运行而选择阅读《Shader开发实战》,并且需要对其进行修复,那么可能更值得直接跳到那里去解决当前碰到的问题。否则,你可能会因为前几章的轻松和缓慢的节奏而感到沮丧。
第16~18章讨论了如何在当今使用的3种最流行的引擎中实现《Shader开发实战》中所教的概念:Unity、Unreal Engine 4和Godot。建议你将这些保留到最后,以准备将《Shader开发实战》中讲授的概念应用于你的项目中。
最后,《Shader开发实战》结尾处的附录中有一些重要的代码片段,这对于《Shader开发实战》中的某些示例是必需的。这些代码片段不是着色器代码,因此不会对其进行详细说明。
如果你在没有互联网连接的情况下阅读《Shader开发实战》,则需要参考附录中的代码,以便跟随后续章节中的示例内容进行学习。章节的内容将告诉你何时需要那些代码。
0.3 示例代码约定
《Shader开发实战》使用了大量示例代码。为了使讨论代码更容易,这些示例均使用编号进行了注释,如下所示:
int main(){
return 0; ?
}
行?引用了返回0的代码行。
0.4 软件要求
由于我们将使用一个名为openFrameworks的开源框架(默认情况下使用C++ 14),因此,如果你拥有能够支持C++ 14的编译器,那么你的编程生活将最为轻松。我们不会使用任何C++ 14功能,但是框架需要在幕后使用它们。如果你使用的是openFrameworks支持的IDE,你的编程生活也会更加轻松。幸运的是,支持openFrameworks的IDE很多,当完成所有设置后,你就可以自由选择你想要的IDE。
最后,我们将使用OpenGL运行所有着色器。OpenGL是一个“渲染API”,这是用来与图形卡(GPU)进行通信的一组函数。有很多不同的API供你选择,但OpenGL的优势是可在尽可能广泛的硬件上运行,并可与openFrameworks很好地集成。你应该确保GPU至少支持OpenGL 4.1,这是《Shader开发实战》假定你正在使用的。从OS X High Sierra开始,苹果公司已不推荐在其台式PC上使用OpenGL,这意味着如果你在Mac上学习《Shader开发实战》,则《Shader开发实战》中的示例可能无法正常运行。