Cg是最早的为可编程图形硬件设计的高级编程语言,本书教你如何编写Cg程序。
本书共10章,第1章简要介绍Cg语言。随后的每一章分别介绍Cg中的一个概念和技术的说明,包括最简单的Cg程序,参数、纹理和表达式,如何进行顶点变换,如何用Cg实现光照模型,如何用Cg顶点程序实现模型的动画和变换,如何实现环境贴图,如何实现凹凸贴图,雾、卡通光照、投影聚光、阴影贴图和复合技术,目前可用的Cg的顶点和片断的简要描述(Profile)等内容。每章的结尾提供了习题,以帮助你进一步学习,探索更多的Cg知识。本书另外还附有5个关于Cg基础知识的附录。
本书适合开发三维游戏和应用软件的程序员及项目管理人员、实时三维美工人员和学习计算机图形学的学生,也可供任何对学习实时渲染技术当前发展动态有兴趣的人士阅读参考。
第1章 简介
1.1 什么是Cg? 1
1.1.1 为可编程图形硬件设计的语言 2
1.1.2 Cg的数据流模型 2
1.1.3 图形处理器的特殊性和中央处理器的通用性 3
1.1.4 Cg性能的基本原理 3
1.1.5 与传统编程语言共存 4
1.1.6 Cg的其他方面 22
1.1.7 Cg程序的有限执行环境 22
1.2 顶点、片段和图形流水线 23
1.2.1 计算机图形硬件的发展史 23
1.2.2 四代计算机图形硬件 24
1.2.3 图形硬件流水线 28
1.2.4 可编程图形流水线 31
1.2.5 Cg提供了顶点和片段的可编程能力 34
1.3 Cg的发展史 35
1.3.1 Microsoft和NVIDIA协作开发了Cg和HLSL 37
1.3.2 非交互的着色语言 37
1.3.3 三维图形的编程接口 40
1.4 Cg环境 40
1.4.1 标准三维编程接口:OpenGL和Direct3D 40
1.4.2 Cg编译器和运行库(Runtime) 42
1.4.3 CgFX工具箱和文件格式 44
1.5 练习 47
1.6 补充阅读 47
第2章 最简单的程序
2.1 一个简单的顶点程序 49
2.1.1 输出结构(Output Structure) 50
2.1.2 标识符 51
2.1.3 结构成员 52
2.1.4 向量 52
2.1.5 矩阵 53
2.1.6 语义 54
2.1.7 函数 55
2.1.8 输入和输出语义是不同的 55
2.1.9 函数体 57
2.2 编译你的例子 58
2.2.1 顶点程序Profile 58
2.2.2 Cg编译错误类别 60
2.2.3 依赖profile的错误 60
2.2.4 标准:多重入口函数 61
2.2.5 下载和设置顶点和片段程序 62
2.3 一个简单的片段程序 63
2.3.1 片段程序profile 65
2.4 用你的顶点和片段示例程序渲染 67
2.4.1 用OpenGL渲染一个三角形 67
2.4.2 用Direct3D渲染一个三角形 67
2.4.3 获得同样的结果 68
2.5 练习 70
2.6 补充阅读 70
第3章 参数、纹理和表达式
3.1 参数 71
3.1.1 Uniform参数 71
3.1.2 const类型限定符 74
3.1.3 Varying参数 74
3.2 纹理样本 76
3.2.1 样本对象 77
3.2.2 纹理采样 78
3.2.3 在对一个纹理采样的时候,发送纹理坐标 78
3.3 数学表达式 79
3.3.1 操作符 79
3.3.2 依赖于profile的数值数据类型 81
3.3.3 标准库内置的函数 84
3.3.4 二维扭曲 86
3.3.5 重影效果 90
3.4 练习 94
3.5 补充阅读 95
第4章 变换
4.1 坐标系统 97
4.1.1 物体空间 98
4.1.2 齐次坐标 99
4.1.3 世界空间 99
4.1.4 建模变换 99
4.1.5 眼睛空间 100
4.1.6 视变换 101
4.1.7 剪裁空间 102
4.1.8 投影变换 102
4.1.9 标准化的设备坐标 103
4.1.10 窗口坐标 104
4.2 理论应用 104
4.3 练习 105
4.4 补充阅读 105
第5章 光照
5.1 光照和光照模型 107
5.2 实现基本的每个顶点的光照模型 109
5.2.1 基本的光照模型 109
5.2.2 一个基本的每个顶点光照的顶点程序 115
5.2.3 每个顶点光照的片断程序 124
5.2.4 单个顶点光照结果 124
5.3 单个片断光照 124
5.3.1 实现每个片断的光照 126
5.3.2 用于每个片断光照的顶点程序 127
5.3.3 用于每个片断光照的片断程序 127
5.4 创建一个光照函数 129
5.4.1 声明一个函数 129
5.4.2 一个光照函数 131
5.4.3 结构 131
5.4.4 数组 132
5.4.5 流程控制 133
5.4.6 计算漫反射和镜面反射光照 135
5.5 扩展基本模型 135
5.5.1 距离衰减 136
5.5.2 增加一个聚光灯效果 138
5.5.3 平行光 141
5.6 练习 143
5.7 补充阅读 144
第6章 动画
6.1 随时间运动 145
6.2 一个有规律搏动的物体 146
6.2.1 顶点程序 147
6.2.2 位移计算 148
6.3 粒子系统 150
6.3.1 初始化条件 151
6.3.2 向量化计算 152
6.3.3 粒子系统的参数 152
6.3.4 顶点程序 153
6.3.5 修饰你的粒子系统 155
6.4 关键帧插值 156
6.4.1 关键帧的背景知识 156
6.4.2 插值方法 159
6.4.3 基本的关键帧插值 161
6.4.4 带光照的关键帧插值 162
6.5 顶点混合(Vertex Skinning) 163
6.5.1 顶点混合理论 163
6.5.2 在顶点程序中的顶点混合 165
6.6 练习 167
6.7 补充阅读 168
第7章 环境映射技术
7.1 环境映射 169
7.1.1 立方贴图纹理 170
7.1.2 生成立方贴图 171
7.1.3 环境映射的概念 171
7.1.4 计算反射向量 171
7.1.5 环境映射的一些假设 173
7.2 反射环境映射 174
7.2.1 应用程序指定的参数 175
7.2.2 顶点程序 175
7.2.3 片断程序 179
7.2.4 控制贴图 180
7.2.5 顶点程序对片断程序 180
7.3 折射环境映射 181
7.3.1 折射的物理原理 182
7.3.2 顶点程序 184
7.3.3 片断程序 186
7.4 菲涅耳效果和颜色色散 187
7.4.1 菲涅耳效果 187
7.4.2 颜色色散 188
7.4.3 应用程序指定的参数 189
7.4.4 顶点程序 190
7.4.5 片断程序 191
7.5 练习 193
7.6 补充阅读 194
第8章 凹凸映射
8.1 凹凸映射一个砖墙 195
8.1.1 砖墙的法向量贴图 196
8.1.2 把凹凸贴图存储成法向量贴图纹理 197
8.1.3 对一个砖墙的简单凹凸映射 199
8.1.4 带镜面反射的凹凸映射 203
8.1.5 凹凸映射其他几何图形 206
8.2 凹凸映射一个砖砌的地板 208
8.2.1 渲染一个砖扑的地板的顶点程序 210
8.3 凹凸映射一个园环 213
8.3.1 园环的数学表示 213
8.3.2 凹凸映射的园环的顶点程序 216
8.4 凹凸映射纹理的多边形网格 218
8.4.1 考察单独一个三角形 218
8.4.2 一些告戒 221
8.4.3 推广到一个多边形的网格 222
8.5 把凹凸映射和其他效果结合在一起 223
8.5.1 印花贴图(Decal Map) 223
8.5.2 光泽贴图 223
8.5.3 投射自己的几何阴影(Geometric Self-Shadowing) 224
8.6 练习 225
8.7 补充阅读 225
第9章 高级论题
9.1 雾 227
9.1.1 均匀的雾 228
9.1.2 雾的属性 229
9.1.3 雾的数学基础 229
9.1.4 直觉化公式 231
9.1.5 用Cg创建均匀的雾 232
9.2 非真实性渲染 234
9.2.1 卡通着色 234
9.2.2 实现卡通着色 235
9.2.3 集成在一起 238
9.2.4 这个技术的一些问题 238
9.3 投影贴图 240
9.3.1 投影纹理是如何工作 241
9.3.2 实现投影纹理贴图 243
9.3.3 投影纹理贴图的代码 244
9.4 阴影映射 247
9.5 合成 249
9.5.1 把输入映射到输出像素 250
9.5.2 基本的合成操作 250
9.6 练习 254
9.7 补充阅读 255
第10章 Profile和性能
10.1 Profile描述 257
10.1.1 DirectX8的顶点着色器Profile 257
10.1.2 OpenGL的基本NVIDIA顶点程序Profile 258
10.1.3 OpenGL的ARB顶点程序Profile 258
10.1.4 DirectX 9的顶点着色器Profile 259
10.1.5 OpenGL高级NVIDIA顶点程序Profile 259
10.1.6 DirectX 8的像素着色器Profile 259
10.1.7 用于OpenGL的基本NVIDIA片断程序Profile 260
10.1.8 DirectX 9像素着色器Profile 261
10.1.9 OpenGL的ARB片断程序Profile 261
10.1.10 OpenGL高级NVIDIA片断程序Profile 261
10.2 性能 262
10.2.1 使用Cg标准库 262
10.2.2 充分利用统一参数 263
10.2.3 使用顶点程序对比使用片断程序 263
10.2.4 数据类型和它们对性能的影响 264
10.2.5 充分利用向量化 264
10.2.6 使用纹理来编码函数 265
10.2.7 自由使用重组(Swizzling)和取反(Negation) 265
10.2.8 只对必须着色的像素进行着色 266
10.2.9 简短的汇编代码并不是更快的性能所必须的 266
10.3 练习 267
10.4 补充阅读 267
附录A Cg入门
A.1 获得这本书的配套软机 269
A.2 获得Cg工具箱 269
附录B Cg运行库
B.1 什么是Cg 运行库? 271
B.2 为什么使用Cg 运行库? 271
B.2.1 未来的证明 271
B.2.2 没有依靠问题 272
B.2.3 输入参数管理 272
B.3 Cg运行库是如何工作的? 272
B.3.1 头文件(Header File) 273
B.3.2 创建一个环境(Context) 274
B.3.3 编译一个程序 274
B.3.4 载入一个程序 275
B.3.5 修改程序的参数 275
B.3.6 执行程序 276
B.3.7 释放资源 276
B.3.8 处理错误 277
B.4 更多的细节 278
附录C CgFX文件格式
C.1 什么是CgFX? 279
C.2 格式纵览 280
C.2.1 技巧(Technique) 280
C.2.2 过程(Pass) 281
C.2.3 渲染状态 281
C.2.4 变量和语义 282
C.2.5 注解(Annotation) 282
C.2.6 一个CgFX文件的示例 283
C.3 支持CgFX格式的Cg插件 285
C.4 学习更多有关CgFX的知识 285
附录D Cg关键字
D.1 Cg关键字列表 287
附录E Cg标准库函数
E.1 数学函数 289
E.2 几何函数 293
E.3 纹理贴图函数 294
E.4 导数函数 296
E.5 调试函数 296
从前,实时的计算机图形问题全是关于顶点、三角形、和像素的。实际上,现在的情况仍然是这样。但是,一个程序员可以控制的处理层次和那些图形原语的表现已经有了相当大的进步。直到几年前,程序员们仍然不得不依赖中央处理器来处理所有这些用来生成计算机图像的变换和光栅化算法。随着时间的过去,硬件工程师们开始在特别设计的高性能的三维图形硬件上执行这些算法。程序员们开始通过标准的三维编程接口来访问这些硬件提供的图形功能,例如OpenGL(由Silicon Graphics [SGI] 公司开发)和Direct3D(由微软公司开发),而不在需要直接实现这些算法。一开始,这些昂贵的三维图形硬件只出现在天价的UNIX工作站和飞行模拟器上。现在,经过摩尔定律的奇迹,图形硬件加速的益处已经给予了低价的PC机和游戏机。
虽然通过使用精密的图形硬件来执行变换顶点、三角形光栅化和更新像素等复杂的任务所获得的性能远远超过了只使用中央处理器编程所获得的性能,实时三维图形程序员放弃了相当大的控制权来交换这种高速度。开发人员被限制在仅能使用一些硬件所能处理的调色板功能固定的图形操作。有时,一个熟练和专注的程序员可以巧妙地使用这些图形编程接口和图形硬件来完成某些不一般的任务,但是这是一项非常困难和耗时的工作。
当图形硬件工程师们开始使他们专门设计的由像素驱动的硬件向性能实时化发展的同时,非实时的计算机图形软件包,例如Pixar公司的PhotoRealistic RenderMan,正在用另人惊奇的计算机生成的特殊效果改变电影和电视的表现力。电影和大部分电视节目这种预先录制的本质使这些媒体非常适合不实时地渲染。计算机为电影和视频生成地图象虽然不是实时渲染地,而是非常仔细地一帧一帧地构造地,这项工作使用一般标准地中央处理器通常需要几个小时、几天或几周时间来完成。使用通用地中央处理器的优势是程序员和美工师可以利用中央处理器创造各种他们可以想像出的效果,而不是满足于实现复杂的硬件算法。这些所谓的非实时渲染系统所欠缺的相对速度,被它们通过渲染的效果和真实性来弥补了。
非实时渲染系统的灵活性和通用性是前代的三维图形硬件所缺乏的关键特性。换句话说,前代三维图形硬件缺乏可编程性。
认识到这个限制,计算机图形设计师已经设计了新一代的图形硬件,能够允许一个空前灵活的可编程性。现在,许多可编程的光照技术已经成功地被使用在非实时渲染上了,并且开始进入实时图形技术地领域了。
非实时渲染系统的开发人员创造一种被称为光照语言的专门的计算机语言来表达哪些使得物体表面看上去像美工师预期的那样的图形操作。一种为可编程图形硬件设计的光照语言提供了同样功能,但却在实时图形硬件范畴内提供的。就像传统的程序员从C++和Java获得巨大的帮助那样,图形程序员和美工人员将受益于这样一种高级编程语言。使用为图形硬件设计的高级语言能够自动把程序员的意图转换成图形硬件可以执行的形式。
本书是关于Cg的,Cg是最早的为可编程图形硬件设计的高级编程语言。NVIDIA和Microsoft密切合作一起开发了Cg。Cg是帮你释放可编程图形硬件强大力量的最轻便和高效的方法。本书是一本教你如何编写Cg程序的指南。
我们预期的读者
我们试图以一种使本书对初学者和高级读者都有价值的方式来编写这本书。如果可编程图形这个世界对你来说是完全陌生的话,这本书将给你的学习打下一个坚实的基础。如果你遇到一个对你来说不熟悉的单词或概念而本书又没有足够的解释,请参考每章最后的补充阅读部分。
这本书主要的读者是开发三维游戏和应用软件的程序员、开发这些项目的管理人员、实时三维美工人员和学习计算机图形学的学生,或者任何对学习实时渲染技术当前发展动态有兴趣的人。虽然你应该相对熟悉编程语言的一些概念,但是通过本书学习Cg语言你不需要是一个有经验的程序员。如果你非常熟悉C语言或者从它派生出来的语言,例如C++或Java,Cg将会非常容易掌握。Cg程序相对来说比较短小,通常少于一页,因此即使是一个美工人员或初级程序员也能够从这本指南中掌握Cg语言的要点,并学会编写非常有趣的Cg程序。
计算机图形编程涉及许多的数学知识。理解基本的代数和三角几何学将会有助于你理解本书的几个部分。你也需要熟悉基本的计算机图形顶点变换和光照模型所涉及的数学知识。你不需要知道OpenGL或者Direct3D,但是了解其中一个的编程接口是非常有帮助的。本书所讲述的所有Cg例子都能很好地运行在OpenGL或Direct3D下,除非有特别地说明。一些例子需要高级地Cg功能,这些功能在旧地图形处理器上也许不能工作。
本书的结构
第一章将简单介绍Cg语言。随后的每一掌都是一个简短介绍某个特别Cg概念和技术的说明。这本指南的各个章节是互相依赖的,所以我们建议读者按照章节的顺序阅读本书。
˜ 第一章将展示Cg和实时可编程图形硬件的基础。
˜ 第二章将介绍一些最简单的Cg程序。
˜ 第三章将解释参数、纹理和表达式。
˜ 第四章将说明如何进行顶点变换。
˜ 第五章将包含如何用Cg实现光照模型。
˜ 第六章将描述如何用Cg顶点程序实现模型的动画和变幻。
˜ 第七章将用Cg解释环境贴图。
˜ 第八章将展示如何实现凹凸贴图。
˜ 第九章将讨论一些高级主题:雾、卡通光照、投影聚光、阴影贴图和复合技术。
˜ 第十章将解释目前可用的Cg的顶点和片断的简要描述(Profile),并且
为提高Cg程序的性能提供建议。
这本书将帮助你开始,但是不包括关于Cg的你最终想知道的所有东西。这本指南补充了包含在Cg开发工具集中的其他文档(例如Cg Toolkit User’s Manual: A Developer’s Guide to Programmable Graphics)的不足。请参考用户手册和其他Cg文档的信息。
格式惯例
本书所提供的各种各样的要素都被特意编排以方便阅读理解。代码例子是用Courier字体通过轻微增强显示的。变量和关键字用的是粗体的Courier字体,而关键概念则用斜体。
另外,我们用如下的图标来确认一些特殊的主题。
高级主题:为高级的读者提供额外的见解,可以被忽略而不影响连续阅读性。
警告:指出一个精妙之处或概念以避免在编写Cg代码的时候出现错误。
CineFX:描述的算法和特性只能在NVIDIA CineFX体系结构上应用,或者
在拥有类似高级性能的体系结构上应用。
代码提示:给出了一些关于好的编码练习的指导方针。
性能提示:指出了一些使用Cg获得最优的图形处理器性能的方法。
尝试例子
我们已经设计一个附随的软件框架以便你可以直接开始工作,即使你对OpenGL、Direct3D、C或者C++没有一点只是。我们的目标是分离Cg语言,以让你可以自由方便地尝试它。当然,当你开始要用Cg实现一个现实世界的应用程序的时候,你的项目也许会需要一些关于OpenGL、Direct3D、C和C++的知识。
这个附随的软件框架能够允许你试验本书所带的各种各样的Cg例子,而不用担心图形编程接口、C、或C++代码。这个程序的最新版本可以从随书附带网站上免费下载。本书附带的光盘上的软件只能在Windows平台上运行,但Linux和Macintosh系统的版本可以从网上获得。附录A解释了如何下载最新版本的Cg和附随的实验辅导应用程序。
这些实验辅导应用程序使你能够非常容易地调整本书所带各种例子,你能够看到如何改变某个Cg例子的同时可以立刻影响渲染的三维结果。如果你能够,就近找一台支持Cg的计算机尝试一下所有的例子程序。通过我们的软件,你可以只写Cg程序而不用担心一些细节,例如如何加载一个三维模型和纹理。当你想要知道所有这些细节的时候,可以查看源代码,所有这些都是可以免费下载获得的,这样你就可以看到Cg是如何与C++和OpenGL或者是Direct3D相互作用的了。Cg工具箱也附带了一些你可以学习的简单的例子程序。
每章的结尾包括了一些建议的习题,以帮助你进一步学习,探索更多的Cg知识。
致谢
我们非常感谢我们在NVIDIA的为Cg做出贡献的众多同事,感谢他们帮助我们编写了本书。在2001年和2002年,Bill Mark、Steve Glanville、Mark Kilgard和Kurt Akeley一起工作定义了最初的Cg语言。David Kirk、Jensen Huang、Dwight Diercks、Matt Papakipos和Nick Triantos意识到了用于图形处理器的高级语言的需求,并提供了使Cg在短短的一年多的时间内就变为现实所需要的所有资源。Geoff Berry、Michael Bunnell、Chris Dodd、Cass Everitt、Wes Hunt、Craig Kolb、Jayant Kolhe、Rev Lebaredian、Nathan Paymer、Matt Pharr、Doug Rogers和Chris Wynn开发了Cg编译器,标准库函数和运行技术。Sim Dietrich、Ashu Rege和Sebastien Domine一起研究最初的CgFX技术。Chris Seitz在项目的各个方面给了我们巨大的支持,他帮助我们的地方实在是太多了,以至于无法一一列出,没有他的这些帮助本书将不可能存在。John Spitzer提供了非常清晰的预见,是Cg开发工作的最基本的资源,他和他的小组给了我们巨大的帮助,使本书的出版成为了可能。Sanford Russell令人感染的促进帮助了我们开始编写本书。Cyril Zeller创建本书所附带的便利的辅导程序框架,并为附录B贡献了许多资料。Sim Dietrich在附录C和我们分享了CgFX的知识。Kevin Bjorke帮我们编写了高级章节里的合成技术部分。Teresa Saffaie、Catherine kilkenny和Debra Valentine检阅了本书,并使本书更加易于理解。Caroline Lie、Spender Yuen、Dana Chan、Huey Nguyen和Steve Burk借出了他们的创造力和想象力,帮我们设计和美化了本书的封面和图片。NVIDIA的演示小组(在Mark Daly指导下Curtis Beeson、Dan Burke、Joe Demers、Eugene d’Eon、Steve Giesler、Simon Green、Daniel Hornick、Gary King、Dean Lupini、Hubert Nguyen、Bonnie O’Clair、Alexei Sakhartchouk和Thant Tessman)为本书的彩页做出了贡献。
我们非常感谢Jason Allen、Geoff Berry、Michael Bunnell、Sim Dietrich、Chris Dodd、Gihani Fernado、Simon Green、Larry Gritz、Eric Haines、Wes Hunt、Gary King、Craig Kolb、Jayant Kolhe、Eric Lengyel、Cameron Lewis、Gilliard Lopes、Viet-Tam Luu、Kurt Miller、Tomas Akenine-Moller、Russell Pflughaupt、Matt Pharr、John Spitzer、Nick Triantos、Eric Werness、Matthias Wloka、Cyril Zeller和哪些匿名的评论者,感谢他们在检阅本书过程中所提出宝贵的评论意见。每一组评论意见都使本书更加清楚和准确。
Microsoft和NVIDIA相互协作在标准硬件光照语言的语法和语义上达成了一致。正是因为这种努力,DirectX9的高级光照语言HLSL和Cg其实是同一种语言。我们特此感谢Craig Peeper、Loren McQuade、Dave Aronson、Anuj Gosalia、Chas Boyd和Mike Toelle的工作。
我们对在北卡大学和斯坦福大学进行硬件光照语言研究工作者表示感谢。显然,Pixar公司的RenderMan光照语言为NVIDIA为大量生产的图形硬件开发一种实时语言提供了大量的灵感。Ken Perlin从事像素流编辑器的工作,他早期在Cg编译器方面的测试工作并没有被提及,现在是他获得称赞的时候了。
在硬件方面,我们对Erik Lindholm和Henry Moreton的基础工作表示感谢,他们设计了NVIDIA GeForce3图形处理器中的用户可编程顶点处理引擎。OpenGL和Direct3D对普通可编程顶点处理的支持,以及Cg对此的支持都受惠于他们的这项工作。
NVIDIA的系统、硬件和软件工程师们的努力工作和奉献促使了更快和可编程性更强的图形处理器曾经是现在也是Cg最总要的支持。我们对在NVIDIA工作的所有工程师所付出的努力表示感谢,他们的努力使的实时可编程光照对所有人都变成了现实。
我们感谢Addison-Wesley的出版小组使本书成为了现实。我们尤其感谢Chris Keane促使我们的手稿成为现实。
最后,我们感谢总多的Cg开发者所提供的反馈、错误报告、耐心和热情。
实时计算机图形硬件从支持一些固定的算法到完全可编程,正在经历一个显著的转变。同时,图形处理器(GPU)的性能也在以一个非常快的速率增加,甚至比中央处理器(CPU)的性能增长速度还要快,应为图形处理器可以有效地利用图形算法中大量存在的并行计算。这些在图形处理器灵活性和性能方面的改进在将来很可能会继续,将能允许开发者编写愈加复杂和多样的程序在图形处理器上执行。
直到最近,大部分的图形处理器程序都是用汇编语言编写的,但是历史已经显示了当开发者们有机会用高级语言编程的时候,他们能够创造性和有效的使用这些可编程的硬件。我们设计Cg的目标是在为开发人员提供与汇编语言一样的灵活性和高性能的同时,提供高级编程语言的表达力和易用性。C语言在中央处理器上的应用已经实现了这些目标,证明了它巨大的成功。因此,我们选择C语言的语法和基本原理作为我们定义Cg的起点。特别的是,这个选择给了我们信心Cg语言将能够实现任何图形处理器程序,而不是把开发人员限制在一个预现定义的为光照计算特别设计的框架中。
Cg同时也是建立在一些从早期的计算机图形学方面的工作中获得的想法和教训之上的。我个人在可编程图形硬件方面的兴趣是被北卡大学的像素流项目(PixelFlow)所激发的,特别是被其中由Marc Olano和其他人为PixelFlow所编写的光照编程语言编译器所激发。从许多方面看,Cg语言最直接的原型是由Kekoa Proudfoot、Pat Hanrahan、我和其他一些人在斯坦福为单片机图形处理器编写的一个实时可编程光照系统。我们从编写斯坦福系统所获得的这些知识对设计Cg语言是至关重要的。不实时的电影渲染依赖可编程的光照已经有很久了。由Pat Hanrahan在Pixar公司所设计的RenderMan语言充当了Cg语言一个主要的灵感,特别是在选择Cg语言的内置函数的时候。
创造一个可以被OpenGL和Direct3D API所广泛支持的图形处理器编程语言的期望使我们在设计Cg的时候和Microsoft进行了协作。Microsoft所实现的语言被称为HLSL,被作为DirectX9的一部分发行。在Microsoft,Craig Peeper和Loren McQuade对语言的设计有深远的影响。在本书中所使用的例子HLSL和Cg上都工作的很好。
能够在短短的不到一年的时间里设计和实现Cg语言只可能是因为我们有一个非常有才能的一组人在一起工作。其中两个人作出了特别的独一无二的贡献。Steve Glanville的广泛的编译器和语言方面的专家意见对Cg的设计努力是非常至关重要的,此外Cg编译器第一个版本的前台大部分都是由他实现的。Kurt Akeley作为系统设计师的经验对整个项目的作用是无法衡量的。
在这本书里,Randy和Mark组织安排了一系列的Cg应用指南,在介绍Cg的同时讲述了许多被先进的图形处理器所支持的实时光照技术。通过把这两组概念集中在一组练习中,本书使你能够体验到编写和试验你自己的图形处理器程序的乐趣。享受你的学习旅程吧!
Bill Mark
Cg语言主设计师
德克萨斯大学奥斯汀分校助理教授