RealTime-Rendering 第五章 自我学习和翻译

第五章 着色基础

当你渲染三维物体的图像时,模型不仅需要适当的几何形状,也应具有所需的视觉外表。根据应用程序的不同,其范围可以从真实感(外观与真实物体的照片几乎相同)到出于创造性原因选择的各种类型的风格化外观。 有关两者的示例,如图5.1。

本章将讨论同样适用于真实感和风格化渲染的那些着色方面。 第15章专门致力于风格化渲染,而本书的重要部分(第9章至第14章)则着重介绍通常用于照片级真实感渲染的基于物理的方法。
在这里插入图片描述

5.1 着色模型

确定渲染对象外观的第一步是选择一个着色模型,以描述对象的颜色在表面方向,视图方向以及光照等因素下如何变化。

例如,我们将使用Gooch着色模型的变体。这是第15章讨论的非真实感渲染的一种。Gooch着色模型旨在提高技术插图中细节的可读性。

Gooch着色背后的基本思想是比较表面法线与光源的位置。如果法线指向灯光,则使用较温暖的色调为表面着色;如果指向偏移灯光,则使用较冷的音调。在这个范围内的角度的颜色则根据这些色调进行插值,这取决于用户提供的表面颜色。在此示例中,我们向模型添加了样式化的“突出显示”效果,使表面具有光泽外观。图5.2显示了实际的着色模型。

着色模型通常具有用于控制外观变化的属性。设置这些属性的值是确定对象外观的下一步。我们的示例模型只有一种属性,即表面颜色,如图5.2的底部图像所示。
在这里插入图片描述和大多数着色模型一样,此示例受相对于视图和照明方向的表面方向的影响。 出于着色目的,这些方向通常表示为归一化(单位长度)矢量,如图5.3所示。

现在,我们已经定义了着色模型的所有输入,接下来可以看一下模型本身的数学定义:
在这里插入图片描述在这里插入图片描述在这个等式中,我们可以用下面的计算
在这里插入图片描述这个定义中的几个数学表达式也会在其他的着色模型中找到。着色操作中通常会使用夹逼操作,将值限制在0到1范围内。这里我们使用 x ∓ x^\mp x符号表示法用于高光混合因子s的计算中使用的0和1之间的夹逼。 点积运算符出现3次,每次出现在两个单位长度的矢量之间; 这是一种极为常见的模式。 两个向量的点积是两个向量的长度和它们之间夹角的余弦的乘积。 因此,两个单位长度向量的点积就是夹角的余弦值,它是两个向量彼此对齐程度的有用度量。 在着色模型中,由余弦组成的简单函数通常是最准确的数学表达式,可以说明两个方向之间的关系,例如光方向和表面法线。

另一种常见的着色操作是基于0到1之间的标量值在两种颜色之间线性插值。该操作采用 t c a + ( 1 − t ) c b tc_a +(1- t)c_b tca+(1t)cb的形式,随着t的值在1和0之间移动,它会在 c a 和 c b c_a和c_b cacb之间分别进行插值。此模式在此着色模型中出现两次,第一次在 c w a r m 和 c c o o l c_{warm}和c_{cool} cwarmccool之间进行插值,第二次在先前插值的结果和 c h i g h l i g h t c_{highlight} chighlight之间进行插值。线性插值在着色器中出现的频率很高,以至于在我们已经看到的每种着色语言中,它都是一个内置函数,称为lerp或mix。

线“ r = 2 ( n ⋅ l ) n − l r = 2(n·l)n-l r=2(nl)nl”计算反射光矢量,基于n反射l。尽管不像前两个操作那么普遍,但是对于大多数着色语言来说,也具有内置的反射函数。

通过将这些操作以不同的方式与各种数学表达式和着色参数组合在一起,可以为多种风格化和逼真的外观定义着色模型。

5.2 光源

在我们的着色模型实例中光照的影响是很简单的,只提供了着色的主要方向。当然现实世界中种光照是很复杂的。每个光源有自己的尺寸、形状、颜色和强度;间接光源会带来更多变化。当我们在第九章看到,基于物理的真实感渲染会将这些因素全部考虑进去。

相反,程序化渲染模型可能会将光源用于不同方式,取决于应用和视觉风格的需要,一些高度程序化的模型可能根本没有照明的概念,或者(例如我们的Gooch渲染示例)可能仅使用它来提供一些简单的方向性。

复杂光照的下一步是使着色模型以二进制的方式对光照存在或不存在做出反应。模型的表面着色在有光照时呈现一种外观,在不受光照影响时呈现另一种外观。这暗示了区分这两种情况的一些标准:与光源的距离,阴影(将在第7章中讨论),表面是否背对光源(即表面法线n与光矢量之间的角度大于90°),或这些因素的某种组合。

从光的二元存在或不存在到光强度的连续尺度,这都是一小步。可以用不存在和完全存在之间的插补表示,暗示了一个强度的边界范围,例如0到1,或者表示为以某种其他方式影响阴影的无界量。 后者的一个常见选择是将着色模型分解为亮和不亮部分,而光强线性缩放亮的部分:
在这里插入图片描述
这可以简单扩展为RGB光照颜色:
在这里插入图片描述
并扩展为多种光源:
在这里插入图片描述
不亮的部分 f u n l i t ( n , v ) funlit(n,v) funlit(n,v)对应于着色模型以二元形式对待光照中的"不受光照影响的表面"。根据应用和视觉风格的需要可以有多种形式。例如 f u n l i t ( ) = ( 0 , 0 , 0 ) funlit( )=(0,0,0) funlit()=(000)会使得不受光照影响的表面呈现纯黑色,另外,未照明的部分可以为未照明的对象表达某种形式的外观,类似于Gooch模型的冷色,用于远离光线的表面。 通常,着色模型中一些光照的表达并不是直接来自于明确放置的光源,例如天空或者来自于周围物体的光照。

我们前面提到如果表面上某点的表面法线和光矢量大于90°,那么该点不会被光源影响,其影响实际来源于表面的下面。这可以认为是光相对于表面的方向和对着色的影响间的更一般关系的特例。尽管基于物理的,但这种关系可以从简单的几何原理得出,并且对于许多类型的基于非物理的,程式化的阴影模型也很有用。
在这里插入图片描述
表面的光照影响可以可视化为一组射线,射线的密集程度对应光照射表面的强度,如图5.4,该图显示了照明表面的横截面。沿着横截面入射到表面的光线间的间隔与法线n和入射光l的余弦成反比。因此,入射到表面的光线的总密度与l和n之间的角度的余弦成正比,如之前所看到的,它等于这两个单位长度矢量之间的点积。 在这里看到了为什么定义与光的传播方向相反的光矢量l会很方便; 否则,在执行点积运算之前,我们必须将其取反。

更精确地说,当点积结果为正数时射线密度(光照对着色的贡献程度)和其成正比,负数对应了光线来自于背光面,没有任何效果。因此,在将光照着色乘以照明点乘积之前, 首先需要将负的点积结果取为0,
在这里插入图片描述
支持多个光源的着色模型通常使用公式5.5(更通用)或公式5.6(基于物理的模型所需)中的一种结构。对于风格化模型也有用,因此它有助于确保照明的总体一致性,尤其是远离光照或处于阴影中的表面。然而,一些模型不适用于这种结构,此类模型将使用公式5.5中的结构。

函数flit()的最简单选择是使其具有恒定的颜色,
在这里插入图片描述在这里插入图片描述
这个模型中光亮的部分对应兰伯特着色模型,之后Johann Heinrich Lambert于1760年出版!该模型用于理想的漫反射表面,即完全光泽的表面。在这里对兰伯特模型做了一个简单的介绍,在第九章会更详细介绍,兰伯特模型可以用于简单着色,是许多着色模型的关键部分。

我们可以从等式5.3-5.6看出光照通过两个参数影响了着色模型,入射光的方向向量和光照颜色。光源有多种不同的类型,它们的主要区别在于这两个参数在场景中的变化方式。

我们接下来讨论光源的几种常见类型,他们具有同一个特点:在给定的表面位置,每一个光源仅从一个方向照亮该表面,换句话说,从着色表面位置看,光源是一个无限小的点。 真实世界的光照并不完全如此,但大多数光源相对于它们与被照明表面的距离较小,因此这是一个合理的近似值。 在7.1.2和10.1节中,我们将讨论从多个方向照亮表面位置的光源,即“区域灯”。

5.2.1 定向光

定向光是光源中最简单的模型,入射光方向和光照颜色都是常量,但是阴影可能会使得光照颜色衰减。定向光没有方向,当然,实际的光源在空间中是有特定的方向的。定向光是抽象的,当到光的距离相对于场景大小较大时,定向光会很好地工作。例如,20英尺远的泛光灯可以照亮一个小的桌面西洋镜,可以表示为定向光。 另一个例子是几乎所有被太阳照亮的场景,除非所涉及的场景是诸如太阳系内行星之类的东西。

定向光的概念可以稍微扩展,以允许在光方向l保持恒定的同时改变clight的值。 通常出于表现或创意原因,这样做通常是将灯光效果绑定到场景的特定部分。 例如,可以定义一个区域,其中包含两个嵌套的(一个在另一个内)盒形体积,其中外盒外clight等于(0,0,0)(纯黑色),内部框中等于里面的某个常数,并在两个框之间的区域中的那些极值之间平滑插值。

5.2.2 精确光

与定向光不同,精确光是具有位置的光照。 与现实世界的光源不同,此类光源也没有尺寸,形状或大小。 对于拉丁语的“点”,我们使用术语“点”来表示“点”,该类包括源自单个局部位置的所有照明源。 我们使用“点光”一词来表示一种特定类型的发射源,它在所有方向上均等地发射光。 因此,点光源和聚光灯是精确光的两种不同形式。 光的方向向量I随当前着色表面点p0相对于点光源的位置plight的位置而变化:
在这里插入图片描述
这个等式是向量归一化的一个例子:将矢量除以长度可以获得相同方向的单位向量,这是常见的着色运算,和之前章节中的着色运算相同,是大多数着色语言的内置函数。但是,有时需要此操作的中间结果,这需要使用更多基本操作以多个步骤显式执行归一化。 将其应用于精确光方向计算可以得到以下结果:
在这里插入图片描述
由于两个向量的点积等于两个向量的长度与它们之间夹角的余弦的乘积,并且0º的余弦为1.0,因此向量与自身的点积就是其长度的平方。 因此,要找到任何矢量的长度,我们只需将其自身加点并取结果的平方根即可。

我们需要的中间值是r,即点光源和当前着色点之间的距离。 除了将其用于归一化光矢量外,还需要r的值来计算作为距离函数的浅色clight的衰减(变暗)。 这将在下一节中进一步讨论。

点光源


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值