Real-Time Rendering 4th 译文《五 着色基础(上)》

渲染三维对象的图像时,模型不仅应具有适当的几何形状,而且还应具有所需的视觉外观。根据应用程序的不同,其范围可以从照片写实(外观与真实对象的照片几乎相同)到出于创造性原因选择的各种类型的风格化外观。有关两者的示例,请参见图 5.1。
本章将讨论同样适用于真实感和风格化渲染方面的着色。第15章专门致力于风格化渲染,而本书的重要部分(第9章至第14章)则着重于通常用于照片级真实感渲染的基于物理的方法。

5.1 着色模型 Shading Models

决定渲染物体的外观的第一步是选择一个渲染模型,用来描述物体的颜色应该怎样变化,相关的因素有表面的方向(朝向),视角方向,以及光照等等。

举个例子,我们将使用 Gooch 着色模型 [561]的变体。这是第15章中讨论的非真实感渲染的一种形式。Gooch 着色模型旨在让说的技术细节的更加容易理解。

Gooch 着色背后的基本思想是将表面法线与光源的位置进行比较。如果法线指向灯光,则使用较温暖的色调为表面着色; 如果法线的指向不是指向光源,则使用较冷的色调。介于两者之间的角度在这些色调之间进行插值,这取决于用户提供的表面颜色。在此示例中,我们向模型添加了风格化的“突出显示”效果,以使表面具有光泽外观。图 5.2 显示了实际的着色模型。

着色模型通常具有用于控制外观变化的属性。设置这些属性的值是确定对象外观的下一步。我们的示例模型只有一种属性,即表面颜色,如图 5.2 的底部图像所示。

图 5.1。顶部图像来自使用虚幻引擎渲染的真实风景的场景。底部图片来自 Campo Santo 的游戏 Firewatch,该游戏采用说明性艺术风格设计。(上图由 GöokhanKaradayi 提供,下图由 Campo Santo 提供。)

 

图5.2。风格化的着色模型,结合了Gooch着色和高光效果。顶部图像显示了具有中性表面颜色的复杂对象。下图显示了具有各种不同表面颜色的球体。 (来自计算机图形学档案 [1172] 的中国龙模型,来自斯坦福 3D 扫描存储库的原始模型。)

 现在,我们已经定义了着色模型的所有输入,接下来可以看一下模型本身的数学定义:

像大多数着色模型一样,此示例受相对于视图和光照方向的表面方向的影响。出于着色目的,这些方向通常表示为归一化(单位长度)向量,如图 5.3 所示。

图5.3。单位长度向量输入到示例着色模型(和其他大多数着色模型):表面法线 n,视图向量 v 和光照方向 l

【译者提示:C shaded表示最终着色值,s表示比例因子,C highlight表示高光的强度 C warm表示暖色调强度 C cool表示冷色调强度】
在此公式中,我们使用了以下的中间计算:


定义中的几个数学表达式也经常在其他着色模型中找到。着色操作中通常会进行 Clamping 【限定范围】操作,通常 Clamping 到 0 或 Clamping 在 0 到 1 之间。在这里,我们将使用在 1.2 节中介绍的  标记,将其用于高光混合因子 s  的计算中 0 和 1 之间的 限制 之中。点积运算符出现 3 次,每次出现在两个单位长度的向量之间; 这是一个非常普遍的模式。两个向量的点积是它们的长度与它们之间夹角的余弦的乘积。因此,两个单位长度向量的点积就是余弦值,它是两个向量彼此对齐程度的度量。由余弦组成的简单函数通常是最令人愉悦和最准确的数学表达式,用于说明着色模型中两个方向(例如,光方向和表面法线)之间的关系。

另一种常见的着色操作是基于 0 到 1 之间的标量值在两种颜色之间线性插值。该操作采用 的形式,随着 t 的值在 1 和 0 之间移动,它会在  和  之间进行插值。分别,此图案在此着色模型中出现了两次,第一次在  和之间进行插值,第二次在先前的插值结果与 之间进行插值。线性插值在着色器中出现的频率很高,以至于在我们已经看到的每种着色语言中,它都是一个内置函数,称为 lerp 或 mix  。

使用来计算反射光向量,将 l 以n为法线求反射。尽管不像前两个操作那样普遍,但是对于大多数着色语言来说,它有内置的反射函数 。

【译者提示,求反射向量可以单独去搜一下推导公式,这里是直接给出的】

通过将这些操作以不同的方式与各种数学表达式和着色参数组合在一起,可以为多种风格化和写实的外观定义着色模型。单位长度向量输入到示例着色模型(和其他大多数着色模型):表面法线 n,视图向量 v 和光照方向 l。

5.2 光源

光照对我们的示例着色模型的影响非常简单。它提供了着色的主要方向。当然,现实世界中的光照可能非常复杂。可以有多个光源,每个光源都有自己的大小,形状,颜色和强度。间接光照会带来更多变化。正如我们将在第9章中看到的那样,基于物理的真实感着色模型需要考虑所有这些参数。
 

相反,根据应用程序和视觉样式的需要,风格化的着色模型可以以多种不同方式使用光照。一些高度风格化的模型可能根本没有光照的概念,或者(例如我们的 Gooch 着色示例)可能仅使用它来提供一些简单的方向性。

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

从非暗即亮的光照到能逐渐变化强度的光照,仅需要一小步。这可以表示为光的不存在和完全存在之间的简单插值,即表示强度的有界范围,它可能为 0 到 1 ,或者可能为以某种其他方式影响着色的无边界数值。后者的常见选择是将着色模型拆解为亮部和暗部,而光照强度  线性地改变亮部:

 这个可以简单地扩展为 RGB 光照颜色 \textbf{c}_{\textrm{light}}

\textbf{c}_{\textrm{shaded}}=f_{\textrm{unlit}}(\textbf{n},\textbf{v})+c_{\textrm{light}}f_{\textrm{lit}}(\textbf{l},\textbf{n},\textbf{v}),\;\;\;\;\;\;\;\;\;\;(5.4)

以及多光源,

\textbf{c}_{\textrm{shaded}}=f_{\textrm{unlit}}(\textbf{n},\textbf{v})+\sum ^{n}_{i=1}\textbf{c}_{\textrm{light}_{i}}f_{\textrm{lit}}(\textbf{l}_{i},\textbf{n},\textbf{v}).\;\;\;\;\;\;\;\;\;\;(5.5)

 无光照部分 对应将光视为二进制的着色模型的“不受光影响时的外观”。它可以具有各种形式,具体取决于所需的视觉效果和应用程序的需求。例如, f_{\textrm{unlit}}()=(0,0,0)将使不受光源影响的任何表面变为纯黑色。另外,无光照的部分可以为无光照的物体表达某种形式的视觉外观,类似于 Gooch 模型的背向光线的表面的冷色。通常,着色模型的这一部分表示某种形式的光照,这些光照并非直接来自明确放置的光源,例如来自天空的光或来自周围物体反射的光。这些其他形式的光照将在第 10 章和第 11 章中讨论。

前面我们提到,如果光照方向  与表面法线    的距离大于 90°,则光源不会影响表面点,实际上是来自表面的下面。这可以认为是光相对于表面的方向与其对着色的影响之间具有更一般关系的特例。尽管是基于物理的,但这种关系可以从简单的几何原理得出,并且对于许多类型的非基于物理的,风格化的着色模型也很有用。

可以将光在表面上的效果可视化为一组射线,其中射线密度击中表面对应用于表面着色的光照强度。参见图 5.4,该图显示了光照表面的横截面。沿该截面入射到表面的光线之间的间距与   和  之间的角度的余弦成反比。因此,入射到表面的光线的总密度与 l  和 n 之间的角度的余弦成正比,正如我们前面所看到的,它等于这两个单位长度向量之间的点积。在这里,我们看到了为什么定义与光的传播方向相反的光照向量 l  会很方便; 否则我们将不得不在执行点积运算之前将其取反。

 更准确地说,当光线密度为正时,其光线密度(以及光线对着色的贡献)与点积成正比。负值对应于从表面后面发出的光线,无效。因此,在将灯光的着色乘以照明点积之前,我们需要先 Clamp 点积为 0。使用第 1.2 节中介绍的 x^{+} 表示,即将负值 Clamp 为 0,我们会得到 

 支持多个光源的着色模型通常将使用公式 5.5(更通用)或公式 5.6(基于物理的模型所需)中的一种结构。这对于风格化模型也可能是有利的,因为它有助于确保照明的总体一致性,尤其是对于背离灯光或着色表面。但是,某些模型不适用于该结构。此类模型将使用公式 5.5 中的结构。

 对于函数 f_{\textrm{lit}}() 来说,最简单的选择是使其颜色恒定,

 

于是推导出以下模型

模型的上光部分对应于1760年出版的约翰·海因里希·兰伯特[967]之后的兰伯特着色模型, 该模型在理想的漫反射表面(即完全无光泽的表面)的背景下工作。在这里,我们对 Lambert 模型进行了一些简化的解释,第 9 章将对此进行更严格的介绍。Lambertian 模型可单独用于简单着色,它是许多着色模型的关键组成部分。

从公式 5.3 - 5.6 可以看出,光源通过两个参数与着色模型交互:指向光的向量 \textbf{l} 和浅色的 \textbf{c}_{\textrm{light}}。有多种不同类型的光源,它们的主要区别在于这两个参数在场景中的变化方式。

 接下来,我们将讨论几种流行类型的光源,它们有一个共同点:在给定的表面位置,每个光源仅从一个方向  照射表面。换句话说,从着色表面位置看,光源是一个无限小的点。对于现实世界的光源,这并非严格如此,但是大多数光源相对于它们与被照明表面的距离较小,因此这是一个合理的近似值。在 7.1.2 和 10.1 节中,我们将讨论从多个方向照亮表面位置的光源,即“区域光”(area lights)。

引用:

[967] Lambert, J. H., Photometria, 1760. English translation by D. L. DiLaura, Illuminating Engineering Society of North America, 2001. Cited on p. 109, 389, 390, 469
 

5.2.1 方向光 Directional Lights

 方向光是光源的最简单模型。 和光在整个场景中都是恒定的,除了光可能会因阴影而衰减。方向光无位置。当然,实际的光源确实在空间中具有特定的位置。方向光是抽象的,当到光源的距离相对于场景大小较大时,方向光会很好地工作。例如,20 英尺远的泛光灯可以照亮一个小的桌面西洋镜,这种情况就可以表示为方向光。另一个例子是几乎所有被太阳照亮的场景都可以用方向光,除非所涉及的场景是诸如太阳系内行星之类的东西。

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

5.2.2 点光

 点光是具有实际位置的光,这是与方向光不同的。但这与现实世界的光源也不同,此类光源也没有尺寸,形状或大小。对于拉丁语的“点”,我们使用术语“punctual”来表示“点”,该类包括源自单个局部位置的所有照明源。我们使用“点光”一词来表示一种特定类型的发射器,它在所有方向上均等地发射光。因此,点光和聚光灯是精确光的两种不同形式。光线方向向量  随当前着色表面点   相对于点光源的位置   的位置而变化: 

 

此公式是向量归一化的一个示例:将向量除以其长度即可产生指向相同方向的单位长度向量。这是另一种常见的着色操作,就像我们在上一节中看到的着色操作一样,它是大多数着色语言中的内置函数。但是,有时需要此操作的中间结果,这需要使用更多基本操作以多个步骤显式执行标准化。将其应用于精确光方向计算可以得到以下结果:

 

 点光/全向光 

在所有方向上均匀发光的点状光被称为点光或全向光。对于点光源,Clight随距离 r 的变化而变化,唯一的变化源是上述距离衰减。图 5.5 使用类似于图 5.4 中余弦因数的几何推理说明了为什么会变暗。在给定的表面上,来自点光源的光线之间的间距与从表面到光线的距离成比例。与图 5.4 中的余弦因子不同,此间距的增加沿表面的两个维度发生,因此射线密度(这里颜色为 \textbf{c}_{\textrm{light}})与平方反比距离 1/r^{2} 成比例。这使我们能够使用单个光照属性 \textbf{c}_{\textrm{light0}} 来指定 \textbf{c}_{\textrm{light}} 的空间变化,该属性定义为在固定参考距离 r0 处的 \textbf{c}_{\textrm{light}} 值:

 

 公式 5.11 通常被称为平方反比光衰减。尽管从技术上讲,对于点光源,距离衰减是正确的,但仍有一些问题使此公式不适用于实际的着色。

第一个问题发生在相对较小的距离处。当 r 的值趋于0时,clight的值将无限制地增加。当 r 达到 0 时,我们将得到除以零的奇点(singularity)。为了解决这个问题,一种常见的修改是在分母 [861]上增加一个小值 \epsilon

 【译者提示:这是改进】

\epsilon的确切值取决于具体应用。例如,虚幻引擎用  = 1 cm [861]。在CryEngine [1591] 和 Frostbite [960]游戏引擎中使用的另一种方案,是将 r 固定为最小值 

与先前方法中使用的任意值 \epsilon 有些不同, 的值具有物理解释:发射光的物理对象的半径。r的值小于\textbf{c}_{\textrm{light}} 值对应于穿透物理光源内部的着色表面,而这是不可能的。

 图 5.5。来自点光源的光线之间的间距与距离 r 成正比增加。由于间距的增加是二维的,因此光线的密度(以及光强度)成比例地降低到  1/r^{2}

    相反,平方的反比衰减的第二个问题发生在相对较大的距离处。问题不在于视觉效果,而在于性能。尽管光强度会随着距离的增加而降低,但是它永远不会变为 0。为了有效渲染,希望光在某个有限距离处达到 0 强度(第 20 章)。可以通过多种不同的方式修改平方反比公式来实现这一目的。理想情况下,修改应引入尽可能少的更改。为了避免在光线影响的边界处出现明显的截止,还建议修改函数的导数让它的值在相同距离处达到 0。

一种解决方案是使用乘以平方的反比的具有所需属性的开窗函数。虚幻引擎 [861] 和 Frostbite [960] 引擎都使用了这样一种功能 [860]

f_{\textrm{win}}(r)=\left ( 1-\left ( \frac{r}{r_{\textrm{max}}} \right )^{4}\right )^{+2}.\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;(5.14)

 +2 表示在平方之前将值为负,则设置为 0。图 5.6 显示了示例的平方反比(平方做分母)曲线,公式 5.14 中的窗函数以及两者相乘的结果。

图 5.6。该图显示了平方反比的曲线(使用 \epsilon 方法以发散,\epsilon 值为1),公式 5.14 中描述的窗函数( r_{\textrm{max}} 设置为 3 )和窗曲线。(注:在信号处理中,窗函数(英语:window function)是一种除在给定区间之外取值均为 0 的实函数。)

应用的需求将影响所用方法的选择。例如,当以相对较低的空间频率(例如,在光照贴图或每个顶点中)采样距离衰减函数时,在r_{\textrm{max}} 处使导数等于 0 尤为重要。CryEngine 不使用光照贴图或顶点照明,因此它使用了更简单的调整,切换为 0.8r_{\textrm{max}} 和 r_{\textrm{max}} 之间的线性衰减 [1591]

对于某些应用,匹配平方反比曲线不是优先事项,因此完全使用其他功能。这有效地将公式 5.11 - 5.14 概括为以下内容:

其中  是关于距离的某些函数。这种函数称为距离衰减函数(distance falloff functions)。在某些情况下,非反平方衰减函数(non-inverse-square falloff)的使用受性能的约束。例如,游戏《正当防卫2(Just Cause 2)》所需的灯光计算成本非常低廉。因此便规定了一个易于计算的衰减函数,同时该函数还足够平滑,可以避免逐顶点照明瑕疵 [1379]:

在其他情况下,衰减功能的选择可能由创造性的考虑决定。例如,用于现实游戏和程式化游戏的虚幻引擎具有两种用于光衰减的模式:如公式 5.12 中所述的平方反比模式和可以调整以创建各种衰减曲线的指数衰减模式。[1802]。游戏 Tomb Raider(2013)的开发人员使用样条编辑工具来编写衰减曲线 [953],从而可以更好地控制曲线形状。
 

聚光灯 Spotlights

与点光源不同,几乎所有现实世界光源的光照都随方向和距离而变化。这种变化可以表示为方向衰减函数 f_{\textrm{dir}}(\textbf{l}),该函数与距离衰减函数结合以定义光照强度的整体空间变化:

 

距离函数 的不同选择可以产生各种照明效果。一种重要的效果是聚光灯,它可以将光投射到圆锥区域中。聚光灯的方向衰减函数具有围绕聚光灯方向向量  S 的旋转对称性,因此可以表示为 S 与相对于表面的反向光向量 -1 之间的角度  的函数。这里需要将光向量反转,因为我们在表面上将  l 定义为指向光,而在这里我们需要指向远离光方向的向量。 

大多数聚光灯功能都使用由  的余弦组成的表达式,这是着色中角度的最常见的形式(如我们先前所见)。聚光灯通常具有本影角θu,该本影角对光进行限制,以使所有  的 。该角度可以与前面看到的最大衰减距离  类似的方式用于剔除。聚光灯通常具有半影角,该半影角定义了一个内锥,在该内锥处,光处于其全部强度。见图 5.7。

图 5.7。是从灯的定义方向 \textbf{s} 到向量 -1 的角度,即到表面的方向;  \theta_{p} 表示半影;  \theta_{u} 表示为光定义的本影角

 聚光灯使用了各种方向衰减功能,但它们往往大致相似。例如,函数 f_{\textrm{dir}_{F}}(\textbf{l}) 用于 Frostbite 游戏引擎 [960],函数 f_{\textrm{dir}_{T}}(\textbf{l}) 用于 three.js 浏览器图形库 [218]

回想一下, 是我们在 1.2 节中介绍的将   Clamp 在 0 和 1 之间的符号。平滑步长函数(smoothstep function)是三次多项式(cubic polynomial),通常用于着色中的平滑插值。它是大多数着色语言的内置函数。

图5.8显示了到目前为止我们讨论过的某些光源类型。

图5.8。某些类型的灯。从左到右:1 定向 2 无衰减的点光源 3 平滑过渡的聚光灯。请注意,由于光线和表面之间的角度变化,点光会朝边缘变暗。 

其他精确光

精确光的照度值  可以通过许多其他方式变化。

 函数不限于上述简单的聚光灯衰减函数; 它可以代表任何类型的方向变化,包括从实际光源测量的复杂列表模式。照明工程协会(IES)已为此类测量定义了标准文件格式。IES 配置文件可从许多照明制造商处获得,并已用于游戏 Killzone:Shadow Fall [379,380],以及Unreal [861]和Frostbite [960]游戏引擎中。Lagarde 很好地总结了 [961]与解析和使用此文件格式有关的问题。

游戏《古墓丽影》(Tomb Raider,2013年)[953]具有一种精确光,可对沿世界坐标 x,y 和 z 轴的距离应用独立的衰减功能。在《古墓丽影》中,参数曲线还可以应用于随时间变化的光强度,例如制作一个闪烁的火炬。

在第 6.9 节中,我们将讨论如何通过使用纹理来改变光的强度和颜色。

引用:

[861] Karis, Brian, “Real Shading in Unreal Engine 4,” SIGGRAPH Physically Based Shading in Theory and Practice course, July 2013. Cited on p. 111, 113, 116, 325, 336, 340, 342, 352, 355, 383, 385, 388, 421, 423

[1591] Schulz, Nicolas, CRYENGINE Manual, Crytek GmbH, 2016. Cited on p. 111, 113, 631

[960] Lagarde, S´ebastian, and Charles de Rousiers, “Moving Frostbite to Physically Based Rendering,” SIGGRAPH Physically Based Shading in Theory and Practice course, Aug. 2014. Cited on p. 111, 113, 115, 116, 312, 325, 336, 340, 341, 354, 371, 422, 426, 435, 503, 890

[861] Karis, Brian, “Real Shading in Unreal Engine 4,” SIGGRAPH Physically Based Shading in Theory and Practice course, July 2013. Cited on p. 111, 113, 116, 325, 336, 340, 342, 352, 355, 383, 385, 388, 421, 423

[860] Karis, Brian, “Tiled Light Culling,” Graphic Rants blog, Apr. 9, 2012. Cited on p. 113, 882

[1379] Persson, Emil, “Making It Large, Beautiful, Fast, and Consistent: Lessons Learned Developing Just Cause 2,” in Wolfgang Engel, ed., GPU Pro, A K Peters, Ltd., pp. 571–596, 2010. Cited on p. 114, 556, 558, 715, 882

[1802] Unreal Engine 4 Documentation, Epic Games, 2017. Cited on p. 114, 126, 128, 129, 262, 287, 364, 611, 644, 920, 923, 932, 934, 939

[953] Lacroix, Jason, “Casting a New Light on a Familiar Face: Light-Based Rendering in Tomb Raider,” Game Developers Conference, Mar. 2013. Cited on p. 114, 116

[218] Cabello, Ricardo, et al., Three.js source code, Release r89, Dec. 2017. Cited on p. 41, 50, 115, 189, 201, 407, 485, 552, 628

[379] Drobot, Michal, “Lighting of Killzone: Shadow Fall,” Digital Dragons conference, Apr. 2013. Cited on p. 116

[380] Drobot, Michal, “Physically Based Area Lights,” in Wolfgang Engel, ed., GPU Pro5 , CRC Press, pp. 67–100, 2014. Cited on p. 116, 388

[861] Karis, Brian, “Real Shading in Unreal Engine 4,” SIGGRAPH Physically Based Shading in Theory and Practice course, July 2013. Cited on p. 111, 113, 116, 325, 336, 340, 342, 352, 355, 383, 385, 388, 421, 423

[961] Lagarde, S´ebastian, “IES Light Format: Specification and Reader,” S´ebastian Lagarde blog, Nov. 5, 2014. Cited on p. 116, 435

[953] Lacroix, Jason, “Casting a New Light on a Familiar Face: Light-Based Rendering in Tomb Raider,” Game Developers Conference, Mar. 2013. Cited on p. 114, 116

5.2.3 其他光照类型
方向光和精确光的主要特征是如何计算光照方向 I 。可以通过使用其他方法来计算光的方向来定义不同类型的光。例如,除了前面提到的光源类型外,《古墓丽影》还使用了胶囊体光源(Capsule Lights)[953],这些光源不是点光源,而是线段。对于每个着色像素,将线段上最接近的点的方向用作光方向 I

只要着色器具有用于评估着色方程的    值,便可以使用任何方法来计算这些值。

到目前为止讨论的光的类型是抽象的。实际上,光源具有大小和形状,并且它们从多个方向照亮表面点。在渲染中,此类光源称为区域光源,并且它们在实时应用中的使用率在不断提高。区域光渲染技术分为两类:模拟由于部分遮挡区域光而导致的阴影边缘柔化的技术(第 7.1.2 节)和模拟区域光对表面着色影响的技术。(第 10.1 节)。第二类照明对于光滑的镜面表面最为明显,在这种表面上,可以通过反射清楚地看到其形状和大小。另外,方向光和精确光,尽管它们不再像过去那样普遍使用,但不太可能被废弃。目前已经开发出一种计算照明面积的近似值的技术,性能消耗较少,因此得到了广泛的应用。GPU 性能的增强允许我们使用比过去更复杂的技术。

引用:

[953] Lacroix, Jason, “Casting a New Light on a Familiar Face: Light-Based Rendering in Tomb Raider,” Game Developers Conference, Mar. 2013. Cited on p. 114, 116
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值