LearnOpenGL学习笔记——模板测试

GLES3.0中文API-glStencilFunc、glStencilFuncSeparate 名称 glStencilFunc - 设置模板测试的前后功能和参考值 glStencilFuncSeparate - 设置模板测试的前端和/或后端功能和参考值 C规范 void glStencilFunc( GLenum func, GLint ref, GLuint mask); void glStencilFuncSeparate( GLenum face, GLenum func... 阅读详情

模板测试

当片段着色器处理完一个片段之后,模板测试(Stencil Buffer)会开始执行,和深度测试一样,它也可能会丢弃片段。接下来,被保留的片段会进入深度测试,它可能会丢弃更多的片段。模板测试是根据又一个缓冲来进行的,它叫模板缓冲(Stencil Buffer),我们可以在渲染的时候更新它来获得一些很有意思的效果。

一个模板缓冲中,(通常)每个模板值(Stencil Value)是8位的。所以每个像素/片段一共能有256种不同的模板值。我们可以将这些模板值设置为我们想要的值,然后当某一个片段有某一个模板值的时候,我们就可以选择丢弃或者保留这个片段了。

每个窗口库都需要为你配置一个模板缓冲。GLFW自动做了这件事,所以我们不需要告诉GLFW来创建一个,但其它的窗口库可能不会默认给你创建一个模板库,所以记得要查看库的文档。

模板缓冲首先会被清除为0,之后在模板缓冲中使用1填充了一个空心矩形。场景中的片段将会只在片段的模板值为1的时候会被渲染(其它的都被丢弃了)。
在这里插入图片描述
模板缓冲操作允许我们在渲染片段时将模板缓冲设定为一个特定的值。通过在渲染时修改模板缓冲的内容,我们写入了模板缓冲。在同一个(或者接下来的)渲染迭代中,我们可以读取这些值,来决定丢弃还是保留某个片段。使用模板缓冲的时候你可以尽情发挥,但大体的步骤如下:

  • 启用模板缓冲的写入。 渲染物体,更新模板缓冲的内容。
  • 禁用模板缓冲的写入。
  • 渲染(其它)物体,这次根据模板缓冲的内容丢弃特定的片段。

所以,通过使用模板缓冲,我们可以根据场景中已绘制的其它物体的片段,来决定是否丢弃特定的片段。

我们可以使用GL_STENCIL_TEST:

glEnable(GL_STENCIL_TEST);

注意,和颜色和深度缓冲一样,你也需要在每次迭代之前清除模板缓冲。

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);

和深度测试的glDepthMask函数一样,模板缓冲也有一个类似的函数。glStencilMask允许我们设置一个位掩码(Bitmask),它会与将要写入缓冲的模板值进行与(AND)运算。认情况下设置的位掩码所有位都为1,不影响输出,但如果我们将它设置为0x00,写入缓冲的所有模板值最后都会变成0.这与深度测试中的glDepthMask(GL_FALSE)是等价的。

glStencilMask(0xFF); // 每一位写入模板缓冲时都保持原样
glStencilMask(0x00); // 每一位在写入模板缓冲时都会变成0(禁用写入)

模板函数

和深度测试一样,我们对模板缓冲应该通过还是失败,以及它应该如何影响模板缓冲,也是有一定控制的。一共有两个函数能够用来配置模板测试:glStencilFunc和glStencilOp。

glStencilFunc(GLenum func, GLint ref, GLuint mask)一共包含三个参数:

  • func:设置模板测试函数(Stencil Test
    Function)。这个测试函数将会应用到已储存的模板值上和glStencilFunc函数的ref值上。可用的选项有:GL_NEVER、GL_LESS、GL_LEQUAL、GL_GREATER、GL_GEQUAL、GL_EQUAL、GL_NOTEQUAL和GL_ALWAYS。它们的语义和深度缓冲的函数类似。
  • ref:设置了模板测试的参考值(Reference Value)。模板缓冲的内容将会与这个值进行比较。
  • mask:设置一个掩码,它将会与参考值和储存的模板值在测试比较它们之前进行与(AND)运算。初始情况下所有位都为1。
	//在一开始的那个简单的模板例子中,函数被设置为:
	glStencilFunc(GL_EQUAL, 1, 0xFF)
	//这会告诉OpenGL,只要一个片段的模板值等于(GL_EQUAL)参考值1,片段将会通过测试并被绘制,否则会被丢弃。

但是glStencilFunc仅仅描述了OpenGL应该对模板缓冲内容做什么,而不是我们应该如何更新缓冲。这就需要glStencilOp这个函数了。
glStencilOp(GLenum sfail, GLenum dpfail, GLenum dppass)一共包含三个选项:

  • sfail:模板测试失败时采取的行为。
  • dpfail:模板测试通过,但深度测试失败时采取的行为。
  • dppass:模板测试和深度测试都通过时采取的行为。

GL_KEEP 保持当前储存的模板值
GL_ZERO 将模板值设置为0
GL_REPLACE 将模板值设置为glStencilFunc函数设置的ref值
GL_INCR 如果模板值小于最大值则将模板值加1
GL_INCR_WRAP 与GL_INCR一样,但如果模板值超过了最大值则归零
GL_DECR 如果模板值大于最小值则将模板值减1
GL_DECR_WRAP 与GL_DECR一样,但如果模板值小于0则将其设置为最大值
GL_INVERT 按位翻转当前的模板缓冲值

默认情况下glStencilOp是设置为(GL_KEEP, GL_KEEP, GL_KEEP)的,所以不论任何测试的结果是如何,模板缓冲都会保留它的值。默认的行为不会更新模板缓冲,所以如果你想写入模板缓冲的话,你需要至少对其中一个选项设置不同的值。
所以,通过使用glStencilFunc和glStencilOp,我们可以精确地指定更新模板缓冲的时机与行为了,我们也可以指定什么时候该让模板缓冲通过,即什么时候片段需要被丢弃。

物体轮廓

物体轮廓所能做的事情正如它名字所描述的那样。我们将会为每个(或者一个)物体在它的周围创建一个很小的有色边框。当你想要在策略游戏中选中一个单位进行操作的,想要告诉玩家选中的是哪个单位的时候,这个效果就非常有用了。为物体创建轮廓的步骤如下:
1.在绘制(需要添加轮廓的)物体之前,将模板函数设置为GL_ALWAYS,每当物体的片段被渲染时,将模板缓冲更新为1
2.渲染物体
3.禁用模板写入以及深度测试
4.将每个物体缩放一点点
5.使用一个不同的片段着色器,输出一个单独的(边框)颜色
6.再次绘制物体,但只在它们片段的模板值不等于1时才绘制
7.再次启用模板写入和深测试
在这里插入图片描述
模板边框着色器:

void main()
{
    FragColor = vec4(0.04, 0.28, 0.26, 1.0);
}

先启用模板测试,并设置失败时的操作:

glEnable(GL_STENCIL_TEST);
//如果模板测试和深度测试都通过 模板值设置为glStencilFunc函数设置的ref值
glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
//清除颜色,模板缓存,深度缓存,这个时候所有数值为0,颜色缓存中设置的是glClearColors设置的颜色
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
//通过使用GL_ALWAYS模板测试函数,我们保证了箱子的每个片段都会将模板缓冲的模板值更新为1。因为片段永远会通过模板测试
glStencilFunc(GL_ALWAYS, 1, 0xFF); // 所有的片段都应该更新模板缓冲
glStencilMask(0xFF); // 启用模板缓冲写入

以上步骤结束后,我们模板中的数据应该箱子像素所在位置的模板值为1.

绘制放大的箱子:
禁用深度缓存的意义在于不让地板遮挡放大的箱子轮廓

//我们将模板函数设置为GL_NOTEQUAL,它会保证我们只绘制箱子上模板值不为1的部分,即只绘制箱子在之前绘制的箱子之外的部分
glStencilFunc(GL_NOTEQUAL, 1, 0xFF);
glStencilMask(0x00); // 禁止模板缓冲的写入
glDisable(GL_DEPTH_TEST);
shaderSingleColor.use(); 
DrawTwoScaledUpContainers();

整体绘制思路:

glEnable(GL_DEPTH_TEST);
glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);  

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); 

// 绘制地板时不用更新模板
glStencilMask(0x00); // 记得保证我们在绘制地板的时候不会更新模板缓冲
normalShader.use();
DrawFloor();

// 绘制箱子,并写入箱子位置的模板为1
glStencilFunc(GL_ALWAYS, 1, 0xFF); 
glStencilMask(0xFF); 
DrawTwoContainers();

// 绘制箱子边框,条件是不为1的部分绘制,且这个箱子是放大过后的。同时禁止深度缓存,避免地板遮挡边框,这个时候不写入模板
glStencilFunc(GL_NOTEQUAL, 1, 0xFF);
glStencilMask(0x00); 
glDisable(GL_DEPTH_TEST);
shaderSingleColor.use(); 
DrawTwoScaledUpContainers();
glStencilMask(0xFF);
glEnable(GL_DEPTH_TEST);  

https://learnopengl-cn.github.io/04%20Advanced%20OpenGL/02%20Stencil%20testing/#_3

零基础学习OpenGL(四)--模板测试        模板测试在深度测试之前。当片段着色器处理完一个片段后,模板测试会开始执行,被保留下来的才会进入深度测试。模板测试对应模板缓冲。        模板缓冲:每个模板值8位表示,这样每个片段就有2的8次方,256种模板值。因此可以利用这些不同的模板值,保留或丢弃某个片段。模板缓冲操作允许我们在渲染片段时将模板缓冲设定为一个特定的值。通过在渲染时修改模板缓冲的内容,写入模板缓冲。同一个渲染... 阅读详情

相关推荐

【LearnOpenGL学习笔记】——15.模板测试

文章目录1.概念2.模板函数3.模板轮廓 1.概念 (1)模板值(8位):每个像素/片段上的一个属性 (2)模板缓冲:存储模板值 (3)模板测试:对模板值进行比较 (4)模板写入:在比较后修改模板值 2.模板函数 (1)glEnable(GL_STENCIL_TEST):开启模板测试 (2)glStencilFunc(GL_NOTEQUAL, 1, 0xFF):模板测试函数,第一个为op,第二个为模板值,第三个为与的值 (3)glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE)

qq_45974407的博客 388

OpenGL学习笔记(十五)模板测试

当片段着色器处理完一个片段之后,模板测试(Stencil Test)会开始执行,和深度测试一样,它也可能会丢弃片段。接下来,被保留的片段会进入深度测试,它可能会丢弃更多的片段。模板测试是根据又一个缓冲来进行的,它叫做模板缓冲(Stencil Buffer),我们可以在渲染的时候更新它来获得一些很有意思的效果。 一个模板缓冲中,(通常)每个模板值(Stencil Value)是8位的。所以每个像素...

你微笑时好美丶的博客 342

Ruoyi-Cloud-Plus新手必看:Gateway启动失败的两种解决方案(Nacos配置空间问题)

本文详细解析了Ruoyi-Cloud-Plus框架中Gateway启动失败的常见原因及解决方案,重点围绕Nacos配置空间问题展开。针对新手开发者,提供了两种实用方案:快速切换到public空间或规范创建dev空间并迁移配置,帮助开发者高效解决网关启动故障,确保微服务项目顺利运行。

weixin_30872499的博客 492

从渲染管线学 GLES2.0(九)----测试与混合

深度测试,根据片段的深度值来判断片段能否被渲染,如果一个物体有遮挡,那么我们只希望绘制我们可以看得到的片段,离我们比较远被遮挡的片段是不希望被绘制出来的。在屏幕空间中,物体表面上的任意点的坐标 z 值代表一个深度值,深度值的范围是 [0, 1],其中值为 0 代表在近平面上,为 1 代表在远平面上,也就是说深度值越小则离观察者是越近的。深度测试发生在模板测试之后,当深度测试被启用的时候,就会将一个片段的深度值与对应位置的深度缓冲值比较,如果这个深度测试失败了,片段也就将会被丢弃。

yp18792574062的博客 1305

从Si3N4到SiNx:一文搞懂芯片制造中氮化硅的化学式玄机(附工艺参数影响)

本文深入探讨了芯片制造中氮化硅(SiNx)化学式的调控艺术,揭示了从Si3N4到SiNx的转变如何影响材料性能。通过分析PECVD和PVD工艺参数对x值的精确调控,以及x值对电学和机械性能的影响,为半导体制造提供了实用的工艺优化策略。

weixin_30776273的博客 192

传感器融合的智能演进:ST-MC-Workbench中霍尔与编码器的协同控制策略

本文探讨了ST-MC-Workbench中霍尔传感器与编码器的协同控制策略,通过传感器融合技术提升电机控制精度。文章详细介绍了分层处理架构、霍尔安装角度优化及编码器Z脉冲容错机制,展示了在新能源汽车和工业应用中的实际效果,为高精度位置检测提供了解决方案。

weixin_29159441的博客 482

OpenGL之模板测试

默认情况下设置的位掩码所有位都为1,不影响输出,但如果我们将它设置为0x00,写入缓冲的所有模板值最后都会变成0.这与深度测试中的glDepthMask(GL_FALSE)是等价的。模板测试是根据又一个缓冲来进行的,它叫做模板缓冲(Stencil Buffer),我们可以在渲染的时候更新它来获得一些很有意思的效果。场景中的片段将会只在片段的模板值为1的时候会被渲染(其它的都被丢弃了)。1.在绘制(需要添加轮廓的)物体之前,将模板函数设置为GL_ALWAYS,每当物体的片段被渲染时,将模板缓冲更新为1。

一个小菜鸡的学习之路 987

如何利用Arcgis进行地统计学分析(三):空间插值方法选择与优化

本文深入探讨了在Arcgis中进行地统计学分析时,如何根据探索性数据分析(EDA)结果科学选择与优化空间插值方法。文章对比了IDW、RBF、克里金等主流方法的适用场景与核心参数,并通过实战案例详解了从数据诊断到模型调优的完整流程,强调结合半变异函数与趋势分析进行“对症下药”,以提升插值结果的精度与可靠性。

weixin_29281915的博客 120

【OpenGL】LearnOpenGL学习笔记13 - 深度测试、模板测试

LearnOpenGL学习笔记 - 模板测试、深度测试

Duo1J的随笔 1104

【异常】OpenClaw认证 Please carry the API secret key in the ‘Authorization‘ field of the request header

OpenClaw助手Agent因401认证异常导致业务中断的排查方案。该异常由大模型API鉴权全量失败触发,主要根因包括API凭证配置错误、密钥过期、账号权限不足或请求格式不规范。解决方案分四级:优先校验并修正API密钥;排查账号状态与调用权限;检查请求格式规范;最后排查网络或服务商问题。建议建立密钥生命周期管理机制,定期监控额度,使用专用API密钥以规避类似问题。该异常属于凭证配置类故障,不影响系统稳定性。

奶爸的编程之路,也就一周冷个三天 464

【AMD | Docker】超级全面版本:在Docker中验证AMD GPU移动显卡可用性的方法

1. 安装ROCm Docker支持 ■AMD GPU驱动 ■ROCM ■Docker 2. 配置Docker使用ROCm 3. 使用官方ROCm Docker镜像 4. 使用Docker CLI参数访问GPU

静谧、淡雅 684

learnopengl学习笔记——模板测试

片段着色器——模板测试——深度测试 和深度测试一样,模板测试(Stencil Test)也可能会舍弃片段。模板测试是根据模板缓冲来进行的。一个模板缓冲中,通常每个模板值是8位的。所以每个像素一共可以有256种不同的模板值。我们可以将这些模板值设置为我们想要的值,然后当某个片段有某个模板值的时候,我们选择舍弃或是保留这个片段。说白了模板缓冲可以自定义舍弃哪些片段、采用哪些片段。 一般的工作流如下: 启用模板缓冲的写入 渲染物体,更新模板缓冲内容 禁用模板缓冲写入 渲染物体,根据模板缓冲内容丢弃特点片段

kiss_the_rian的博客 235

《UDS协议从入门到精通》系列——图解0x19:读取故障码信息

认识最核心的诊断服务“0x19”!!全网最强图解!一文搞懂所有常用子服务!

车载系统攻城狮 1万+

LearnOpenGL学习笔记—高级OpenGL 02:模板测试

LearnOpenGL学习笔记—高级OpenGL:模板测试 本节对应官网学习内容:模板测试

清清!的博客 1079

BUCK-BOOST升降压电路Multisim电路仿真分析

本文分析了三极管型BUCK-BOOST升降压开关电源的工作原理。该电路结合了BUCK降压和BOOST升压拓扑,通过控制三极管Q1的高频通断,使电感L1周期性储能和释能,实现输出电压可高于或低于输入电压且极性相反。详细阐述了Q1导通和关断阶段的工作过程,推导了输出电压与占空比的关系式Vo=-D/(1-D)*Vi,并分析了不同占空比下的工作模式(降压、升压)。通过Multisim仿真验证了理论分析,当D=25%时输出降压至1.6V,D=60%时输出升压至7.5V。电路具有升降压灵活、极性反转、效率高等特点,适用

XU157303764的博客 1436

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

【learnOpenGL学习笔记_17】OpenGL高级教程 - 模板测试原理与实践

今天继续学习OpenGL高级部分 - 模版测试原理与使用。

同学小张的博客 862

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

LearnOpenGL学习(高级OpenGL -- 深度测试,模板测试,环绕顺序)

用来防止被阻挡的面渲染到其他面的前面,深度缓冲就像颜色缓冲,在每个片段中储存了信息,当深度测试(Depth Testing)被启用的时候,OpenGL会将一个片段的深度值与深度缓冲的内容进行对比。OpenGL会执行一个深度测试,如果这个测试通过了的话,深度缓冲将会更新为新的深度值。如果深度测试失败了,片段将会被丢弃。深度缓冲运行在是GLSL内建变量,它是一个vec3,x和y分量代表了片段的屏幕坐标(左下角为原点),z分量为片段的深度值。

zaizai1007的博客 1200

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

LearnOpenGL学习笔记—高级OpenGL 01:深度测试

LearnOpenGL学习笔记—高级OpenGL:深度测试1 深度测试1.1 知识回顾1.2 代码实现 1 深度测试 1.1 知识回顾 本节对应官网学习内容:深度测试 我们之前其实已经在 坐标系统 这节开启了并使用了深度测试 并在games101的 光栅化 那一课也学习了Z缓冲的知识 我们接着做一点补充: 我们之前运用了深度缓冲(Depth Buffer)来防止被阻挡的面渲染到其它面的前面。 当深度测试(Depth Testing)被启用的时候,OpenGL会将一个片段的的深度值与深度缓冲的内容进行对比。

清清!的博客 2503

LearnOpenGL(十六)之模板测试

LearnOpenGL(十六)之模板测试

ckg3824278的博客 1084

LearnOpenGL-深度测试与模板测试

它会与将要写入缓冲的模板值进行与(AND)运算。默认情况下设置的位掩码0xFF所有位都为1,不影响输出,但如果我们将它设置为0x00,写入缓冲的所有模板值最后都会变成0.这与深度测试中的glDepthMask(GL_FALSE)是等价的。深度缓冲包含了一个介于0.0和1.0之间的深度值,观察空间的z值可能是投影平截头体的近平面(Near)和远平面(Far)之间的任何值。深度缓冲像颜色缓冲一样,在每个片段中存储了信息,并且有一样的宽度高度,都是由窗口自动创建的,在大部分系统中,深度缓冲的精度都是24位。

weixin_70073176的博客 1247

LearnOpenGL13——模板测试

转载自 https://editor.youkuaiyun.com/md?not_checkout=1&articleId=113837266 https://learnopengl-cn.github.io/04%20Advanced%20OpenGL/02%20Stencil%20testing/ 需要模板测试的原因 在上节中,讲了深度测试,即 判断一个像素点是否能通过深度检测,显示到屏幕上,但是在实际开发中,我们可能遇到很多需求,希望实现不是通过深度关系进行遮挡的,比如游戏里常见的透视效果,可以看到一个物

白小飞 302

LearnOpenGL-高级OpenGL-2.模板测试

同深度测试一样有一个模板缓冲区,可以存储值,0-255值 。想象喷油漆时使用的**图案模板**,先把模板贴在汽车上或者其他什么地方,然后开始喷油漆。在模板镂空的地方会有油漆喷到汽车上,而没有镂空的地方会挡住油漆。在喷完之后,揭下模板,图案就喷涂在汽车上了

qq_34060370的博客 754

(自用)learnOpenGL学习总结-高级OpenGL-模板测试

可以想象一个场景,在之前的模板缓冲中,有箱子的地方都为1,其他都是0.然后现在画一个大一点的箱子上去。有1的地方就不画了,只在不为1的地方画,也就是边框之外的地方。思路很简单,这个过程将每个物体的片段的模板缓冲设置为1,当我们想要绘制边框的时候,我们主要绘制放大版本的物体中模板测试通过的部分,也就是物体的边框的位置。最后一个gl_replace,表示当深度和模板测试都通过的时候,那么我们希望将储存的模板值设置为参考值,参考值能够通过glStencilFunc来设置,我们之后会设置为1。

SHIgaNatsuki的博客 1291

learnOpenGL 4.2 模板测试

除了深度测试,OpenGL还有一种较为自由的测试,称为模板测试stencil。 模板函数 首先,和深度测试一样,我们要先启用它,同时需要在渲染循环中清除它的缓存 glEnable(GL_STENCIL_TEST); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); 除此以外,我们还可以使用以下函数开启和禁用模板值的写入 glStencilMask(0xFF); // 每一位写入模板缓冲时都保持原样 gl

qq_43533956的博客 267

LearnOpenGL——高级OpenGL(二)模板测试

本文介绍了OpenGL中的模板测试机制及其应用。模板测试通过模板缓冲来决定是否保留或丢弃片段,每个像素的模板值通常为8位,提供256种可能值。文章详细讲解了模板缓冲的操作步骤:启用写入、更新缓冲、禁用写入、根据缓冲内容渲染物体。重点演示了物体轮廓效果的实现方法:先正常绘制物体并更新模板值,然后禁用写入并放大绘制,仅保留原物体边缘部分。文中还介绍了glStencilFunc和glStencilOp等关键函数的使用方法,以及如何通过模板掩码控制写入权限。这种技术可以创造出各种有趣的渲染效果,如游戏中的选中高亮提

QQ805009795的博客 609

OpenGL学习——19.模板测试

其中一个强大的功能是模板测试(Stencil Testing),它允许我们根据模板缓冲区中的值来控制像素的绘制和渲染。我们还将讨论不同的模板测试函数和它们的应用场景,以及如何结合模板缓冲区与其他OpenGL功能来实现更复杂的效果。您的经验和见解将为其他读者提供宝贵的学习资源。通过深入理解模板测试的原理和使用方法,您将能够更加灵活地控制像素的绘制和渲染,为您的OpenGL应用程序增添更多的视觉魅力和交互性。我期待与您的互动,共同探索OpenGL模板测试的奥秘,以及如何将其应用于您的图形应用程序中。

用于记录学习的博客 1858
上一篇: LearnOpenGL学习笔记——深度测试
下一篇: LearnOpenGL学习笔记——混合
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值