Real-Time Rendering-第一章 Introduction

第一章 Introduction(导论)

实时渲染主要是有关使用计算机如何快速生成图像的过程,这是计算机图形学中最具有交互性的领域。交互性是指在屏幕上显示了一幅图像,观察者会据此作出某些行动或反应,并反馈给计算机以生成下一幅图像。当这种不断反应并渲染的循环过程执行的速度足够快时,观察就会沉浸在一种动态的变化过程中,而不是简单地看到多个单独的图像。

图像显示的速度可以使用frames per second(fps)或者Hertz(Hz)进行表示。如果一秒钟渲染一帧图像,就无法感觉到交互性,观察都就会痛苦的等等每一幅新图像的到来。当渲染速度达到大约6 fps,就会开始产生一点点交互的感觉。如果一个应用程序的显示速度达到15 fps就完全是实时的,观察都就可以重点关注作用和反作用。然而,实时的交互性有一个上限。在显示速度大于等于72 fps时,实时性就无法有效的察觉到。

虽然图像闪烁速度达到60 fps时显示效果可能就是可接受的,但是要减少交互响应时间,一个更高的速度是非常重要的。即使是延迟时间尽可能少于15毫秒也会降低并干扰交互性。如果以速度作为唯一标准,任何应用程序只要能够快速响应用户命令并在屏幕上绘制图像都是符合要求的。实时渲染通常是指三维渲染。

构成实时渲染的充分条件是交互性,以及某种意义上与三维空间的关联性,但是定义实时渲染还需要第三个组成部分:图形加速硬件(graphics acceleration hardware,显卡)。虽然专门用于三维图形加速的硬件已经在专业的计算机工作站中使用了很多年,但直到最近几年面向普通消费者的显卡才真正成为可能。人们普遍认为1996年推出的3Dfx Voodoo 1是第一个消费级显卡。近年来随着消费级显卡的快速发展,在家用计算机上添加一个三维图形加速硬件与添加一对扬声器一样简单。虽然对于实时渲染来说显卡不是绝对必要的,但是在大多数实时应用程序中却是不可或缺的。图1.1中显示了一个使用显卡执行实时渲染的示例生成的逼真的图像结果。
ATI Toy Shop demo
图1.1. A wonderful image from the Toy Shop demo [1246, 1247, 1249], generated at interactive rates. (Image courtesy of Natalya Tatarchuk, ATI Research, Inc.)

在过去的几年里,显卡的发展在交互式计算机图形学领域已经得到了爆发式的研究成果。在本书中我们将重点讲解提高渲染速度以及改进图像质量的方法,同时还会描述加速算法和图形APIs的特点及局限性。由于我们无法深入涵盖每一个图形学主题,因此本书旨在介绍概念和术语,使读者在一定程度上知道如何以及何时使用某种方法,并提供深入学习某个主题的最好的参考资料。我们希望本书中所提供的内容是值得你花时间和精力去学习的。

1.1 Contents Overview(内容概述)

以下先简要概述本书所有章节的内容。

  • 第2章,The Graphics Rendering Pipeline。本章描述了实时渲染的核心内容,即把一个场景描述的输入数据,经过处理转化成我们能直接看到的图像。
  • 第3章,The Graphics Processing Unit(GPU)。现代的GPU架构一般会结合使用fixed-function(固定功能)和programmable units(可编程单位)实现rendering pipeline的各个阶段。
  • 第4章,Transforms(变换操作)。Transforms是一组变换矩阵,用于操控objects的位置,方向,尺寸和形状,以及camera所处的位置和观察方向。
  • 第5章,Visual Appearance。本章开始讨论材质和光照的定义,以及使用它们实现逼真的外观。另外还讨论了其他的与显示外观相关的主题,比如通过antialiasing(抗锯齿)和gamma correction(伽玛较正)生成更高质量的图像。
  • 第6章,Texturing(纹理贴图)。实时渲染最强大的功能之一是能够快速读取并显示纹理数据,比如在物体表面显示图片。本章主要讨论这种称为纹理贴图技术的实现机制,并举出了这种技术的各种使用方法。
  • 第7章,Advanced Shading(高级着色)。本章主要讨论正确显示材质的理论与实践方法,以及point light(点光源)的使用方法。
  • 第8章,Area and Environmental Lighting(区域和环境光照)。在这一章,将会详细探讨多种光源以及相关算法。
  • 第9章,Global Illumination(全局光照)。首先介绍了shadow(阴影),reflection(反射),refraction(折射)算法,然后讨论了有关radiosity(辐射着色),ray tracing(光线追踪),precomputed lighting(预计算光照)和ambient occlusion(环境光遮蔽)的主题内容。
  • 第10章,Image-Based Effects。在描述类似于自然光斑或火焰现象(或物体)时,使用polygons并不是最快或最真实的实现方法。本章将会讨论一些基于图像处理技术的不同的表示方法。比如,high-dynamic range rendering(高动态光照渲染),motion blur(动态模糊),以及depth of field(景深)相关的post-processing效果。
  • 第11章,Non-Photorealistic Rendering。试图使一个场景看起来更加逼真只是众多渲染样式中的一种。本章主要讨论其他的渲染样式,比如cartoon shading(卡通着色)。
  • 第12章,Polygonal Techniques。Geometric数据的来源非常广泛,有时需要修改这些数据以加快速度更好的进行渲染。本章主要讨论polygonal data(多边形数据)并对多边形进行整理简化。此外,还会讨论更精细的表示多边形的方式,比如triangle strips,fans以及meshes。
  • 第13章,Curves and Curved Surface(曲线和曲面)。使用硬件渲染几何图形从根本上来说是绘制点,线,多边形。只要在质量和渲染速度之间保持平衡,使用越复杂的曲面可以产生更精致的画面以及更光滑的表面。
  • 第14章,Acceleration Algorithms(加速算法)。完成了渲染之后,我们开始讨论如何加快渲染速度,本章主要讲解各种culling(剔除)方式,以及level of detail(LOD)渲染方法。
  • 第15章,Pipeline Optimization。一旦某个应用程序使用高效的渲染加速算法运行,使用各种优化技术可以使该程序渲染速度更快。本章主要讨论如何找到性能的瓶颈,并解决性能问题。另外还讨论了multiprocessing渲染技术。
  • 第16章,Intersection Test Mothods。在执行渲染,用户交互以及碰撞检测的过程中,intersection testing(相交测试)是非常重要的。本章提供了一种广泛用于几何相交测试的最高效的算法,in-depth coverage。
  • 第17章,Collision Detection(碰撞检测)。大多数实时渲染应用的一个关键要素是判断两个物体是否发生碰撞。对于这个快速发展的领域,本章提出了一些高效的算法。
  • 第18章,Graphics Hardware(显卡)。在前面的章节中,我们已经讨论了GPU加速算法,本章我们将重点关注显卡的如下部分:color depth(颜色深度),frame buffers(帧缓存)以及基础架构类型。另外讲述了一些具有代表性的图形加速器的研究案例。
  • 第19章,The Future。猜想一下未来的实时渲染技术。

此外,本书的附录中还讲述了linear algebra(线性代数)和trigonometry(三角函数)。

1.2 Notation and Definitions(常用数学记号及定义)

首先,我们将讲解在本书中使用的数学记号。关于本节使用的大量记号的全面讲解请阅读附录A。

1.2.1 Mathematical Notation(数学记号)

表格1.1中总结了我们将要使用的大部分数学记号。部分概念将会在本节进行描述。

TypeNotationExamples
angle(角度)lowercase Greek(小写希腊字母) αi,ϕ,ρ,η,λ242,θ
scalar(标量)lowercase italic(小写斜体) a,b,t,uk,v,wij
vector or point (向量,点)lowercase bold(小写粗体) a,u,vs,h(ρ),hz
matrix(矩阵)capital bold (首字母粗体) T(t),X,Rx(ρ)
plane(平面) π : a vector and a scalar(一个法向量及一个标量) π:nx+d=0π1:n1x+d=0
triangle(三角形) 3 points (3个点) v0v1v2,cba
line segment (线段)two points(2个点) uv,aibj
geometric entity(几何实体)capital italic(首字母斜体) AOBB,T,BAABB

表格1.1 Summary of the notation used in this book.

角度和标量来自 R (欧几里德空间),也就说这两个记号值为实数。向量和点记号以小写的粗体字母表示,并通过如下分量形式进行访问:

v=vxvyvz,

这是一种列向量的表示方式,常用于计算机图形学中。在本书的某些地方我们会使用行向量的表示形式 (vx,vy,vz) ,而不是更合理的列向量形式 (vxvyvz)T ,仅仅是因为行向量形式更容易阅读。

在homogenous coordinates(齐次坐标系,见附录A.4)中,使用 v=(vxvyvzvw)T 表示一个坐标,相应的 v=(vxvyvz0)T
表示一个向量, v=(vxvyvz1)T 表示一个坐标点。有时我们只使用三维向量和坐标点,但是要避免在向量和坐标点的类型表示之间变得模糊不清。对于矩阵运算,使用同样的记号表示向量和坐标点是非常有利的(见第4章的变换运算,以及附录A.4的齐次记号)。在某些算法中,使用数字索引如 v=(v0v1v2)T 的表示形式更方便,而不是使用 x,y,z 索引。这些表示向量和坐标点的方式同样适用于二维向量;在这种情况下,只是简单地忽略一个三维向量的最后一个分量。

接下来我们更详细地讲解矩阵。常用的矩阵大小分别是 2×2 , 3×3 4×4 。首先让我们回顾一下 3×3 矩阵 M 的访问方式,对该方式进行简单地扩展就可以用于访问任意大小的矩阵。矩阵 M 的(标量)元素使用 mij0(i,j)2 表示,其中 i 表示行号j表示列号,如公式1.2所示:

M=m00m10m20m01m11m21m02m12m22.(1.2)

另外如公式1.3所示,对于一个 3×3 的矩阵,可以使用以下记号把向量从矩阵 M 中把向量独立出来: m,j 表示第 j 列向量,mi,表示第 i 行向量(以列向量形式表示)。同向量和坐标点一样,也可以使用xyz作为访问列向量的索引,如果能使得运算更方便的话,有时还包含 w
M=(m,0m,1m,2)=(mxmymz)=mT0mT1mT2.(1.3)

平面的表示方式为 π:nx+d=0 ,这种方式包含了平面的数学方程式,平面的法向量 n 和标量 d 。其中法向量描述了平面的朝向。对于更普遍的表面(比如曲面),法向量描述了表面上某个特定点的方向。而对于平面,同一个法向量可以用于表示平面上所有点的方向。通常使用数学记号 π 表示一个平面。在三维空间中,平面把空间分为positive half-space(正半空间)和nagetive half-space(负半空间)分别表示为 nx+d>0 nx+d<0 。其他所有的坐标点都位于平面上。

使用三个坐标点 v0v1v2 可以定义一个三形,并表示为 v0v1v2

表格1.2中列出一些其他的数学运算符和对应的记号。其中,dot(点积),cross(叉积),determinant(行列式),length(长度)运算符在附录A进行了详细讲解。

NumOperatorDescription
1: dot product(点积)
2: × cross product(叉积)
3: vT 向量 v 的转置
4: 分段向量乘法
5: 正交点积一元运算符
6: || 矩阵的行列式
7: || 标量的绝对值
8: 参数的长度(模)
9: n! 阶乘
10: (nk) 二项式系数

表格1.2 Notation for some mathematical operators.

transpose(转置)运算符用于把一个列向量转换成行向量,反之亦然。因为可以使用压缩的形式把列向量写到一个文本块中,如 v=(vxvyvz)T 。第4个操作符需要进一步讲解: uv 表示向量 (uxvxuyvyvzvz)T ,即向量 u i 分量和向量v i 分量相乘,并把乘积保存到一个新向量对应的 i 分量中。在本书中,该运算符专门用于颜色向量的乘法运算。第5个运算符引自Graphics Gems IV,是用于一个二维向量的一元运算符。对一个向量 v=(vxvy)T 执行这种运算符操作,可以得到向量 v 的正交向量,即 v=(vyvx)T 。记号 |a| 表示标量 a 的绝对值,相应的,矩阵A的行列式使用记号 |A| 表示。有时,矩阵 A 的行列式也可以表示为 |A|=|abc|= det (a,b,c) ,其中 abc 为矩阵的列向量。第9个操作符是一个阶乘操作符,定义如下:

n!=n(n1)(n2)321.(1.4)

另外需要注意 0!=1

第10个操作符是一个二项式系数,定义为公式1.5所示:

(nk)=n!k!(nk)!.(1.5)

进一步我们可以把平面 x=0 y=0 z=0 称为coordinate planes(坐标平面)或axis-aligned planes(轴对齐平面)。同时,把轴 ex=(100)T ey=(010)T ez=(001)T 称为main axes(主轴)或main directions(主方向),通常对应为 x 轴,y轴和 z 轴。此外,这三个轴通常被称为standard basis(标准基)。除非特别说明,我们将统一使用正交基(由一组相互垂直的单位向量组成;见附录 A.3.1)。

记号[a,b]表示一个同时包括a和b值的范围,并且该范围内的所有数值都介于a和b之间。如果要表示一个所有数介于a和b之间但不包括a和b本身的数值范围,则使用记号 (a,b) 。另外,还可以组合使用这些记号,例如 [a,b) 表示所有介于a和b之间的数值,但是该范围包含a而不包含b。

在本书中经常会用到C语言数学库函数 atan2(y,x) ,因此专门在这里讲解一下。该函数是对三角函数 arctan(x) 的扩展。这两个函数主要不同的地方是值域不同,分别为 0atan2(y,x)<2π π2<arctan(x)<π2 ,另外在 atan2(y,x) 函数中还有一个额外的参数。要避免该参数值为0,以免产生除以0的运算,即执行 x=y/x 时避免 x=0

NumFunctionDescription
1: atan2(y,x) two-value arctangent
2: cos¯¯¯¯¯(θ) clamped cosine
3: log(n) natural logarithm of n n的自然对数)

表格1.3 Notation for some specialized mathematical functions.

第2个要介绍的函数是clamped-cosine(约束的余弦函数) cos¯¯¯¯¯(θ) ,该函数是为了使shading公式不至于太难阅读。如果正常的余弦函数值小于0,则clamped余弦函数就会返回0值。

第3个函数是 log(n) ,在本书中该记号表示自然对数 loge(n) ,而不是底为10的对数 log10(n)

此外,我们使用右手坐标系(见附录A.2),因为这是计算机图形学领域表示三维几何的标准坐标系。
颜色值使用一个包含3个元素分量的向量表示,比如 (redgreenblue) ,其中每一个元素分量都介于范围 [0,1] 之间。

1.2.2 Geometrical Definitions(几何表示)

大部分显卡使用的基本渲染图元(也称为绘制图元)分别是点,线和三角形。

除了点,线和三角形,唯一的例外是Pixel-Planes,可以直接绘制球体,NVIDIA NV1芯片可以直接绘制椭圆体。

在本书中,我们把几何体的集合称为模型或物体。把渲染环境中包含的全部模型的集体称为场景。此外,在场景中还可以包含材质描述,光照,以及观察规范。

物体有多种表示形式,比如一辆汽车,一幢大楼,甚至是一个线条。在实际工作过程中,通常使用一组绘制图元表示一个物体,但是凡事都有例外情况;一个物体还可能包含一种更高级的几何表示,比如贝塞尔曲线或曲面,细分表面等等。另外,物体也可以由其他的物体组成,例如,一个汽车模型的车门可以称为一个物体或都汽车的子集。

Further Reading and Resources

我们能够提供的最重要的参考资源是本书的配套网站:http://www.realtimerendering.com。该网站上包含了最新的信息,以及每一章相关的网站。随着时间的进展实时渲染领域也在不断发展。本书中我们会尽量重点讲解那些很可能不会过时的概念和技术。在网站上,我们会展示有关现今的软件开发人员的信息,并时刻保持最新的内容。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
完整版:https://download.csdn.net/download/qq_27595745/89522468 【课程大纲】 1-1 什么是java 1-2 认识java语言 1-3 java平台的体系结构 1-4 java SE环境安装和配置 2-1 java程序简介 2-2 计算机的程序 2-3 java程序 2-4 java类库组织结构和文档 2-5 java虚拟机简介 2-6 java的垃圾回收器 2-7 java上机练习 3-1 java语言基础入门 3-2 数据的分类 3-3 标识符、关键字和常量 3-4 运算符 3-5 表达式 3-6 顺序结构和选择结构 3-7 循环语句 3-8 跳转语句 3-9 MyEclipse工具介绍 3-10 java基础知识章节练习 4-1 一维数组 4-2 数组应用 4-3 多维数组 4-4 排序算法 4-5 增强for循环 4-6 数组和排序算法章节练习 5-0 抽象和封装 5-1 面向过程的设计思想 5-2 面向对象的设计思想 5-3 抽象 5-4 封装 5-5 属性 5-6 方法的定义 5-7 this关键字 5-8 javaBean 5-9 包 package 5-10 抽象和封装章节练习 6-0 继承和多态 6-1 继承 6-2 object类 6-3 多态 6-4 访问修饰符 6-5 static修饰符 6-6 final修饰符 6-7 abstract修饰符 6-8 接口 6-9 继承和多态 章节练习 7-1 面向对象的分析与设计简介 7-2 对象模型建立 7-3 类之间的关系 7-4 软件的可维护与复用设计原则 7-5 面向对象的设计与分析 章节练习 8-1 内部类与包装器 8-2 对象包装器 8-3 装箱和拆箱 8-4 练习题 9-1 常用类介绍 9-2 StringBuffer和String Builder类 9-3 Rintime类的使用 9-4 日期类简介 9-5 java程序国际化的实现 9-6 Random类和Math类 9-7 枚举 9-8 练习题 10-1 java异常处理 10-2 认识异常 10-3 使用try和catch捕获异常 10-4 使用throw和throws引发异常 10-5 finally关键字 10-6 getMessage和printStackTrace方法 10-7 异常分类 10-8 自定义异常类 10-9 练习题 11-1 Java集合框架和泛型机制 11-2 Collection接口 11-3 Set接口实现类 11-4 List接口实现类 11-5 Map接口 11-6 Collections类 11-7 泛型概述 11-8 练习题 12-1 多线程 12-2 线程的生命周期 12-3 线程的调度和优先级 12-4 线程的同步 12-5 集合类的同步问题 12-6 用Timer类调度任务 12-7 练习题 13-1 Java IO 13-2 Java IO原理 13-3 流类的结构 13-4 文件流 13-5 缓冲流 13-6 转换流 13-7 数据流 13-8 打印流 13-9 对象流 13-10 随机存取文件流 13-11 zip文件流 13-12 练习题 14-1 图形用户界面设计 14-2 事件处理机制 14-3 AWT常用组件 14-4 swing简介 14-5 可视化开发swing组件 14-6 声音的播放和处理 14-7 2D图形的绘制 14-8 练习题 15-1 反射 15-2 使用Java反射机制 15-3 反射与动态代理 15-4 练习题 16-1 Java标注 16-2 JDK内置的基本标注类型 16-3 自定义标注类型 16-4 对标注进行标注 16-5 利用反射获取标注信息 16-6 练习题 17-1 顶目实战1-单机版五子棋游戏 17-2 总体设计 17-3 代码实现 17-4 程序的运行与发布 17-5 手动生成可执行JAR文件 17-6 练习题 18-1 Java数据库编程 18-2 JDBC类和接口 18-3 JDBC操作SQL 18-4 JDBC基本示例 18-5 JDBC应用示例 18-6 练习题 19-1 。。。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值