Real-Time Rendering——7.4 Shadow Maps阴影贴图

In 1978, Williams [1888] proposed that a common z-buffer-based renderer could be used to generate shadows quickly on arbitrary objects. The idea is to render the scene, using the z-buffer, from the position of the light source that is to cast shadows. Whatever the light “sees” is illuminated, the rest is in shadow. When this image is generated, only z-buffering is required. Lighting, texturing, and writing values into the color buffer can be turned off.

 

 1978年,Williams [1888]提出了一种基于z缓冲区的通用渲染器,可以用来在任意对象上快速生成阴影。这个想法是使用z缓冲区,从要投射阴影的光源的位置渲染场景。无论光“看到”什么被照亮,其余的都在阴影中。生成该图像时,只需要z缓冲。可以关闭光照、纹理和将值写入颜色缓冲区。

Each pixel in the z-buffer now contains the z-depth of the object closest to the light source. We call the entire contents of the z-buffer the shadow map, also sometimes known as the shadow depth map or shadow buffer. To use the shadow map, the scene is rendered a second time, but this time with respect to the viewer. As each drawing primitive is rendered, its location at each pixel is compared to the shadow map. If a rendered point is farther away from the light source than the corresponding value in the shadow map, that point is in shadow, otherwise it is not. This technique is implemented by using texture mapping. See Figure 7.10. Shadow mapping is a popular algorithm because it is relatively predictable. The cost of building the shadow map is roughly linear with the number of rendered primitives, and access time is constant. The shadow map can be generated once and reused each frame for scenes where the light and objects are not moving, such as for computer-aided design.

z缓冲区中的每个像素现在都包含离光源最近的对象的z深度。我们将z缓冲区的全部内容称为阴影贴图,有时也称为阴影深度贴图或阴影缓冲区。为了使用阴影贴图,场景被第二次渲染,但是这次是相对于观察者。当渲染每个绘图图元时,它在每个像素的位置与阴影贴图进行比较。如果一个渲染点比阴影贴图中的相应值离光源更远,则该点在阴影中,否则不在阴影中。这项技术是通过使用纹理映射实现的。参见图7.10。阴影贴图是一种流行的算法,因为它是相对可预测的。构建阴影贴图的成本大致与渲染图元的数量成线性关系,并且访问时间是恒定的。阴影贴图可以生成一次,并在光线和物体不移动的场景的每一帧中重复使用,例如用于计算机辅助设计。

Figure 7.10. Shadow mapping. On the top left, a shadow map is formed by storing the depths to the surfaces in view. On the top right, the eye is shown looking at two locations. The sphere is seen at point va, and this point is found to be located at texel a on the shadow map. The depth stored there is not (much) less than point va is from the light, so the point is illuminated. The rectangle hit at point vb is (much) farther away from the light than the depth stored at texel b, and so is in shadow. On the bottom left is the view of a scene from the light’s perspective, with white being farther away. On the bottom right is the scene rendered with this shadow map. 

图7.10。阴影贴图。在左上方,通过存储视图中表面的深度形成阴影贴图。在右上方,眼睛看着两个位置。在点va处看到球体,并且发现该点位于阴影图上的纹理元素a处。存储在那里的深度不(远)小于点va离灯光的距离,因此该点被照亮。在点vb上击中的矩形比存储在纹理元素b上的深度(更)远离灯光,因此在阴影中也是如此。左下方是灯光视角下的场景,白色更远。右下角是用这个阴影贴图渲染的场景。

When a single z-buffer is generated, the light can “look” in only a particular direction, like a camera. For a distant directional light such as the sun, the light’s view is set to encompass all objects casting shadows into the viewing volume that the eye sees. The light uses an orthographic projection, and its view needs to be made wide and high enough in x and y to view this set of objects. Local light sources need similar adjustments, as possible. If the local light is far enough away from the shadow-casting objects, a single view frustum may be sufficient to encompass all of these. Alternately, if the local light is a spotlight, it has a natural frustum associated with it, with everything outside its frustum considered not illuminated.

当生成单个z缓冲区时,光线只能“看”向特定的方向,就像照相机一样。对于遥远的平行光(如太阳),灯光的视图被设置为包含所有将阴影投射到肉眼可见的观察体积中的对象。灯光使用正交投影,其视图需要在x和y轴上足够宽和高,以便查看这组对象。本地光源需要尽可能类似的调整。如果局部光源离投射阴影的物体足够远,那么一个视锥就足以包含所有这些物体。或者,如果局部光源是聚光灯,它有一个与之关联的自然平截头体,平截头体之外的所有东西都被认为没有被照亮。

If the local light source is inside a scene and is surrounded by shadow-casters, a typical solution is to use a six-view cube, similar to cubic environment mapping [865]. These are called omnidirectional shadow maps. The main challenge for omnidirec- tional maps is avoiding artifacts along the seams where two separate maps meet. King and Newhall [895] analyze the problems in depth and provide solutions, and Gerasimov [525] provides some implementation details. Forsyth [484, 486] presents a general multi-frustum partitioning scheme for omnidirectional lights that also pro- vides more shadow map resolution where needed. Crytek [1590, 1678, 1679] sets the resolution of each of the six views for a point light based on the screen-space coverage of each view’s projected frustum, with all maps stored in a texture atlas.

如果本地光源在场景中,并且被阴影投射器包围,典型的解决方案是使用六视图立方体,类似于立方体环境映射[865]。这些被称为全向阴影贴图。全向地图面临的主要挑战是避免两个独立地图接合处的伪影。King和Newhall [895]深入分析了问题并提供了解决方案,格拉西莫夫[525]提供了一些实施细节。Forsyth [484,486]提出了一个通用的多平截头体分割方案,用于全向光,在需要的地方提供更多的阴影贴图分辨率。Crytek [1590,1678,1679]根据每个视图的投影截锥的屏幕空间覆盖范围,为点光源的六个视图中的每个视图设置分辨率,所有贴图都存储在纹理贴图集中。

Not all objects in the scene need to be rendered into the light’s view volume. First, only objects that can cast shadows need to be rendered. For example, if it is known that the ground can only receive shadows and not cast one, then it does not have to be rendered into the shadow map.

并非场景中的所有对象都需要渲染到灯光的视图体积中。首先,只需要渲染可以投射阴影的对象。例如,如果已知地面只能接收阴影而不能投射阴影,则不必将其渲染到阴影贴图中。

Shadow casters are by definition those inside the light’s view frustum. This frustum can be augmented or tightened in several ways, allowing us to safely disregard some shadow casters [896, 1812]. Think of the set of shadow receivers visible to the eye. This set of objects is within some maximum distance along the light’s view direction. Anything beyond this distance cannot cast a shadow on the visible receivers. Similarly, the set of visible receivers may well be smaller than the light’s original x and y view bounds. See Figure 7.11. Another example is that if the light source is inside the eye’s view frustum, no object outside this additional frustum can cast a shadow on a receiver. Rendering only relevant objects not only can save time rendering, but can also reduce the size required for the light’s frustum and so increase the effective resolution of the shadow map, thus improving quality. In addition, it helps if the light frustum’s near plane is as far away from the light as possible, and if the far plane is as close as possible. Doing so increases the effective precision of the z-buffer [1792] (Section 4.7.2).

根据定义,阴影投射者是那些在光锥内的人。这个平截头体可以用几种方法来增加或收紧,让我们可以安全地忽略一些阴影施法者。想象一组肉眼可见的阴影接收器。这组对象位于沿灯光观察方向的某个最大距离内。任何超过这个距离的东西都不能在可见的接收器上投下阴影。类似地,可见接收器的集合可能比光的原始x和y视图边界更小。参见图7.11。另一个例子是,如果光源在眼睛的视锥内,这个附加视锥之外的任何物体都不能在接收器上投射阴影。仅渲染相关对象不仅可以节省渲染时间,还可以减少灯光截锥所需的大小,从而增加阴影贴图的有效分辨率,从而提高质量。此外,如果灯光平截头体的近平面尽可能远离灯光,如果远平面尽可能近,也会有所帮助。这样做可以提高z缓冲器[1792]的有效精度(第4.7.2节)。

Figure 7.11. On the left, the light’s view encompasses the eye’s frustum. In the middle, the light’s far plane is pulled in to include only visible receivers, so culling the triangle as a caster; the near plane is also adjusted. On the right, the light’s frustum sides are made to bound the visible receivers, culling the green capsule. 

图7.11。在左边,光线的视野包含了眼睛的视锥。在中间,光的远平面被拉进来,只包括可见的接收器,所以剔除三角形作为一个脚轮;近平面也被调整。在右边,光的平截头体侧面被用来限制可见接收器,剔除绿色胶囊。

One disadvantage of shadow mapping is that the quality of the shadows depends on the resolution (in pixels) of the shadow map and on the numerical precision of the z-buffer. Since the shadow map is sampled during the depth comparison, the algorithm is susceptible to aliasing problems, especially close to points of contact between objects. A common problem is self-shadow aliasing, often called “surface acne” or “shadow acne,” in which a triangle is incorrectly considered to shadow itself.This problem has two sources. One is simply the numerical limits of precision of the processor. The other source is geometric, from the fact that the value of a point sample is being used to represent an area’s depth. That is, samples generated for the light are almost never at the same locations as the screen samples (e.g., pixels are often sampled at their centers). When the light’s stored depth value is compared to the viewed surface’s depth, the light’s value may be slightly lower than the surface’s,resulting in self-shadowing. The effects of such errors are shown in Figure 7.12.

阴影贴图的一个缺点是阴影的质量取决于阴影贴图的分辨率(以像素为单位)和z缓冲区的数值精度。由于阴影贴图是在深度比较期间采样的,因此该算法容易出现走样问题,尤其是在对象之间的接触点附近。一个常见的问题是自阴影走样,通常称为“表面痤疮”或“阴影痤疮”,其中三角形被错误地认为是阴影本身。这个问题有两个来源。一个是处理器精度的数值限制。另一个来源是几何数据,即点样本的值用于表示区域的深度。也就是说,为光生成的样本几乎从不在与屏幕样本相同的位置(例如,像素通常在其中心被采样)。当灯光的存储深度值与查看的表面深度进行比较时,灯光的值可能会略低于表面的值,从而导致自阴影。这种误差的影响如图7.12所示。

Figure 7.12. Shadow-mapping bias artifacts. On the left, the bias is too low, so self-shadowing occurs. On the right, a high bias causes the shoes to not cast contact shadows. The shadow-map resolution is also too low, giving the shadow a blocky appearance. (Images generated using a shadow demo by Christoph Peters.)

图7.12。阴影映射偏差伪像。在左侧,偏差太低,因此会出现自阴影。在右侧,高偏移导致鞋子不投射接触阴影。阴影贴图的分辨率也太低,给阴影一个块状的外观。(图片由Christoph Peters使用阴影演示生成。)

 One common method to help avoid (but not always eliminate) various shadow-map artifacts is to introduce a bias factor. When checking the distance found in the shadow map with the distance of the location being tested, a small bias is subtracted from the receiver’s distance. See Figure 7.13. This bias could be a constant value [1022], but doing so can fail when the receiver is not mostly facing the light. A more effective method is to use a bias that is proportional to the angle of the receiver to the light. The more the surface tilts away from the light, the greater the bias grows, to avoid the problem. This type of bias is called the slope scale bias. Both biases can be applied by using a command such as OpenGL’s glPolygonOffset) to shift each polygon away from the light. Note that if a surface directly faces the light, it is not biased backward at all by slope scale bias. For this reason, a constant bias is used along with slope scale bias to avoid possible precision errors. Slope scale bias is also often clamped at some maximum, since the tangent value can be extremely high when the surface is nearly edge-on when viewed from the light.

帮助避免(但不总是消除)各种阴影贴图伪像的一种常见方法是引入一个偏差因子。当用被测位置的距离检查阴影图中发现的距离时,从接收器的距离中减去一个小偏差。参见图7.13。这种偏置可以是恒定值[1022],但是当接收器不是主要面向光时,这样做可能会失败。更有效的方法是使用与接收器对光的角度成比例的偏置。为了避免这个问题,表面离光越远,偏差就越大。这种类型的偏差称为斜率偏差。这两种偏置都可以通过使用OpenGL的glPolygonOffset之类的命令来应用,以使每个多边形远离灯光。请注意,如果曲面直接面向灯光,则坡度比例偏移根本不会使其向后偏移。因此,恒定偏置与斜率标度偏置一起使用,以避免可能的精度误差。坡度比例偏差也经常被限制在某个最大值,因为当从灯光下观察时,当曲面接近侧边时,切线值可能会非常高。

Figure 7.13. Shadow bias. The surfaces are rendered into a shadow map for an overhead light, with the vertical lines representing shadow-map pixel centers. Occluder depths are recorded at the × locations. We want to know if the surface is lit at the three samples shown as dots. The closest shadow-map depth value for each is shown with the same color ×. On the left, if no bias is added, the blue and orange samples will be incorrectly determined to be in shadow, since they are farther from the light than their corresponding shadow-map depths. In the middle, a constant depth bias is subtracted from each sample, placing each closer to the light. The blue sample is still considered in shadow because it is not closer to the light than the shadow-map depth it is tested against. On the right, the shadow map is formed by moving each polygon away from the light proportional to its slope. All sample depths are now closer than their shadow-map depths, so all are lit. 

图7.13。阴影偏见。这些曲面被渲染到一个头顶灯光的阴影贴图中,垂直线代表阴影贴图的像素中心。封堵器深度记录在×位置。我们想知道表面是否在显示为点的三个样本处被照亮。每个最接近的阴影贴图深度值以相同的颜色显示。在左侧,如果没有添加偏移,蓝色和橙色样本将被错误地确定为在阴影中,因为它们比相应的阴影贴图深度离灯光更远。在中间,从每个样本中减去恒定的深度偏差,使每个样本更靠近光线。蓝色样本仍然被认为是在阴影中,因为它没有比它测试的阴影贴图深度更接近灯光。在右边,阴影贴图是通过将每个多边形按其斜率成比例地远离灯光而形成的。所有的采样深度现在都比它们的阴影贴图深度更接近,所以所有的都被照亮了。

Holbert [759, 760] introduced normal offset bias, which first shifts the receiver’s world-space location a bit along the surface’s normal direction, proportional to the sine of the angle between the light’s direction and the geometric normal. See Figure 7.24 on page 250. This changes not only the depth but also the x- and y-coordinates where the sample is tested on the shadow map. As the light’s angle becomes more shallow to the surface, this offset is increased, in hopes that the sample becomes far enough above the surface to avoid self-shadowing. This method can be visualized as moving the sample to a “virtual surface” above the receiver. This offset is a world- space distance, so Pettineo [1403] recommends scaling it by the depth range of the shadow map. Pesce [1391] suggests the idea of biasing along the camera view direction, which also works by adjusting the shadow-map coordinates. Other bias methods are discussed in Section 7.5, as the shadow method presented there needs to also test several neighboring samples.

Holbert [759,760]引入了法线偏移偏差,它首先沿着表面的法线方向移动接收器的世界空间位置一点,与光线方向和几何法线之间的角度的正弦成比例。参见第250页的图7.24。这不仅会改变深度,还会改变在阴影贴图上测试样本的x和y坐标。随着光线的角度变得越来越浅,该偏移也在增加,希望样本在表面上变得足够远,以避免自阴影。这种方法可以想象为将样品移动到接收器上方的“虚拟表面”。这个偏移量是一个世界空间的距离,所以Pettineo [1403]建议通过阴影贴图的深度范围来缩放它。Pesce [1391]提出了沿相机视角方向偏移的想法,这也通过调整阴影贴图坐标来实现。其他偏差方法将在第7.5节中讨论,因为这里介绍的阴影法也需要测试几个相邻的样本。

Figure 7.24. Additional shadow bias methods. For PCF, several samples are taken surrounding the original sample location, the center of the five dots. All these samples should be lit. In the left figure, a bias cone is formed and the samples are moved up to it. The cone’s steepness could be increased to pull the samples on the right close enough to be lit, at the risk of increasing light leaks from other samples elsewhere (not shown) that truly are shadowed. In the middle figure, all samples are adjusted to lie on the receiver’s plane. This works well for convex surfaces but can be counterproductive at concavities, as seen on the left side. In the right figure, normal offset bias moves the samples along the surface’s normal direction, proportional to the sine of the angle between the normal and the light. For the center sample, this can be thought of as moving to an imaginary surface above the original surface. This bias not only affects the depth but also changes the texture coordinates used to test the shadow map.

图7.24。其他阴影偏差方法。对于PCF,在原始样本位置(五个点的中心)周围取几个样本。所有这些样品都应该被点燃。在左图中,形成了一个偏置锥体,样品向上移动到它上面。可以增加锥体的陡度,以将右边的样本拉得足够近而被照亮,冒着增加从其他地方(未示出)真正被遮蔽的其他样本的光泄漏的风险。在中间的图中,所有样本被调整为位于接收器的平面上。这对于凸面非常有效,但是对于凹面可能会适得其反,如左侧所示。在右图中,法线偏移偏移沿着曲面的法线方向移动样本,与法线和灯光之间的角度的正弦值成比例。对于中心样本,这可以被认为是移动到原始曲面上方的虚拟曲面。这种偏差不仅会影响深度,还会改变用于测试阴影贴图的纹理坐标。

 Too much bias causes a problem called light leaks or Peter Panning, in which the object appears to float slightly above the underlying surface. This artifact occurs because the area beneath the object’s point of contact, e.g., the ground under a foot, is pushed too far forward and so does not receive a shadow.

太大的偏差会导致一个称为漏光或彼得潘的问题,即对象看起来稍微漂浮在底层表面上方。这种伪像的出现是因为物体接触点下方的区域,例如一只脚下面的地面,被向前推得太远,因此没有接收到阴影。

One way to avoid self-shadowing problems is to render only the backfaces to the shadow map. Called second-depth shadow mapping [1845], this scheme works well for many situations, especially for a rendering system where hand-tweaking a bias is not an option. The problem cases occur when objects are two-sided, thin, or in contact with one another. If an object is a model where both sides of the mesh are visible, e.g., a palm frond or sheet of paper, self-shadowing can occur because the backface and the frontface are in the same location. Similarly, if no biasing is performed, problems can occur near silhouette edges or thin objects, since in these areas backfaces are close to frontfaces. Adding a bias can help avoid surface acne, but the scheme is more susceptible to light leaking, as there is no separation between the receiver and the backfaces of the occluder at the point of contact. See Figure 7.14. Which scheme to choose can be situation dependent. For example, Sousa et al. [1679] found using frontfaces for sun shadows and backfaces for interior lights to work best for their applications.

避免自阴影问题的一种方法是只渲染阴影贴图的背面。这个方案被称为第二深度阴影映射[1845],适用于许多情况,特别是对于不能手动调整偏差的渲染系统。当物体是双面的、薄的或彼此接触时,问题情况就会发生。如果对象是网格两面都可见的模型,例如棕榈叶或一张纸,自阴影可能会发生,因为背面和正面位于相同的位置。类似地,如果不执行偏置,问题可能发生在轮廓边缘或薄物体附近,因为在这些区域中,背面靠近正面。添加偏置可以帮助避免表面痤疮,但是该方案更容易漏光,因为在接触点处接收器和遮光器的背面之间没有分离。参见图7.14。选择哪种方案取决于具体情况。例如,Sousa等人[1679]发现,使用正面作为日光阴影,使用背面作为室内灯光最适合他们的应用。

Figure 7.14. Shadow-map surfaces for an overhead light source. On the left, surfaces facing the light, marked in red, are sent to the shadow map. Surfaces may be incorrectly determined to shadow themselves (“acne”), so need to be biased away from the light. In the middle, only the backfacing triangles are rendered into the shadow map. A bias pushing these occluders downward could let light leak onto the ground plane near location a; a bias forward can cause illuminated locations near the silhouette boundaries marked b to be considered in shadow. On the right, an intermediate surface is formed at the midpoints between the closest front- and backfacing triangles found at each location on the shadow map. A light leak can occur near point c (which can also happen with second-depth shadow mapping), as the nearest shadow-map sample may be on the intermediate surface to the left of this location, and so the point would be closer to the light. 

图7.14。头顶光源的阴影贴图曲面。在左侧,面向灯光的表面,用红色标记,被发送到阴影贴图。表面可能会被错误地确定为阴影本身(“痤疮”),因此需要偏离光线。在中间,只有背面三角形被渲染到阴影贴图中。向下推动这些遮光器的偏压可能会使光泄漏到位置a附近的地平面上;向前偏置会导致标记为b的轮廓边界附近的照明位置被视为阴影。在右边,在阴影贴图上的每个位置找到的最近的正面和背面三角形之间的中点处形成中间表面。点c附近可能会发生灯光泄漏(第二深度阴影贴图也会发生这种情况),因为最近的阴影贴图样本可能位于该位置左侧的中间曲面上,因此该点会更靠近灯光。

Note that for shadow mapping, objects must be “watertight” (manifold and closed, i.e., solid; Section 16.3.3), or must have both front- and backfaces rendered to the map, else the object may not fully cast a shadow. Woo [1900] proposes a general method that attempts to, literally, be a happy medium between using just frontfaces or backfaces for shadowing. The idea is to render solid objects to a shadow map and keep track of the two closest surfaces to the light. This process can be performed by depth peeling or other transparency-related techniques. The average depth between the two objects forms an intermediate layer whose depth is used as a shadow map, sometimes called a dual shadow map [1865]. If the object is thick enough, self-shadowing and light-leak artifacts are minimized. Bavoil et al. [116] discuss ways to address potential artifacts, along with other implementation details. The main drawbacks are the additional costs associated with using two shadow maps. Myers [1253] discusses an artist-controlled depth layer between the occlude and receiver.

请注意,对于阴影贴图,对象必须是“防水的”(流形和封闭的,即固体;第16.3.3节),或者必须将正面和背面都渲染到贴图上,否则对象可能不会完全投射阴影。Woo [1900]提出了一个通用的方法,试图在使用正面或背面阴影之间找到一个折中的办法。这个想法是将实体渲染到阴影贴图中,并跟踪两个最靠近灯光的表面。这个过程可以通过深度剥离或其他与透明度相关的技术来执行。两个物体之间的平均深度形成了一个中间层,其深度被用作阴影贴图,有时被称为双重阴影贴图[1865]。如果物体足够厚,自阴影和漏光伪影将被最小化。Bavoil等人[116]讨论了解决潜在伪像的方法,以及其他实施细节。主要缺点是与使用两个阴影贴图相关的额外成本。Myers [1253]讨论了在闭塞器和接收器之间的艺术家控制的深度层。

As the viewer moves, the light’s view volume often changes size as the set of shadow casters changes. Such changes in turn cause the shadows to shift slightly from frame to frame. This occurs because the light’s shadow map is sampling a different set of directions from the light, and these directions are not aligned with the previous set. For directional lights, the solution is to force each succeeding shadow map generated to maintain the same relative texel beam locations in world space [927, 1227, 1792, 1810]. That is, you can think of the shadow map as imposing a two-dimensional gridded frame of reference on the whole world, with each grid cell representing a pixel sample on the map. As you move, the shadow map is generated for a different set of these same grid cells. In other words, the light’s view projection is forced to this grid to maintain frame to frame coherence.

当观察者移动时,灯光的视图体积通常会随着阴影投射器组的变化而变化。这种变化又会导致阴影在帧与帧之间轻微移动。发生这种情况是因为灯光的阴影贴图从灯光的不同方向集采样,并且这些方向与前一集不对齐。对于平行光,解决方案是强制生成的每个后续阴影贴图在世界空间中保持相同的相对纹理元素光束位置。也就是说,你可以把阴影贴图想象成在整个世界上强加一个二维网格参照系,每个网格单元代表贴图上的一个像素样本。当你移动时,阴影贴图是为这些相同的栅格单元的不同集合生成的。换句话说,灯光的视图投影被强制到该栅格,以保持帧与帧之间的一致性。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

椰子糖莫莫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值