基于LOD的大规模真实感室外场景实时渲染技术的初步研究

基于LOD的大规模真实感室外场景实时渲染技术的初步研究

西北工业大学软件学院,R093班

学生:潘李亮
学号:993754
2003 年 4 月

效果截图

关键字与术语

LOD , (level of detail)、ROAM ( Real-time optimize adaptive mesh).、公告板、多遍纹理映射、运动模糊、 Lens Flare 、天空体、亮度图、Object-Error、Space-Error、四叉树、 Perlin Noise、Diamond Fractal.、Voxel、二叉剖分空间(BSP)、OpenGL、DirectX。Gama Control.

Abstract

The large scale terrain rendering is a hot issue in the Computer Graphics. It play an important role in GIS (Geographic Information System). Flight simulator and video game. The main two problem of the large scale terrain rendering are how to hold the terrain data and how to reduce the large amount triangles. For video game solution. I use a quad-tree based LOD algorithm to reduce the triangles count. I also introduce some other technology to improve the realism of the scene without reducing too much FPS. Such as motion blur.

I implement an outdoor game’s render engine in this paper. Not like other systems. The video game need to running on the PCs, the interactive FPS is needed too. Generally 30 FPS is the best in a video game. . In this paper’s LOD algorithm. The quad-tree is stored in a two dimension array,instead of in a linkage structure. The triangles (the quad tree nodes) not in the view frustum is culled before send them to the render API.。.

The key technology is LOD algorithm. I use the view-dependent and terrain’s roughness to determine the terrain detail. Before render the terrain. I refinement the terrain mesh. Only the vertices are needed will rendered. So the mesh is irregular .The far from the viewer, the less detail. The stronger roughness of the terrain, the more detail. Like other LOD algorithm. I subdivide a terrain node until the desire detail. The subdividing depend on the node level, the terrain’s roughness and the distance between the viewer and the node. The roughness factor is pre-calculated to improve speed.

This paper’s major purpose is the LOD algorithm , So some problem such as

Geomorphing, are still exit. Another important problem is storage layout, I only try a little to settle this problem, so the terrain data storage system is not so effective.

摘要

大规模的地形渲染技术一直是图形学里的热点问题之一。它在GIS、飞行模拟器、视频游戏里有重要的作用。大规模地形渲染的两个主要问题是地形数据存储问题和三角形数目问题。针对视频游戏,本文使用了一种基于四叉树的LOD算法来解决大规模地形渲染中的三角形数目问题。并且使用了其它一些技术,在保证渲染速度的前提条件下,有效的提高了场景的视觉真实程度。如运动模糊。

本文基本上实现了一个室外游戏的渲染引擎。不同于其它的应用系统,视频游戏一般要求在PC机上运行,而且要求比较高的交互性帧率。一般认为30 FPS是比较合适的速度,因此速度是第一前提。在本文的LOD算法中,四叉树信息被保存在一个二维数组中,而不是传统的链式结构。大部分不在视体内的三角形(四叉树节点)在送入渲染API之前就被切除掉。同时本文的算法只用了一遍四叉树遍历,从而大大提高了渲染速度。

本文的关键是LOD算法,我使用了视点相关以及和地形本身起伏程度相关的技术来决定地形应有的细节程度。在每次渲染前,我们都动态的更新地形网格,只渲染我们需要的节点。因此地形网格是不规则的。离观察者越远,细节越少,地面越粗糙,细节越多。和其它的 LOD 算法一样,我们递归的分割一个节点,直到到达需要的细节程度。这种分割依赖于节点的大小,节点内地形的起伏程度,以及观察者离节点的距离。地形的起伏程度事先被计算出来以提高速度。

本文主要的目的是实现LOD算法,所以其它的一些问题如同几何形变依旧存在。另外的一个主要问题:数据存储布局也不是十分的有效,在这个问题上我只是做了一些简单的尝试。

注:本人重新整理这篇论文的目的是方便还在寻找的人有个地方能看到。另外,本人声明本文的技术已经落伍,切勿模仿,否则鄙视之,潘李亮于2009。

目录

第一部分:简介

第一章:大规模室外场景渲染技术简介

    第一节:室内Vs.室外

    第二节:Voxel Vs.LOD

    第三节:动态地形Vs.静态地形

    第四节:其他

第二部分:基于LOD算法的地形简化

第二章:LOD简介

第三章:相关的研究

第四章:LOD算法

    第一节:基本思想

    第二节:数据存储

    第三节:节点评价系统

    第四节:网格的渲染

    第五节:网格的生成

    第六节:优化

第五章:裁剪

第六章:性能测试

第三部分:真实感场景的生成技术

第七章:天空体和镜头眩光

第八章:公告板技术

第九章:地表的细节

第十章:景深处理

第十一章:运动模糊

第四部分:结论和展望

附录

A:地形数据的生成

B:参考文献

第一部分:简介

室外场景的实时渲染技术是游戏编程世界中的热点技术. 同时它在其它领域也有着同样重要的作用。如 GIS 系统,飞行模拟系统,VR系统以及数字地球技术等都离不开室外场景的实时渲染技术。一个优秀的室外场景实时渲染技术在保证实时性以外还能创造出非常逼真的、有说服力的虚拟自然环境。如Nova Logic公司的著名的3D射击游戏Delta Force 系列,它除了能模拟出各种如雪地、草地、沙漠等地形以外,还能模拟出各种树木,杂草,以及各种天气效果。

室外场景的实时渲染有许多技术上的难点,在以下的章节里我们将作详细的介绍以及针对一些主要问题的解决方案。

本文的主要内容分两个部分:一、大规模地形的渲染。二、如何提高场景的真实性。分别第二部分和第三部分。

3D场景的渲染离不开3D API。目前流行的3D API有两种,SGI公司的OpenGL和微软公司的Direct3D。两种API各自有自己的优点,均能很好的使用硬件加速功能。但是OpenGL是一种开放性的标准,有更好的移植性能,它能在Linux 和FreeBSD 下工作。甚至还可以使用硬件加速(nVidia公司专门为Linux /FreeBSD推出了驱动程序)。因此在本文里,我使用了OpenGL。不过如果熟悉原理,其实也大同小异,D3D到8.0以后做的非常的像OpenGL.

第一章:大规模室外场景渲染技术简介

第一节:室外 Vs. 室内

下面我们把室内场景和室外场景做一个对比,来看看室外场景的实时渲染的主要难点。

目前最成功的商业室内游戏引擎有Quake /DOOM系列、Unreal系列引擎。他们都基于BSP技术的。通过BSP技术,再加上PVS , Portal等技术可以大量减少场景的复杂程度,通过Portal技术甚至可以把一个室内场景和一个室外场景连接起来,关于室内引擎的渲染的进一步已经超出了本文的范围。

我们知道,当我们站在一个房间里的时候,我们能欣赏到的景物不过是这个房间的摆设以及透过这个房间的门和窗能看到的景物而已。你只能在墙壁的约束范围内走动。换句话说,我们处在一个有限的空间内。我们有足够的理由阻止人们穿过墙进入墙外的世界,也有足够的理由把视野约束在高墙以内。

图(1-1),一个典型的室内场景,使用id Software的Quake III地图文件,用www.GameToturials.net 的程序渲染

但是,这些约束在一个室外的场景中都是不可能的。在一个飞行模拟器中,理论上你可以驾驶飞机朝任何一个无限远的飞去。因为事实也是如此,如果你愿意的话,你可以驾驶飞机绕着地球飞行而不用担心有墙来阻止你的前进。换句话说,一个室外场景的理想大小是无限的大!除了场景的大小以外,同时视野也是无限的。如果你站在高处,你可以俯视任何比你的底的地方,也就是说你有几乎无限的视野。

图(1-2),典型室外场景,图片来自北航王正盛的Demo :Nature Wing2.0截图

我们知道,无限的大的场景需要无限的场景数据。但是这是不可能的,我们只能希望场景越大越好,室外场景的主要部分是地形的渲染,地形数据的多少决定了场景的大小。所以如何保存这些地形数据成了首要的问题。(但是在现在存储器成本迅速下降的今天,这个问题已经变的不是十分的突出。)其次是无限的视野问题,无限的视野就表示渲染无限的图元(图元即是3DAPI支持的简单的几何图形,详见OpenGL/Direct3D SDK),这也是不可能。图元的数量是以场景大小的平方的速度增长的。光考虑地形数据,一个2048X2048的地形,如果不考虑减低细节程度和裁剪的话,它将要渲染8M的三角形,这样的三角形量在PC级别上目前还是远不能实现交互式帧率的。所以,如何减少要渲染地形时候的图元数目成了室外场景实时渲染的关键问题。

其他的情况还有如野外的地表衍生物:树木、杂草、地貌等。同时天气效果,如下雨、下雪,刮风和闪电等.这些东西在一个室内的环境下基本上是不需要考虑的。而且模拟这些效果都需要很高的代价,有些甚至根本就没有办法模拟。

第二节:Voxel Vs.LOD

综上,我们知道,室外场景实时性渲染的关键地形的渲染。我们需要一种技术来降低地形渲染的开销。

目前的地形渲染技术主要有两种Voxel和LOD,下面我来做个简单的介绍。

Voxel也就是Volumetric Pixel。也就是所谓的“体素”,它是相对于像素来说的,如果说像素是一个二维的矩形的话,那么Voxel就是一个三维的立方体。它的原理是比较简单的。James Sharman自称他在1995年时就想出了这种方法。前面的提到的Delta Force游戏就是使用了Voxel 技术。关于Voxel的细节技术不是本文的重点,我不准备做深入的介绍。Voxel有一个天生的优点就是渲染的时候它和场景的大小没有关系,而且绝对不会渲染多余的东西(自带裁剪功能)。它的复杂度只和我们需要的视野,以及分辨率有关。而且可以在不使用硬件加速的情况下达到比较理想的速度(Delta Force I就没有使用硬件加速),生成的图象也比较的细腻。它的缺点就是不够的灵活。

LOD也就是层次细节(Level of Detail)的简称,不同于Voxel技术,它是一种使用多边形的,真正的3D渲染技术。它根据一定的规则来简化物体的细节,我们可以根据需要来选择不同细节程度的物体表达方式。如离观察者近的选择较高的细节程度、反之选择较底的细节程度。用在地形渲染中,有时我们也称它为多分辨率地形(Muti-resolution terrain)渲染技术。

图(1-3),基于Voxel的渲染场景,图片来自中国游戏开发者网络,陈鹏《自己动手编Voxel 3D引擎》

图(1-4),基于LOD的渲染结果,图片来自本文的Demo: Sim-Nature.

LOD算法处理起来比较复杂,但是它让我们可以足够自由的去控制我们的场景渲染,更加方便的使用显卡的硬件加速功能。而且可以很容易的在场景中组合其他的物体。如树木,太阳以及粒子系统等,天空如它可以方便的让观察者以任意的角度去观察场景,我们只要让摄影机旋转一定的角度就可以了。但是这在Voxel中是比较困难的,因为Voxel在处理非水平的视线的时候非常的麻烦。

LOD技术是本文将要使用和实现的地形渲染技术。

图(1-5),经过LOD处理的地形网格,有不同的细节。图片来自本文的Demo: Sim-Nature.

第三节:动态地形Vs.静态地形

地形的渲染通常分为动态和静态的两种。

静态的地形的细节可以是均匀的,也可以是不均匀的。但是细节通常在事先就计算好了,不均匀细节的静态地形有许多的优点:如平原的地貌可以使用较底的细节,而起伏频繁的地方使用较高的细节等级。更为直观的一个例子是赛车一类的对可以到达地方有一定限制的应用,我们可以在离赛道近的地方建立起比较高的细节等级,而在较远的地方使用较少的细节。用这种方式也可以建立起不规则的地形。比如说,它可以沿着赛道的方向建立起一个地形模型,这样可以节省大量的空间。

动态的地形是视点相关的。它是本文将要采用和实现的方法。随着视点的移动,地形网格将被更新。相对于静态地形来说这是一种更为先进的算法。这种方式建立起来的场景更加符合人的视觉特性,即看到的细节是变化的。动态地形网格的建立和更新要耗费额外的时间,但是这种开销是值得的。动态地形网格的建立是比较复杂的,它需要注意很多东西:如何决定细节,如何避免裂缝是两个主要的问题。同时它还应该把不可见的地形部分切除,几何形变(随着细节改变,地形表面的呼吸现象)也应该被考虑到。这些问题都在以后的章节被详细的讨论到。

第四节:其他

       我们说过,在一个室外场景的渲染中。除地形以外其他的一些元素也是十分的重要的,这些元素可以提高场景的真实性。本文将实现其中的一部分元素,这包括:树木、地面细节,太阳、天空已经运动模糊等效果。他们将在本文第三部分集中讨论。

第二部分:基于LOD算法的地形简化

引言

地形渲染是一个室外渲染引擎的核心部分。而实现一个大规模的地形渲染系统的关键是如何简化地形,抛弃不必要的渲染动作(如看渲染不见的三角形和不必要的细节)来加快渲染速度。动态 LOD技术无疑是一个强有力的解决方案。

第二章:LOD简介

当我们要生具有相当真实感的场景的时候,由于场景本身的复杂性,要实现实时性往往时不太可能的。我们必须从场景的本身的几何特性入手,通过适当的方法来简化场景的复杂性。层次细节(Levels of Details )技术就是在这样的情况下提出来的。

我们知道,当场景中的物体离观察者很远的时候,它们经过观察、投影变换后在屏幕上往往只是几个像素而已。我们完全没有必要为这样的物体去绘制它的全部细节,我们可以适当的合并一些三角形而不损失画面的视觉效果。对于一般的应用,我们通常会为同一个物体建立几个不同细节层度的模型,如下图的牛的模型,最左边的有最高的细节层度,而最右边的则经过了相当的简化。这样的技术在地形渲染中,我们也称之为多分辨率地形(Multi-Resolution Terrain)。

(图2.1)牛的层次细节模型,图片来自清华大学远程教育网

这些不同细节层度的模型可以时在程序运行前建立的。也可以是在运行时刻计算生成的。我们可以从一个全细节的模型出发,通过一系列简化操作生成底细节层度的模型,简化操作可以分成三种(见[参考文献 31]):顶点删除,边压缩和面片收缩技术。通过这样处理后,我们可以在特定的场合下选择合适的模型,而不必每次都选用全细节的模型,这样大大的降低场景三角形数量。

地形作为一种特殊的几何物体,我们在运用LOD法则的时候有一些特殊的技巧。因为地形通常是一个规则的矩形网格。其简化模式可以有两种:规则的简化和非规则的简化,规则的简化通常是对这个矩形网格采用自顶向下(Up-to-Down)、分而治之的策略,典型的有四叉树和二叉树,它们从场景的最低细节层度开始,按需要不断的提高细节。非规则的简化通常是采用自底向上(Down-to-Up)的方法来处理的。它的实现则通常比较少。

     

(图2.2)规则的简化(左边)和非规则的简化方式(右边)。图片来自[参考文献2,12]

实现LOD算法时,除了如何对几何物体进行简化以外,还有一个很重要的问题就是如何决定是否对一个物体进行简化,或者说在某个时刻该如何决定使用哪个层次细节度的模型来表示物体。我们需要建立一个评价系统,由这个评价系统来决定要对物体简化到何种层度。这种评价系统通常是视点相关的,离视点远的物体通常只需要较少的细节,反之则需要比较多的细节。除此之外,物体本身的特性也必须考虑在内。比如说,一个平坦的表面只需要很少的三角形就能较好表现出来。而一个凹凸不平的表面是理所当然的需要更多的三角形去描绘的。

用LOD 算法渲染地形的时候,还有一个很重要的问题就是几何变形(Geomorphing)问题,由于对一些细节的丢弃,随着视点的移动,远处原来没有的细节很可能会突然出现,这种现象也称为“跳出”(“Pop”)。我们必须消除这种现象,或者至少要把它控制在可以接受的范围以内。

由上可知,LOD算法其实并不很复杂,本文认为其关键处可概括如下:

  1. 数据的存储布局,数据在内存中的布局必须要方便算法的实现,同时最好还要降低操作系统缺页中断的次数,也就是降低内外存之间的数据交换的次数。
  2. 如何在生成连续的LOD化的地形网格,在地形LOD化过程中,要让两个由不同层度的细节的区域之间能平滑的过度。
  3. 节点评价系统,这个系统必须要使生成的网格能尽量的减少几何形变,尽量的使画面质量能接近全分辨率时候的地形。同时还要保证实时性。

第三章:相关的研究

在过去的几年中,已经由相当的数量的实用的算法被开发出来。Bryan Turner在他的论文[参考文献 32]中提到,LOD地形法则可以由三篇优秀的论文来概括,它们为[参考文献12 ,4 和 7],在[参考文献12]中,Hoppe 描述了一个Progressive Mesh的模型,它是使用自底向上的模式。[参考文献4]作者是Lindstrom,它则使用了一种基于四叉树的数据结构,他用四叉树递归的把一个地形分割成一个一个小块(tessellates)并建立一个近似的高度图。[参考文献7]的作者是Duchaineau,他描述了一个基于二元三角树结构的法则ROAM(实时优化自适应网格)。这里每一个小片(Patch)都是一个单独的正二等边三角形,从它的顶点到对面斜边的中点分割三角形为两个新的正等边三角形,分割是递归进行的可以被子三角形重复直到达到希望的细节等级。后两篇论文采用的都是规则的简化的模式,并采用分而治之的策略。而Hoppe采用的则是一种不规则的简化模式,它可以往任何一个三角形里增加细节,也可以删除任何一个顶点和边。

Hoppe的法则使用比较少,很难在他以外的文章以外地方见到,Lindstrom 和Duchaineau的方法则不同,它们分别代表了当前的两大主流法则:基于四叉树的LOD地形分割和基于二叉树的LOD地形分割。

以上三篇文章是相当出色和精彩的。但是有一定的难度和复杂。本文更多的则是采用的是[参考文献2 和 13]中的技术。两者都采用了四叉树的思想,这基本上同[参考文献4],但是更加的简单和快速,同时[参考文献2]提供的顶点评价系统非常的快速。遗憾的是两者都没有建立完善的内存数据布局来解决来地形数据的存储问题。

作为游戏开发领域的热点问题,自然有LOD算法是源于游戏开发人员的,如上的[参考文献13]就是出自2000年的GDC。同时也已经有相当一部分游戏成功的采用了各种不同的LOD算法,如Tread Marks ,Myth ,Soul Ride等。[参考文献8]的作者Thatcher Ulrich在他的文章里以 Soul Ride游戏开发者的身份描述了应用于Soul Ride的基于四叉树的算法(详见www.Gamasutra.com)。不同于学院派的算法,游戏开发者的算法通常更加的简洁和快速。

第四章:LOD算法

第一节:基本思想

在提出基本的算法之前,为了简单起见,本文必须对要渲染的地形做如下的规定:地形必须是一正方形区域。而且大小必须是 . 同时采样间隔必须均匀。

(图4.1)一个地形的四叉树表示,左图中每一个正方形为四叉树的一个节点,粉红色的为观察者能看到的区域。

如图4.1所示,我们采用四叉树的概念来描述一个多分辨率地形,图中的每一个正方形为四叉树的一个节点,每个节点保存了一定区域的信息,包括:中心点的高度,从整个完整的地形出发,我们递归的把地形不断的分割(Sub-divide)成相等的四个区域,分割的深度越大,则得到的分辨率越高。即分割深度每提高一层,采样密度提高一倍。图4.2演示了分割的过程。

图4.2,分割过程示意图,level 1到2时,只对两个节点进行了分割

图4.3给出了我们在一个四叉树节点中要保存的信息。在本章的第四节中将看到,如何用这些信息渲染这个节点表示的地形区域。

(图4.3) 一个节点中记录的信息,红色的为中心点,黑色的为边点,蓝色的角点。一共9个点。

采用四叉树的概念来表示多分辨率地形有许多优点,一个最直接有效的受益就是裁剪,如图4.1所示,其中红色的区域为观察者能看到的部分。我们很容易知道观察者能看到的只是绿色的节点,白色的节点则根本不需要考虑。因此,我们可以在节点递归分割的初期只花很少的代价就可直接把这些看不到的区域简单的丢弃掉。

有了地形的逻辑表示后,我们还要建立一个节点评价系统来判定一个节点何时需要被继续分割,何时被直接丢弃(当这个节点不能被观察者看到的时候,节点将被直接丢弃)。如果一个节点没有被丢弃,也不需要继续分割,那么这个节点将被送入渲染API进行图元渲染。

第二节:数据存储

地形数据通常存储在高度图里,在内存的结构即为一个二维数组。我们知道二叉树可以有顺序结构和链式结构,同理四叉树也可以采用类似的顺序结构。不同的是这里我们采用二维数组而不是一维数组。我们把全分辨率的地形数据存储在一个二维数组中,四叉树节点的信息(9个顶点的信息)可以直接通过索引在数组中读取。同时还要建立一个和这个地形数据数组大小相同的标志数组,这个标志数组指示四叉树节点的状态。如果一个节点需要被继续分割,我们则把相应的位置标记为1,否则标记为0,如图4.4,标着问号的表示没有被访问到,(注意没有被访问到的地方的数值是不确定的)。

由图4.4的数组易知地形大小为什么要满足 。(对于不满足大小要求的地形,我们必须把把它分割成满足要求的大小,然后进行拼接。)出于算法的简洁性,本文只考虑大小为 的地形。

   

(图4.4) 一个地形标记数组(9x9 )示意图,右边为用这个标记数组渲染的地形,其中黑点表示当前节点需要继续分割,空心点表示不需要继续分割。

二维数组的存取是按行或者按列的。考虑到观察者移动的区域性,本文尝试使用了一种按区域存储的二维数组,即在物理上把地形数据分成等大小的块,块的大小不能太大,也不能太小。考虑到Intel的CPU的内存页大小是4K,块的大小应该为64×64比较合适,本文采用了32×32的块。这样的存储结构在一定层度上能提高存储效率,降低内存缺页的次数。关于如何使存储结构更加有效的方法在很多文章都有介绍,[参考文献1]就给出了一种称为分簇的内存数据结构,能有效的降低内存缺页带来的性能影响。

第三节:节点评价系统

首先我们要建立一个节点评价系统,决定一个何时该对一个节点进行继续分割。我们把这个评价系统分成两个部分,一是视点相关的,二是地形本身的粗糙层度。裁剪器理论上也该是节点评价系统的一部分,但是考虑到它的特殊性,我们将在单独一章中介绍。

(图4.5)视点距离因素示意图,l为视点离节点中心的距离。d为节点的尺寸

①我们希望离观察者近的地方细节越多,反之则越少。将距离因素应用于一个节点的时候,还必须考虑到节点的大小。因此,结合图4.5我们如下的公式:

(C为一个可以调节的因子)

其中l为节点的中心位置到视点的距离,d为节点的大小,当它们满足这个公式的时候,节点需要继续分割。其中C为一个可以调节的因子,C越大,地形细节越多。反之则细节越少。

②第二个需要考虑的因素是地形本身的粗糙程度,我们希望地形起伏比较崎岖的区域有较高的细节程度,而平坦的地方则不需要我们浪费过多的图元。

如图4.6所示,首先我们考虑一个节点包含的9个顶点,其中中心点4个边点在节点被分割和不被分割时候会引起一定的误差,这5个误差值为图4.6左图所示的dh0 – dh4。它们的数值越大表示这个节点表示的地形越粗糙。除此之外,我们还要考虑到这个节点的所有四个子节点的粗糙程度dh5 - dh8,如图4.6右图所示。(如果这个节点达到了最高分辨率表示的地形,则不需要考虑这一步)。我们取这九个值(dh0 - dh8)中的最大的一个除以节点的大小作为这个节点粗糙度的评价值,即 r = Max(dh0,…dh8)/d。由此可见,粗糙度的计算是一个递归的过程,考虑到计算的复杂性和它值的不变性,我们需要事先把粗糙度的评价值计算出来,同样把它存储在一个二维数组中。

图4.6,地形粗糙程度的度量,左图表示了一个节点内部5个粗糙度信息,右图则表示了它本身的粗糙度信息和它所有子节点的粗糙度信息

现在我们给出第二个评价公式即粗糙度评价公式:

  ( 为粗糙度调节因子)

为粗糙度调节因子, 越大,细节程度越高。综合以上两个公式,我们将得到最终的节点评价公式。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值