图书简介:
CONTENTS
CHAPTER 1 GRAPHICS SYSTEMS AND MODELS 1
1.1 Applications of Computer Graphics 2
1.1.1 Display of Information 2
1.1.2 Design 3
1.1.3 Simulation and Animation 4
1.1.4 User Interfaces 6
1.2 A Graphics System 7
1.2.1 Pixels and the Framebuffer 8
1.2.2 The CPU and the GPU 9
1.2.3 Output Devices 10
1.2.4 Input Devices 13
1.3 Images: Physical and Synthetic 13
1.3.1 Objects and Viewers 14
1.3.2 Light and Images 15
1.3.3 Imaging Models 17
1.4 Imaging Systems 19
1.4.1 The Pinhole Camera 19
1.4.2 The Human Visual System 21
1.5 The Synthetic-Camera Model 22
1.6 The Programmer’s Interface 24
1.6.1 The Pen-Plotter Model 25
1.6.2 Three-Dimensional APIs 28
1.6.3 A Sequence of Images 31
1.6.4 The Modeling–Rendering Paradigm 32
1.7 Graphics Architectures 35
1.7.1 Display Processors 36
1.7.2 Pipeline Architectures 37
1.7.3 The Graphics Pipeline 38
1.7.4 Vertex Processing 39
1.7.5 Clipping and Primitive Assembly 40
1.7.6 Rasterization 40
1.7.7 Fragment Processing 40
1.8 Programmable Pipelines 41
1.9 Performance Characteristics 42
1.10 OpenGL Versions and WebGL 43
Summary and Notes 44
Suggested Readings 45
Exercises 45
CHAPTER 2 GRAPHICS PROGRAMMING 49
2.1 The Sierpinski Gasket 49
2.2 Programming Two-Dimensional Applications 52
2.3 The WebGL Application Programming Interface 58
2.3.1 Graphics Functions 59
2.3.2 The Graphics Pipeline and State Machines 61
2.3.3 OpenGL and WebGL 61
2.3.4 The WebGL Interface 62
2.3.5 Coordinate Systems 64
2.4 Primitives and Attributes 65
2.4.1 Polygon Basics 67
2.4.2 Polygons in WebGL 70
2.4.3 Triangulation 71
2.4.4 Text 73
2.4.5 Vertex Attributes 75
2.5 Color 76
2.5.1 RGB Color 78
2.5.2 Color Tables 80
2.5.3 Setting of Color Attributes 81
2.6 Viewing 82
2.6.1 The Orthographic View 83
2.6.2 Two-Dimensional Viewing 84
2.7 Control Functions 85
2.7.1 The HTML Canvas 87
2.7.2 Aspect Ratio and Viewports 88
2.7.3 Application Execution 89
2.8 The Gasket Program 90
2.8.1 Sending Data to the GPU 93
2.8.2 Rendering the Points 94
2.8.3 The Vertex Shader 94
2.8.4 The Fragment Shader 96
2.8.5 Combining the Parts 96
2.8.6 The initShaders Function 97
2.8.7 The init Function 98
2.8.8 Reading the Shaders from the Application 99
2.9 Polygons and Recursion 100
2.10 The Three-Dimensional Gasket 102
2.10.1 Use of Three-Dimensional Points 103
2.10.2 Use of Polygons in Three Dimensions 106
2.10.3 Hidden-Surface Removal 109
Summary and Notes 110
Code Examples 113
Suggested Readings 113
Exercises 114
CHAPTER 3 INTERACTION AND ANIMATION 119
3.1 Animation 119
3.1.1 The Rotating Square 120
3.1.2 The Display Process 122
3.1.3 Double Buffering 123
3.1.4 Using a Timer 124
3.1.5 Using requestAnimationFrame 125
3.2 Interaction 125
3.3 Input Devices 127
3.4 Physical Input Devices 127
3.4.1 Keyboard Codes 128
3.4.2 The Mouse and the Trackball 128
3.4.3 Data Tablets,Touch Pads, and Touch Screens 130
3.4.4 Multidimensional Input Devices 131
3.4.5 Logical Devices 132
3.4.6 Input Modes 133
3.4.7 Clients and Servers 134
3.5 Programming Event-Driven Input 135
3.5.1 Events and Event Listeners 135
3.5.2 Adding a Button 136
3.5.3 Menus 137
3.5.4 Using Key Codes 138
3.5.5 Sliders 139
3.6 Position Input 140
3.7 Window Events 142
3.8 Gesture and Touch 143
3.9 Picking 145
3.10 Building Models Interactively 146
3.11 Design of Interactive Programs 150
Summary and Notes 151
Code Examples 153
Suggested Readings 153
Exercises 154
CHAPTER 4 GEOMETRIC OBJECTS AND TRANSFORMATIONS 159
4.1 Scalars, Points, and Vectors 160
4.1.1 Geometric Objects 160
4.1.2 Coordinate-Free Geometry 162
4.1.3 The Mathematical View: Vector and Affine Spaces 163
4.1.4 The Computer Science View 164
4.1.5 Geometric ADTs 165
4.1.6 Lines 166
4.1.7 Affine Sums 167
4.1.8 Convexity 168
4.1.9 Dot and Cross Products 169
4.1.10 Planes 170
4.2 Three-Dimensional Primitives 172
4.3 Coordinate Systems and Frames 175
4.3.1 Representations and N-Tuples 177
4.3.2 Change of Coordinate Systems 178
4.3.3 Example: Change of Representation 180
4.3.4 Homogeneous Coordinates 182
4.3.5 Example: Change in Frames 185
4.3.6 Working with Representations 187
4.4 Frames in WebGL 189
4.5 Matrix and Vector Types 193
4.5.1 Row Versus Column Major Matrix Representations 195
4.6 Modeling a Colored Cube 195
4.6.1 Modeling the Faces 196
4.6.2 Inward- and Outward-Pointing Faces 197
4.6.3 Data Structures for Object Representation 198
4.6.4 The Colored Cube 198
4.6.5 Color Interpolation 200
4.6.6 Displaying the Cube 201
4.6.7 Drawing by Elements 202
4.6.8 Primitive Restart 203
4.7 Affine Transformations 204
4.8 Translation, Rotation, and Scaling 207
4.8.1 Translation 207
4.8.2 Rotation 207
4.8.3 Scaling 209
4.9 Transformations in Homogeneous Coordinates 211
4.9.1 Translation 212
4.9.2 Scaling 213
4.9.3 Rotation 214
4.9.4 Shear 215
4.10 Concatenation of Transformations 217
4.10.1 Rotation About a Fixed Point 218
4.10.2 General Rotation 219
4.10.3 The Instance Transformation 220
4.10.4 Rotation About an Arbitrary Axis 222
4.11 Transformation Matrices in WebGL 226
4.11.1 Current Transformation Matrices 227
4.11.2 Basic Matrix Functions 228
4.11.3 Rotation, Translation, and Scaling 229
4.11.4 Rotation About a Fixed Point 229
4.11.5 Order of Transformations 230
4.12 Spinning of the Cube 231
4.12.1 Uniform Matrices 233
4.13 Smooth Rotations 235
4.13.1 Incremental Rotation 236
4.14 Quaternions 237
4.14.1 Complex Numbers and Quaternions 237
4.14.2 Quaternions and Rotation 238
4.14.3 Quaternions and Gimbal Lock 240
4.15 Interfaces to Three-Dimensional Applications 242
4.15.1 Using Areas of the Screen 242
4.15.2 A Virtual Trackball 243
4.15.3 Implementing the Trackball with Quaternions 245
Summary and Notes 247
Code Examples 247
Suggested Readings 248
Exercises 248
CHAPTER 5 VIEWING 253
5.1 Classical and Computer Viewing 253
5.1.1 Classical Viewing 255
5.1.2 Orthographic Projections 255
5.1.3 Axonometric Projections 256
5.1.4 Oblique Projections 258
5.1.5 Perspective Viewing 259
5.2 Viewing with a Computer 260
5.3 Positioning of the Camera 262
5.3.1 From the Object Frame to the Camera Frame 262
5.3.2 Two Viewing APIs 267
5.3.3 The Look-At Function 271
5.4 Parallel Projections 272
5.4.1 Orthogonal Projections 274
5.4.2 Parallel Viewing with WebGL 275
5.4.3 Projection Normalization 276
5.4.4 Orthogonal Projection Matrices 277
5.4.5 Oblique Projections 279
5.4.6 An Interactive Viewer 282
5.5 Perspective Projections 284
5.5.1 Simple Perspective Projections 285
5.6 Perspective Projections with WebGL 288
5.6.1 Perspective Functions 289
5.7 Perspective Projection Matrices 290
5.7.1 Perspective Normalization 291
5.7.2 WebGL Perspective Transformations 294
5.7.3 Perspective Example 296
5.8 Hidden-Surface Removal 296
5.8.1 Culling 298
5.9 Displaying Meshes 299
5.9.1 Displaying Meshes as Surfaces 302
5.9.2 Polygon Offset 304
5.9.3 Walking Through a Scene 305
5.10 Projections and Shadows 306
5.10.1 Projected Shadows 306
5.11 Shadow Maps 310
Summary and Notes 312
Code Examples 313
Suggested Readings 313
Exercises 313
CHAPTER 6 LIGHTING AND SHADING 317
6.1 Light and Matter 318
6.2 Light Sources 321
6.2.1 Color Sources 322
6.2.2 Ambient Light 322
6.2.3 Point Sources 323
6.2.4 Spotlights 324
6.2.5 Distant Light Sources 325
6.3 The Phong Lighting Model 326
6.3.1 Ambient Reflection 328
6.3.2 Diffuse Reflection 329
6.3.3 Specular Reflection 330
6.3.4 The Modified Phong Model 333
6.4 Computation of Vectors 334
6.4.1 Normal Vectors 334
6.4.2 Angle of Reflection 336
6.5 Polygonal Shading 338
6.5.1 Flat Shading 339
6.5.2 Smooth and Gouraud Shading 339
6.5.3 Phong Shading 341
6.6 Approximation of a Sphere by Recursive Subdivision 343
6.7 Specifying Lighting Parameters 346
6.7.1 Light Sources 346
6.7.2 Materials 347
6.8 Implementing a Lighting Model 348
6.8.1 Applying the Lighting Model in the Application 348
6.8.2 Efficiency 351
6.8.3 Lighting in the Vertex Shader 353
6.9 Shading of the Sphere Model 357
6.10 Per-Fragment Lighting 359
6.11 Nonphotorealistic Shading 361
6.12 Global Illumination 363
Summary and Notes 364
Code Examples 365
Suggested Readings 366
Exercises 366
CHAPTER 7 TEXTURE MAPPING 369
7.1 Buffers 369
7.2 Digital Images 371
7.3 Mapping Methods 375
7.4 Two-Dimensional Texture Mapping 377
7.5 Texture Mapping in WebGL 384
7.5.1 Texture Objects 384
7.5.2 The Texture Image Array 385
7.5.3 Texture Coordinates and Samplers 386
7.5.4 Texture Sampling 391
7.5.5 Working with Texture Coordinates 395
7.5.6 3D Texture Mapping 397
7.5.7 Multitexturing 403
7.6 Environment Maps 407
7.7 Reflection Map Example 412
7.8 Bump Mapping 417
7.8.1 Finding Bump Maps 418
7.8.2 Bump Map Example 421
Summary and Notes 425
Code Examples 427
Suggested Readings 427
Exercises 427
CHAPTER 8 WORKING WITH FRAMEBUFFERS 429
8.1 Blending Techniques 429
8.1.1 Opacity and Blending 429
8.1.2 Image Blending 431
8.1.3 Blending in WebGL 431
8.1.4 Antialiasing Revisited 433
8.1.5 Back-to-Front and Front-to-Back Rendering 435
8.1.6 Scene Antialiasing and Multisampling 436
8.2 Image Processing 436
8.2.1 Other Multipass Methods 438
8.3 GPGPU 439
8.4 Framebuffer Objects 443
8.5 Multi-pass Rendering Techniques 449
8.5.1 Ambient Occlusion 450
8.5.2 Deferred Lighting 451
8.6 Buffer Ping-Ponging 452
8.7 Picking 455
8.8 Shadow Maps 460
8.9 Projective Textures 464
Summary and Notes 466
Code Examples 467
Suggested Readings 468
Exercises 468
CHAPTER 9 MODELING AND HIERARCHY 471
9.1 Geometries and Instances 472
9.2 Hierarchical Models 474
9.3 A Robot Arm 476
9.4 Trees and Traversal 480
9.4.1 A Stack-Based Traversal 481
9.5 Use of Tree Data Structures 485
9.6 Animation 489
9.7 Graphical Objects 490
9.7.1 Methods, Attributes, and Messages 491
9.7.2 A Cube Object 492
9.7.3 Instancing in WebGL 496
9.7.4 Objects and Hierarchy 498
9.7.5 Geometric and Nongeometric Objects 499
9.8 Scene Graphs 500
9.9 Implementing Scene Graphs 502
9.9.1 three.js Examples 504
9.10 Other Tree Structures 508
9.10.1 CSG Trees 508
9.10.2 BSP Trees 510
9.10.3 Quadtrees and Octrees 512
Summary and Notes 514
Code Examples 515
Suggested Readings 515
Exercises 516
CHAPTER 10 PROCEDURAL METHODS 519
10.1 Algorithmic Models 519
10.2 Physically Based Models and Particle Systems 521
10.3 Newtonian Particles 522
10.3.1 Independent Particles 524
10.3.2 Spring Forces 524
10.3.3 Attractive and Repulsive Forces 526
10.4 Solving Particle Systems 527
10.5 Constraints 530
10.5.1 Collisions 530
10.5.2 Soft Constraints 533
10.6 A Simple Particle System 533
10.6.1 Displaying the Particles 534
10.6.2 Updating Particle Positions 535
10.6.3 Collisions 535
10.6.4 Forces 536
10.6.5 Flocking 537
10.7 Agent-Based Models 538
10.8 Using Point Sprites 541
10.9 Language-Based Models 545
10.10 Recursive Methods and Fractals 550
10.10.1 Rulers and Length 551
10.10.2 Fractal Dimension 552
10.10.3 Midpoint Division and Brownian Motion 554
10.10.4 Fractal Mountains 555
10.10.5 The Mandelbrot Set 556
10.10.6 Mandelbrot Fragment Shader 559
10.11 Procedural Noise 561
Summary and Notes 563
Code Examples 565
Suggested Readings 566
Exercises 566
CHAPTER 11 CURVES AND SURFACES 569
11.1 Representation of Curves and Surfaces 569
11.1.1 Explicit Representation 569
11.1.2 Implicit Representations 571
11.1.3 Parametric Form 572
11.1.4 Parametric Polynomial Curves 573
11.1.5 Parametric Polynomial Surfaces 574
11.2 Design Criteria 575
11.3 Parametric Cubic Polynomial Curves 578
11.4 Interpolation 579
11.4.1 Blending Functions 581
11.4.2 The Cubic Interpolating Patch 582
11.5 Hermite Curves and Surfaces 584
11.5.1 The Hermite Form 584
11.5.2 Geometric and Parametric Continuity 587
11.6 Be′ zier Curves and Surfaces 588
11.6.1 Be′ zier Curves 588
11.6.2 Be′ zier Surface Patches 591
11.7 Cubic B-Splines 592
11.7.1 The Cubic B-Spline Curve 593
11.7.2 B-Splines and Basis 597
11.7.3 Spline Surfaces 597
11.8 General B-Splines 598
11.8.1 Recursively Defined B-Splines 599
11.8.2 Uniform Splines 601
11.8.3 Nonuniform B-Splines 601
11.8.4 NURBS 602
11.8.5 Catmull-Rom Splines 603
11.9 Rendering Curves and Surfaces 604
11.9.1 Polynomial Evaluation Methods 605
11.9.2 Recursive Subdivision of Be′ zier Polynomials 606
11.9.3 Rendering Other Polynomial Curves by Subdivision 609
11.9.4 Subdivision of Be′ zier Surfaces 610
11.10 The Utah Teapot 611
11.11 Algebraic Surfaces 614
11.11.1 Quadrics 614
11.11.2 Rendering of Surfaces by Ray Casting 615
11.12 Subdivision Curves and Surfaces 615
11.12.1 Mesh Subdivision 616
11.13 Mesh Generation from Data 619
11.13.1 Height Fields Revisited 619
11.13.2 Delaunay Triangulation 620
11.13.3 Point Clouds 624
11.14 Graphics API support for Curves and Surfaces 624
11.14.1 Tessellation Shading 625
11.14.2 Geometry Shading 626
Summary and Notes 626
Code Examples 627
Suggested Readings 627
Exercises 627
CHAPTER 12 FROM GEOMETRY TO PIXELS 631
12.1 Basic Rendering Strategies 632
12.2 Rendering Pipeline 634
12.2.1 Modeling 634
12.2.2 Geometry Processing 635
12.2.3 Rasterization 636
12.2.4 Fragment Processing 637
12.3 Clipping 638
12.3.1 Clipping 638
12.3.2 Bounding Boxes and Volumes 639
12.3.3 Clipping Against Planes 640
12.4 Rasterization 642
12.5 Polygon Rasterization 645
12.5.1 Inside–Outside Testing 646
12.5.2 WebGL and Concave Polygons 647
12.6 Hidden-Surface Removal 649
12.6.1 Object-Space and Image-Space Approaches 649
12.6.2 Sorting and Hidden-Surface Removal 651
12.6.3 Scan Line Algorithms 651
12.6.4 Back-Face Removal 653
12.6.5 The z-Buffer Algorithm 655
12.6.6 Depth Sort and the Painter’s Algorithm 657
12.7 Hardware Implementations 660
12.8 Antialiasing 663
12.9 Display Considerations 666
12.9.1 Color Systems 666
12.9.2 The Color Matrix 669
12.9.3 Gamma Correction 671
12.9.4 Dithering and Halftoning 671
Summary and Notes 672
Suggested Readings 674
Exercises 675
CHAPTER 13 ADVANCED RENDERING 679
13.1 Going Beyond Pipeline Rendering 679
13.2 Ray Tracing 680
13.3 Building a Simple Ray Tracer 684
13.3.1 Recursive Ray Tracing 685
13.3.2 Calculating Intersections 686
13.3.3 Ray-Tracing Variations 689
13.4 The Rendering Equation 690
13.5 Global Illumination and Path Tracing 693
13.6 RenderMan 695
13.7 Parallel Rendering 696
13.7.1 Sort-Middle Rendering 699
13.7.2 Sort-Last Rendering 699
13.7.3 Sort-First Rendering 703
13.8 Implicit Functions and Contour Maps 704
13.8.1 Marching Squares 704
13.8.2 Marching Triangles 709
13.9 Volume Rendering 710
13.9.1 Volumetric Data Sets 711
13.9.2 Visualization of Implicit Functions 712
13.10 Isosurfaces and Marching Cubes 714
13.11 Marching Tetrahedra 716
13.12 Mesh Simplification 717
13.13 Direct Volume Rendering 719
13.13.1 Assignment of Color and Opacity 719
13.13.2 Splatting 720
13.13.3 Volume Ray Tracing 722
13.13.4 Texture Mapping of Volumes 723
13.14 Image-Based Rendering 723
13.14.1 Distance from Stereo Pairs 724
13.14.2 The Fundamental Matrix 727
13.15 Virtual, Augmented, and Mixed Reality 727
13.16 A Final Example 729
Summary and Notes 731
Suggested Readings 732
Exercises 733
APPENDIX A INITIALIZING SHADERS 735
A.1 Shaders in the HTML file 735
A.2 Reading Shaders from Source Files 738
APPENDIX B SPACES 741
B.1 Scalars 741
B.2 Vector Spaces 742
B.3 Affine Spaces 744
B.4 Euclidean Spaces 747
B.5 Projections 747
B.6 Gram-Schmidt Orthogonalization 748
Suggested Readings 749
Exercises 749
APPENDIX C MATRICES 751
C.1 Definitions 751
C.2 Matrix Operations 752
C.3 Row and Column Matrices 753
C.4 Rank 754
C.5 Change of Representation 755
C.6 The Cross Product 757
C.7 Eigenvalues and Eigenvectors 757
C.8 Vector and Matrix Objects 759
Suggested Readings 759
Exercises 760
APPENDIX D SAMPLING AND ALIASING 761
D.1 Sampling Theory 761
D.2 Reconstruction 766
D.3 Quantization 768
Suggested Readings 769
References 771
展开
前 言
本书是计算机图形学的入门教材,重点介绍应用程序的编写。本书于1997年首次出版,第一版使用了OpenGL和自顶向下的方法,这多多少少算是一场“革命”。在接下来的22年中,本书一共发行了八个版本。到目前为止,大多数计算机图形学的入门课程以及各种与本书类似的教材都采用了本书的方法。
自顶向下的方法
图形学的新进展以及本书前七个版本的成功,一直驱使着我们坚持采用自顶向下、面向编程的方法来介绍计算机图形学。虽然许多计算机科学与工程系现在开设了多门计算机图形学课程,但是大多数学生只选修一门。通常在学生学习了编程、数据结构、算法、软件工程和基础数学之后,再给他们安排这样一门图形学课程。因此,教师应以内容充实并且有趣的方式按上述已学内容来组织计算机图形学课程。我们希望这些学生在学习这门课程时尽可能早地编写出三维图形应用程序。底层的算法,例如绘制线段或者填充多边形,可以在学生编写了三维图形应用程序之后再考虑。
当被问到“为什么讲授编程”这个问题时,计算机教育的先驱John Kemeny曾经把自顶向下的编程方法与我们熟悉的汽车进行类比:你没有必要知道汽车发动机罩下面是什么,但是如果知道汽车的驾驶方法,就能够驾驶汽车而不是坐在汽车后座上。同样的类比适用于讲授计算机图形学的方法。第一种方法(算法的方法)是把汽车工作原理的方方面面都交代清楚,例如发动机、变速器、燃烧过程等。第二种方法(概览的方法)是雇一名司机,自己则坐在后座上。第三种方法(本书采用的编程方法)是教会你如何驾驶汽车并到达你的目的地。正如一句过时的广告词所说:“让我们把你放在驾驶员的位子上。”
本书第六版和第七版反映了由于图形硬件的进步而导致的图形应用程序开发的重大变化。特别是第六版完全基于着色器,使读者能够创建可以充分利用现代GPU性能的应用程序。我们注意到,这些改变也包含在OpenGL ES 2.0中,后者用于开发嵌入式系统和手持设备(例如手机和平板电脑)以及使用JavaScript语言实现的WebGL应用程序。当初,通过HTML5支持WebGL的Web浏览器出现的时候,我们并没有预料到大家会对WebGL产生如此大的兴趣。从第七版开始,我们从桌面版OpenGL切换到了WebGL。
正如我们在第七版中指出的那样,WebGL应用程序无处不在,包括运行在一些最新的智能手机上。虽然WebGL缺少最新桌面版OpenGL的某些高级功能,但是其与HTML5的整合,开辟了大量新的应用领域。另外一个好处是,我们发现它比桌面版OpenGL更适合讲授计算机图形学。我们在第七版中实现了这个愿望。无论是教学还是开发可在所有平台上运行的实际应用程序,WebGL已被证明是一种出色的应用程序编程接口(API)。
第七版具有如下特征:
所有的示例和程序均使用WebGL 1.0。
所有的代码均使用JavaScript编写。
所有的代码均可以在最新的Web浏览器中运行。
增加了一章关于交互的内容。
增加了关于绘制到纹理的内容。
增加了关于显示网格的内容。
包含了一个高效的矩阵-向量工具包。
增加了基于Agent建模的介绍。
第八版在成功使用WebGL的基础上,包含如下变动:
将所有示例和程序更新为WebGL 2.0。
增加了许多新的示例。
绘制到纹理的内容扩展成单独的一章,其中包括新的主题,如阴影贴图和投影纹理。
增加了三维纹理映射的内容。
更新了关于建模的章节,其中包括对three.js(一种流行的高级JavaScript场景图API)的介绍。
增加了使用点精灵进行模拟的内容。
扩展并更新了有关绘制的内容。
加强了对硬件实现和GPU架构的讨论。
使用WebGL和JavaScript编程
当本书的第一作者Edward Angel在30多年前开始讲授计算机图形学的时候,以面向编程的方式讲授这门课程并编写相应教材的最大障碍是,缺乏一个被广泛接受的图形库或者API。当时遇到的困难包括:高成本、可用性受限、缺乏通用性以及高度复杂性。OpenGL的开发解决了我们在使用其他API以及使用自己编写的软件作为替代方案时所遇到的大多数困难。如今的OpenGL在所有的平台上都得到支持,并被普遍认为是跨平台的标准。WebGL建立在OpenGL被广泛接受(实际上它们是相同的API)的基础上,但是使用Web技术提供了更易于访问的开发平台。
一门计算机图形学的课程不能仅讲授如何使用一种特定的API,而一种好的API应使讲授图形学中的一些关键内容变得更加易于理解,这些内容包括三维变换、光照和着色、客户/服务器图形系统、建模以及实现算法。我们相信,OpenGL的扩展功能以及良好定义的结构,可以为讲授图形学理论和实践这两方面都提供更好的基础,而且OpenGL同样也可以为讲授包括纹理映射、合成以及可编程着色器在内的一些高级概念提供更好的基础。
大约25年前,Edward Angel就开始在授课时使用OpenGL,结果令他欣喜若狂。到了学期中间,每个学生都能够编写一个中等复杂程度的三维图形应用程序,而编写这样的程序需要理解三维观察和事件驱动的输入。在以往的计算机图形学教学中,Edward Angel从未获得如此好的教学效果,那次课程孕育出本书的第一版。
本书是关于计算机图形学的教材,而不是OpenGL或者WebGL使用手册。因此,它并不涵盖WebGL API的所有方面,而仅说明了掌握本书内容所必需的那部分。因此,本书在介绍WebGL时的定位是允许使用其他API的用户可以毫无困难地阅读本书。
与早期版本不同,这一版使用WebGL和JavaScript来编写所有的示例。WebGL 2.0是OpenGL ES 3.0的JavaScript实现,可在最新的浏览器中运行。由于HTML5的支持,WebGL不但提供了和其他应用程序的兼容性,而且不依赖于特定的平台。WebGL在浏览器中运行,并且可以充分利用本地图形硬件。虽然JavaScript不是我们讲授编程课程常用的语言,但它是一种Web语言。在过去的几年中,JavaScript变得越来越强大。经验告诉我们,那些熟悉Java、Python、C或者C++语言的学生在使用JavaScript编程时几乎没有遇到困难。为了使本书能够继续支持具有不同背景的广泛读者,我们保留了仅需ES5的JavaScript基本内容。对JavaScript有更多经验的学生可以毫不费力地更新我们的示例和库,从而利用ES6中包含的强大的JavaScript新特性①。
包括WebGL在内的所有现代OpenGL版本都要求每个应用程序提供两个着色器,这两个着色器用OpenGL着色器语言(OpenGL Shading Language,GLSL)编写。GLSL类似于C语言,但增加了向量和矩阵作为基本类型,并含有一些C++语言特性(例如运算符重载)。我们提供了一个JavaScript库MV.js,不仅支持我们使用的图形函数表示,还支持GLSL中的类型和操作。这个库还包含许多函数,这些函数执行的操作等效于OpenGL早期固定功能版本中不推荐使用的那些函数。
适用的读者
本书适用于计算机科学与工程专业的高年级本科生和一年级研究生,以及具有良好编程能力的其他专业的学生。本书对于许多专业人员也具有参考价值。我们已经成功地为专业人员讲授了100多次短期课程(包括在SIGGRAPH年会上介绍的许多课程,另外YouTube上的SIGGRAPH University频道也提供了其中的两门课程),甚至还有Coursera提供的大型在线开放课程(MOOC)。从这些非传统意义的学生身上获得的经验极大地影响了本书的内容。
在阅读本书之前,读者应该具备JavaScript、Python、C、C++或Java语言的良好编程能力,理解基本的数据结构(数组、链表和树),并具有线性代数和三角学的基础知识。我们发现,计算机科学专业学生的数学背景差异很大,不管是本科生还是研究生都是如此。因此,本书包含了很多计算机图形学基础所需的线性代数和几何学知识。
本书的组织
本书内容组织如下:
第1章概述了计算机图形学,并介绍了光学设备的成像方法,这样我们从一开始就引入了三维的概念。
第2章介绍了WebGL编程。虽然编写的第一个示例程序是二维的(每一章都有一个或者多个完整的编程示例),但这个程序是嵌入在三维设置下编写的,可以扩展到三维。
第3章介绍了交互式图形,并在浏览器环境中开发了基于事件驱动的图形程序。
第4章和第5章着重讨论了三维图形学的相关概念。第4章讨论了如何定义和处理三维对象,而第5章讨论了如何观察它们。
第6章介绍了光线与材质之间的相互作用和着色。
第7章和第8章介绍了如今被图形硬件和WebGL所支持的许多新的离散技术。所有这些技术都涉及各种缓存的使用。第7章将重点放在具有单个纹理的经典纹理映射上,而第8章则将重点放在使用离屏缓存(off-screen buffer)的纹理映射上。
上述这些章应按顺序讲授,在一个总共15周的学期里,大约10周可以讲完这些内容。
后面的5章可以按照任意顺序阅读。这5个主题或多或少是开放性的,读者可以概览,也可以深入探讨其中的一些主题。
第9章包含层级建模主题中的若干内容,涉及从层级模型(封装了模型各部分之间的关系)的构造到因特网图形绘制的高级方法。这一章还包含对场景图的介绍。
第10章介绍了许多过程方法,包括粒子系统、分形和过程噪声。
第11章讨论了曲线与曲面,包括细分曲面。
第12章讨论了实现。对三维图形绘制流水线中的每个基本步骤(包括裁剪、线段生成和多边形填充)都给出了一种或两种主要算法。
最后,第13章介绍了一些其他的高级绘制方法。进一步讨论了光线跟踪和辐射度方法,并介绍了基于图像的绘制、并行绘制以及虚拟现实和增强现实的概念。
本书包含几个附录,以提供额外参考:
附录A提供了读取、编译和链接应用程序与着色器所需的WebGL函数的详细信息。
附录B和附录C包含了对数学背景知识的回顾。
附录D从奈奎斯特定理开始讨论采样和混叠,并将这些结果应用于计算机图形学。
相比第七版的变化
读者对本书前七个版本的绝大多数评价都是肯定的,特别是对于采用OpenGL/WebGL和自顶向下的方法更是如此。在第六版中,我们放弃了固定功能绘制流水线,转而采用完全基于着色器的OpenGL。在第七版中,我们使用了WebGL。WebGL不仅完全基于着色器(每个应用程序必须提供一个顶点着色器和一个片元着色器),而且是一个能在最新的Web浏览器中使用的版本。
在本书第八版中,我们更新了所有的代码以使用WebGL 2.0。尽管我们引入了其他一些WebGL 2.0的特性(三维纹理映射是一个例外),但是新版GLSL使得编写的着色器代码更加清晰。对于不使用新特性的示例,我们会将WebGL 1.0版本的代码保留在本书的网站(www.interactivecomputergraphics.com/8E/Code)上①。
书中所有的应用程序使用JavaScript编写。虽然JavaScript具有其自身的特性,并且可能不是学生编程课程中使用的语言,但我们并未发现学生在使用JavaScript时有任何问题。JavaScript有许多变体,学生和教师可能更喜欢使用。另外,有许多方法可以使用其他语言开发的代码,然后通过语言转换编译器(transpiler)将它转换为JavaScript代码。各种转换程序并不稳定,因此我们坚持使用在所有地方都可以运行的JavaScript程序。
我们对离屏绘制和绘制到纹理增加了其他内容,包括投影纹理和阴影贴图等技术。我们还增加了有关将GPU用于各种计算密集型应用(例如图像处理和仿真)的内容。此外,书中还增加了三维纹理映射(WebGL 2.0中新增的特性)及其在体可视化上的应用。由于增加了很多内容,我们将上一版本的第7章分成了两章(第八版的第7章和第8章)。
读者对之前版本中第1~6章的核心内容反响很好,除了将代码更新为WebGL 2.0,我们对这些章节内容几乎没有做什么变动。我们将第1~8章视为计算机图形学入门课程的核心内容,第9~13章可以按任意顺序使用,既可以作为一学期的概论课,也可以作为两学期课程的基础内容。
第9章已更新,使其与three.js场景图更加一致,并且包含了three.js API的简介。第10章增加了在粒子模拟中使用点精灵的内容。
第11章基本上没有变化。有关实现的内容(以前在第七版的第8章)已移至第12章。有趣的是,我们发现与许多经典算法(例如线段生成和裁剪之类的任务)相关的内容已不再是大多数计算机图形学入门课程的核心部分。我们保留了本章仍然与计算机图形学高度相关的部分内容,并删除了不再用于现代GPU的内容。第13章(第七版的第12章)已更新,以涵盖一些其他的绘制方法,例如延迟着色。
致谢
在过去的几年中,Edward Angel有幸在新墨西哥大学遇到了许多优秀的学生,是这些学生最早使他对OpenGL产生了兴趣,并从他们那里学到了很多东西。这些学生包括:Ye Cong,Pat Crossno,Tommie Daniel,Chris Davis,Lisa Desjarlais,Kim Edlund,Lee Ann Fisk,Maria Gallegos,Brian Jones,Christopher Jordan,Takeshi Hakamata,Max Hazelrigg,Sheryl Hurley,Thomas Keller,Ge Li,Pat McCormick,Al McPherson,Ken Moreland,Martin Muller,David Munich,Jim Pinkerton,Jim Prewett,Dave Rogers,Hal Smyer,Dave Vick,Hue(Bumgarner-Kirby)Walker,Brian Wylie,Jin Xiong。
书中许多插图的例子都出自这些学生之手。
本书第一版是Edward Angel在休假期间撰写的,他在5个不同的国家访学时完成了这本书。如果没有若干人士以及若干大学、研究机构给他提供帮助,这本书是不可能完成的,他们给Edward Angel提供了很多便利。衷心感谢委内瑞拉安第斯大学(Universidad de los Andes)的Jonas Montilva和Chris Birkbeck,厄瓜多尔天球赤道理工大学(Universidad Tecnologica Equinoccial)的Rodrigo Gallegos和Aristides Novoa,中国台湾“清华大学”的Long Wen Chang,中国香港中文大学的Kim Hong Wong和Pheng Ann Heng。Edward Angel在许多地方的参观访问都得益于国际超导技术中心(ISTEC)和新墨西哥大学的Ramiro Jordan的帮助。无论Edward Angel何时有问题,新墨西哥大学的John Brayer和Jason Stewart以及Addison-Wesley出版社的Helen Goldstein 都设法帮他解决。Edward Angel的网站上描述了他写作本书第一版的经历。
NVIDIA的David Kirk和Mark Kilgard慷慨地为很多算法的测试提供了显卡。还有许多人士给予了极大帮助,他们是:Ben Bederson,Gonzalo Cartagenova,Tom Caudell,Kathi Collins,Kathleen Danielson,Roger Ehrich,Robert Geist,Chuck Hansen,Mark Henne,Bernard Moret,Dick Nordhaus,Helena Saona,Vicki Shreiner,Gwen Sylvan,Mason Woo。OpenGL社区的Mark Kilgard、Brian Paul和Nate Robins给予了很多帮助,他们编写了让程序员在各种平台上都能开发OpenGL代码的软件。我们的许多SIGGRAPH课程都为我们提供了展现想法和进行演示的舞台。NVIDIA的Eric Haines和Analytic Graphics的Patrick Cozzi作为审稿人,他们提供的帮助尤为重要。
新墨西哥大学的艺术、研究、技术和科学实验室(ARTS Lab)以及高性能计算中心对Edward Angel的许多项目提供了支持。新墨西哥大学计算机科学系、新墨西哥大学美术学院的艺术技术中心、美国国家科学基金、美国Sandia国家实验室和Los Alamos国家实验室资助了Edward Angel的许多学生与研究项目,本书的部分内容就来自这些研究项目。曾在Lodestar Astronomy Center工作,如今在ARTS Lab的David Beining为FullDome项目提供了极大的支持。Sheryl Hurley、Christopher Jordan、Laurel Ladwig、Jon Strawn和Hue(Bumgarner-Kirby)Walker通过FullDome项目提供了本书插图中的一些图像。Hue Walker为以前的版本创作了出色的封面并提供了一些示例。
Edward Angel还要感谢始创于Santa Fe Complex的非正式团体,他们一直与Redfish和Simtable合作,其中包括:Jeff Bowles,Ruth Chabay,Emma Gould,Stephen Guerin,Kaz Manavi,Bruce Sherwood, Scott Wittenberg,尤其是JavaScript的推广者Owen Densmore,他说服Edward Angel在Santa Fe讲授计算机图形学课程以深入研究JavaScript。我们都从这次经历中获益良多。
Dave Shreiner首先要感谢Edward Angel邀请他参与该项目。多年来,我们就有关OpenGL以及如何讲授OpenGL的知识交换了意见,很高兴将这些概念推广给新的读者。Dave Shreiner还要感谢那些创建OpenGL并在Silicon Graphics Computer Systems从事开发的人们,他们是那个时代的领路人。Dave Shreiner乐于认识Khronos的各个工作组,他们不断发展API并将图形带到意想不到的地方。最后,正如Edward Angel所言,SIGGRAPH在这些材料的开发中发挥了突出作用,对于那些为探索我们的想法而积极提供测试主题的人士,我们深表感谢。
使用过之前版本原稿的评审人和教师在本书内容的广度与深度方面提出了各种各样的看法。这些评审人和教师包括:Gur Saran Adhar(University of North Carolina at Wilmington),Mario Agrular(Jacksonville State University),Michael Anderson(University of Hartford),Norman I. Badler(University of Pennsylvania),Mike Bailey(Oregon State University),Marty Barrett(East Tennessee State University),C. S. Bauer(University of Central Florida),Bedrich Benes(Purdue University),Kabekode V. Bhat(The Pennsylvania State University),Isabelle Bichindaritz(University of Washington,Tacoma),Cory D. Boatright(University of Pennsylvania),Eric Brown,Robert P. Burton(Brigham Young University),Sam Buss(University of California,San Diego),Kai H. Chang(Auburn University),Patrick Cozzi(University of Pennsylvania and Analytic Graphics,Inc),James Cremer(University of Iowa),Ron DiNapoli(Cornell University),John David N. Dionisio(Loyola Marymount University),Eric Alan Durant(Milwaukee School of Engineering),David S. Ebert(Purdue University),Richard R. Eckert(Binghamton University),W. Randolph Franklin(Rensselaer Polytechnic Institute),Natacha Gueorguieva(City University of New York/College of Staten Island),Jianchao(Jack) Han(California State University,Dominguez Hills),Chenyi Hu(University of Central Arkansas),George Kamberov(Stevens Institute of Technology),Mark Kilgard(NVIDIA Corporation),Lisa B. Lancor(Southern Connecticut State University),Chung Lee(California State Polytechnic University,Pomona),John L. Lowther(Michigan Technological University),R. Marshall(Boston University and Bridgewater State College),Hugh C. Masterman(University of Massachusetts,Lowell),Bruce A. Maxwell(Swathmore College),Tim McGraw(West Virginia University),James R.Miller(University of Kansas),Rodrigo Obando(Columbus State University),Jeff Parker(Harvard University),Jon A. Preston(Southern Polytechnic State University),Harald Saleim(Bergen University College),Andrea Salgian(The College of New Jersey),Lori L. Scarlatos(Brooklyn College,CUNY),Han-Wei Shen(The Ohio State University),Oliver Staadt(University of California,Davis),Stephen L. Stepoway(Southern Methodist University),Bill Toll(Taylor University),Michael Wainer(Southern Illinois University,Carbondale),Yang Wang(Southern Methodist State University),Steve Warren(Kansas State University),Mike Way(Florida Southern College),George Wolberg(City College of New York),Xiaoyu Zhang(California State University San Marcos),Ye Zhao(Kent State University),Ying Zhu(Georgia State University)。虽然最后的定稿可能没有反映出他们的意见(因为有些意见彼此相左),但每位评审人的意见都鞭策着我们反思书稿的每一页内容。
我们同样感谢Addison-Wesley出版社的出版团队。在本书的八个版本和OpenGL Primer的出版过程中,Edward Angel与Peter Gordon、Maite Suarez-Rivas和Matt Goldstein三位编辑合作得非常愉快。对于这个版本,Pearson Education的Carole Snyder提供了很大的帮助。从第二版开始,Paul Anagnostopoulos一直帮助解决使用Windfall Software工具时的排版问题,其帮助之大无法用语言表达。Edward Angel要特别感谢编辑Lyn Dupré,如果读者看到过第一版的原稿,就会惊叹于Lyn Dupré的妙笔神功。
Edward Angel在此要特别感谢妻子Rose Mary,她为本书第一版制作了插图,其中许多插图构成了本书插图的基础。也许只有经历过图书出版过程并撰写过许多文稿的人以及为出版工作做出过贡献的人才能充分理解写书过程的艰辛。真诚地把本书献给Rose Mary,尽管这仍不足以表达Edward Angel对妻子所做贡献的感激之情。
Dave Shreiner感激妻子Vicki的支持和鼓励,没有她,本书的创造性成果就无法展现给读者,她不仅给予Dave Shreiner温暖,陪伴左右,而且对本书的叙述和素材提出了宝贵意见。在Dave Shreiner对OpenGL的所有研究中,她都称得上是一个不可多得的搭档。
Edward Angel
Dave Shreiner
展开