本书是图形学编程的不错读物,通过浅显易懂,理论结合实践的方式介绍着色器的使用,我在翻译的过程中尽量保持原文的段落和含义,会删除比较无关的内容。
- 专有词汇会附加英文原词,用标签的形式表示,如 着色器(
shaders
)- 原文附录引用编号会放上引用书的Google搜索结果链接
- 如有异议或对书中技术感兴趣的欢迎留言讨论
很好!我很高兴你正在阅读本书。你可能想直接跳去找核心内容来读,但既然你已经来了……
计算机图形学是一个迷人且发展迅速的学科领域,我出生时甚至它还不存在。我被它同时具有的工程性和艺术性所吸引。在计算机图形学工业中,工程师不断设计性能和图像质量越来越高的图形学软硬件产品。这些产品使艺术家得以用来创造在娱乐、教育、设计、再创造等领域令人惊叹的视觉体验。这个过程反过来促进工程师设计更好的软硬件,为艺术家提高视觉体验赋能。这种工程师和艺术家之间的共生关系从未停止过,并催生了极具真实感的电影特效,和接近电影级别画质体验的电子游戏。
或许你是一名想掌握更好图形学技能以开发新工具的工程师;或许你是一名想对计算机图像的构成原理一探究竟的艺术家;或许你是个全才,对作品有着独到的视野与见解,并且只需要加深一点对这个过程的理解就能实现;亦或许你只是对计算机图形学有点兴趣,那么你就选对了一本帮助你达成目的的出色指导书。
这本书是由 Mike Bailey 和 Steve Cunningham 所编写的。他们俩都十分热爱计算机图形学,并对传授这些知识抱有同样的热情。通过写这本书,他们的热情与学识得以受益于读者你。
(……省略一段对两位作者个人经历与对计算机图形学贡献的翻译……)
作为本书的主要内容,用 OpenGL 着色器语言 (Shading Language
) 编写着色器(shaders
)是重要且适时的,OpenGL 和 GLSL 是图形学行业标准,被如 工作站、台式机、笔记本电脑、手持设备等众多硬件产品,和如 Macs、PCs 和 Linux 等众多操作系统环境所兼容。制定一个行业标准的目的很简单——便于程序员在无须修改源码的情况下把代码部署到不同类型的多样化产品中去。这种可移植带来的便利性造就了基于统一行业标准的软件市场,分摊降低了软件开发的成本。
除此之外,本书最重要的一点是在教会你编写着色器的同时,也在加强你对计算机图形学基础知识的学习。因此,你能够很容易地把从本书学到的知识应用到其他着色器语言和图形编程中。现在图形硬件的发展趋向于给基础硬件提供更加通用化的可编程性和更少的固化能力,使得这一点变得愈加重要。换句话说,我们处在计算机图形学在软件领域有大量创新的时代。从这本书学到的知识和技能能够适用于未来更通用化的图形学编程环境。
在每个章节的最后会有一些小练习,目的在于帮助你巩固图形学知识和着色器编程能力。出于这个目的,以下是我想给你嘱咐的几点:
Rangi Rost 2008.12.31
如果你有一堆特别赞,特别有创意的点子,但似乎找不到办法把它们变成正确的像素点呈现在屏幕上, 那么你就是本书的读者。
欢迎来到《图形着色器的理论与实践》的世界。正如其名,本书会同时探究着色器的原理和实现,并提供了大量将原理付诸实践的代码。为了方便阅读,本书已经被印刷成了彩色版本,大部分例子都配有图示来帮助你对概念的理解。所以停下来看看这本书吧,你肯定会喜欢上它的。
这是本书的第二版,比老版本多出了100多页。以下是其中主要的改进点:
tessellation shaders
)编写了包括示例的独立章节;desprecated
),但还没有移除(eliminated
)它们。这一版中会提到这些点,并提供一些实际编写中处理这些点的策略建议,本书所有示例代码都满足这些策略。同时,为了遵循这些策略,你可能需要做好迁移到 OpenGLES 2.0 的准备。可编程计算机图形着色器有着有趣的历史。在我们有些人的记忆中,不久之前计算机图形学的所有方面都是可编程的。但事实上,“具有可编程性”可能并不友好,因为这使得创建图像时会有可编程选项,这其实并不必须。想要任何画面呈现在屏幕上,你都必须自己去实现整个过程。“非自愿可编程性”可能是个更恰当的形容词。
计算机图形学API的诞生为从业人员改变了这个状况。有了这些API,编写出更好的图形学程序变得更加容易,因为API能力承载了大部分基础的图形处理过程。但与此同时,这也牺牲了一些API本身不知道如何处理的能力。一个典型的例子是外表面着色(surface shading
),1990年代的大部分API都仅仅支持简单光滑的光照表面渲染。
幸运的是,计算机图形学研究机构和其他的图形学从业人员都对此不甚满意。正如图形处理器的诞生,先是软件,后是硬件,一种特定功能被开发来支持固定图形API能力范围之外的可编程特性。这个功能现在发展出了其自己的一些标准,包括了GLSL着色器语言的OpenGL标准就是其中的一部分。可编程图形着色器、程序(program
)可以被动态下载到图形处理器中,去承载那些前期标准固定方法管线之外的运算,这成为了计算机图形学的关键特征之一。
这个过程现在被涵盖在了计算机图形学普遍教程中,正如学生们通常首先从一种图形学标准(基本上就是 OpenGL)开始学习计算机图形学,他们现在也需要去理解可编程着色器的角色,并尝试编写、应用它们。着色器编程引人注目的一点在于它让我们想起1970年代,那时候面临着类似的图形学问题,现在当我们操作顶点(vertices
)和独立像素点时,仍能得到全 OpenGL API 随时可用的高速支持。这为游戏开发、科学可视化、通用图形化交流领域的学生和从业人员提供了不可思议范围的能力。
(……省略一段本书目的和用途,以及为什么选择GLSL的废话……)
按照在图形渲染管线中的应用顺序来介绍着色器,即首先是顶点着色器(vertex shaders
),接着是几何着色器(geometry shader
) 和 片元着色器(fragment shaders
),似乎是符合逻辑的,但我们实际上可以选择不同的顺序。而按照着色器的使用频度来讲解,即片元着色器、顶点着色器、几何着色器,似乎也是符合逻辑的,但看起来不是那么地说得通,因为大部分片元着色器的操作都依赖于顶点着色器的输出。这里我们先介绍顶点着色器,再是片元着色器,最后是几何着色器和细分曲面着色器。
下面是介绍本书章节的概要。
the fixed-function graphics pipeline
) 铺垫全书背景glman
学习工具接下来一组章节把顶点和片元着色器的概念连接在一起,
ambient
, diffuse
, specular
))光照方法。这些在顶点和片元着色器中都是普遍基础的用法。接下来的三章讨论片元着色器的特殊能力
第9章:介绍片元着色器的纹理映射(texture mapping
),包括凹凸映射(bump mapping
)、立方映射(cube mapping
)及渲染场景到纹理。
第10章:介绍噪声函数和其在编写纹理和着色器中的角色,并介绍一个用来方便测试 1D、2D噪声函数的工具 noisegraph
。
第11章:实战讲解怎样通过片元着色器实现各种2D图像纹理的操作。
第12章:介绍了几何着色器,以及其和顶点、片元着色器的关系。其中的一些例子展示了几何着色器的特性能力。
第13章:介绍细分曲面着色器,展示了它和几何着色器的相似之处,及其重要增强。
最后一组章节专注于计算机图形着色器的实际应用
scientific visualization
)应用中使用着色器。我们有信心通过书中描述的工具和技能帮助你成为更好的图形学编程人员,并让图形编程的体验过程变得更加有趣。随着 OpenGL 的不断进化,着色器成为处理几何渲染过程的唯一手段,我们相信这本书会是你无价的引导。
(……省略作者的序言致谢部分……)