OpenGL学习日记-2014.1.21--混合

OpenGL高级OpenGL篇--混合-20 参考:这里 这一节主要讲混合。 AlphaTest和正常的渲染一样,只需在片元shader中判断alpha和给定的阈值大小来discard片元。 Blend步骤会多一些: 首先要开启混合:glEnable(GL_BLEND); 设置混合方程:glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 或者单独设置Alpha:glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ZER 阅读详情
 混合可以实现很多效果,笔记单纯的记录混合的原理,和混合公式,混合函数的使用。最后分析书中的两个混合代码例子,两个例子结合起来说明了绘图顺序对混合最终效果的影响,及如何去规避这样的问题。在颜色中之前一直忽略的第四个分量alpha终于派上用场。在启用混合情况下,alpha常常用于把被处理片断的颜色值与已经存在帧缓冲区的像素颜色值进行组合。混合操作是在场景进行了光栅化并转换为像素之后,但是在最终的像素绘制到帧缓冲区之前进行。
一、源(新片断)因子和目标(旧片断)因子
    在混合过程中,新旧片断的组合分两步进行。首先,需要如何计算源和目标混合因子(混合因子)。这两个因子都是RGBA四元组,分别与源颜色和目标颜色的RGBA相乘。然后两个RGBA四元组对应成分再进行组合(混合公式)。最终的RGBA颜色是通过下面的公式得出:
    (Rs*Sr +Rd*Dr, Gs*Sg + Gd*Dg, Bs*Sb + Bd*Db, As*Sa + Ad*Da )
     源颜色(Rs, Bs, Gs, As)、目标颜色(Rd, Gd, Bd, Ad)、源混合因子(Sr, Sg, Sb, Sa)、目标混合因子(Dr, Dg, Db, Da)
常量
RGB混合因子
alpha混合因子
GL_ZERO
(0,0,0)
0
GL_ONE
(1,1,1)
1
GL_SRC_COLOR
(Rs,Gs,Bs)
As
GL_ONE_MINUS_SRC_COLOR
(1,1,1)-(Rs,Gs,Bs)
1-As
GL_DST_COLOR
(Rd,Gd,Bd)
Ad
GL_ONE_MINUS_DST_COLOR
(1,1,1)-(Rd,Gd,Bd)
1-Ad
GL_SRC_ALPHA
(As,As,As)
As
GL_ONE_MINUS_SRC_ALPHA
(1,1,1)-(As,As,As)
1-As
GL_DST_ALPHA
(Ad,Ad,AD)
Ad
GL_ONE_MINUS_DST_ALPHA
(1,1,1)-(Ad,Ad,Ad)
1-Ad
GL_CONSTANT_COLOR
(Rc,Gc,Bc)
Ac
GL_ONE_MINUS_CONSTANT_COLOR
(1,1,1)-(Rc,Gc,Bc)
1-Ac
GL_CONSTANT_ALPHA
(Ac,Ac,Ac)
Ac
GL_ONE_MINUS_CONSTANT_ALPHA
(1,1,1)-(Ac,Ac,Ac)
Ac
GL_SRC_ALPHA_SATURATE
(f,f,f)=min(As,1-Ad)
1







要指定混合因子可能需要用到:1、glBlendFunc( GLenum srcfactor, GLenum destfactor ),指定源和目标混合因子,RGB和ALPHA使用同一因子。2、glBlendFuncSeparate(GLenum srcRGB, GLenum destRGB, GLenum srcAlpha, GLenum destAlpha),如参数所示,分开指定RGB混合因子,和Alpha混合因子,允许使用不一样的值。
二、设置混合方程式
    在指定了混合方程式之后,还需要确定,源混合因子和目标混合因子如何结合(这就是混合方程式)。使用函数 void glBlendEquation( GLenum mode ) 或 void glBlendEquationSeparate( GLenum modeRGB, GLenum modeAlpha) 进行设定,与混合因子的设置类似,两个*Separate()函数允许Alpha采取与RGB不同的混合方程式。
混合模式参数
数学操作

GL_FUNC_ADD(默认)
Cs*S+Cd*D
GL_FUNC_SUBTRACT
Cs*S-Cd*D
GL_FUNC_REVERSE_SUBTRACT
Cd*D-Cs*S
GL_MIN
min(Cs*S,Cd*D)
GL_MAX
max(Cs*S,Cd*D)
GL_LOGIC_OP
Cs op Cd

最后当然还有的是要启用混合:glEnable(GL_BLEND)

三、例子分析
例子1:绘制了练个不同颜色的三角形,通过输入个改变练个三角形的绘图顺序来了解图元的绘制顺序对于混合的最终效果的影响。
#include "alpha.h"
#include "CLApp.h"
static int leftFirst = GL_TRUE;


void alphaInit()
{
	glEnable( GL_BLEND );
	glDisable( GL_DEPTH );
	glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
	glShadeModel( GL_FLAT );
	glClearColor( 0.0, 0.0, 0.0, 0.0 );
}

void alphaDrawLeftTriangle()
{
	//黄色三角形
	glBegin( GL_TRIANGLES );
	glColor4f(1.0, 1.0, 0.0, 0.75);
	glVertex3f( 1, 9, 0.0 );
	glVertex3f( 1, 1, 0.0 );
	glVertex3f( 7, 5, 0.0 );
	glEnd();
}

void alphaDrawRightTriangle()
{
	//
	glBegin( GL_TRIANGLES );
	glColor4f( 0.0, 1.0, 1.0, 0.25 );
	glVertex3f(9, 9,0.0);
	glVertex3f(3, 5, 0.0);
	glVertex3f(9, 1,0.0);
	glEnd();
}

void alphaDisplay()
{
	glClear( GL_COLOR_BUFFER_BIT );
	if (leftFirst)
	{
		alphaDrawLeftTriangle();
		alphaDrawRightTriangle();
	}
	else
	{
		alphaDrawRightTriangle();
		alphaDrawLeftTriangle();
	}

}

void alphaUpdate(float dt)
{
	CLInput* pInput = theAppInstance->getInputInstance();
	if (pInput->IsKeyUp(DIK_T))
	{
		leftFirst = !leftFirst;
	}
}

程序按T来切换绘制顺序:

首先绘制的是黄色的三角形,然后绘制通明度比较高的蓝色三角形,可以看出即使蓝色三角形通明度低,但在最终的颜色影响上还是比目标颜色黄色来的大。

在切换了绘制顺序之后,最终颜色基本是黄色了。这个例子只是说明了绘制顺序会极大影响最终的混合效果。
其实不难理解的是,在本例子中因为我们的目标和源混合因子在切换了绘制顺序时并没有随之调换。根据回合因子的设置,可以得到源混合因子总是0.75,目标混合因子总是0.25.所以后绘制的图元总是对最终的颜色产生较大的影响。

例子2:如何在解决3d场景了的混合问题:深度缓冲区。
当在3维场景中存在半透明和不透明物体时,问题就来了。如果只有不透明物体,假如一个物体被另外一个物体遮挡,我们不需要考虑的把被遮挡的物体剔除。但如果挡在前面的是个半透明物体时,事实上我们不应该去剔除这个物体,而更为复杂的是,这些物体有可能是运动的,这样我们就无法单一的指定绘制顺序去解决这样的问题。在此的解决方案是深度缓冲区:先去绘制不透明物体,这是深度缓冲区可读写;然后再绘制半透明物体时把深度缓冲区设为只读,这是已经在深度缓冲区的片元将不会被剔除,而是与新的片元进行混合。
#include "alpha3D.h"

#define MAXZ 8.0
#define MINZ -8.0
#define ZINC 0.4

static float solidz = MAXZ;
static float transparentz = MINZ;
static GLuint sphereList, cubeList;

void alpha3DInit()
{
	GLfloat mat_specular[] = {1.0, 1.0, 1.0, 0.15 };
	GLfloat mat_shininess[] = {100.0};
	GLfloat position[] = {5, 5, 10.0, 0.0 };
	glLoadIdentity();
	gluLookAt(0.0, 0.0, -30.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
	glMaterialfv( GL_FRONT, GL_SPECULAR, mat_specular );
	glMaterialfv( GL_FRONT, GL_SHININESS, mat_shininess );
	glMaterialfv( GL_LIGHT0, GL_POSITION, position );

	glEnable( GL_LIGHTING );
	glEnable( GL_LIGHT0 );
	glEnable( GL_DEPTH_TEST );

	sphereList = glGenLists(1); 
	
	glNewList( sphereList, GL_COMPILE );
		GLUquadricObj* qobj = gluNewQuadric(); //二次曲面对象
		gluSphere(qobj, 3.0, 16, 16);
		gluDeleteQuadric(qobj);
	glEndList();
	cubeList = glGenLists(1);
	glNewList( cubeList, GL_COMPILE );
		GLUquadricObj* qobj1 = gluNewQuadric(); //二次曲面对象
		//gluDisk(qobj1, 2.0, 5.0, 15.0, 10.0);
		gluQuadricDrawStyle(qobj1, GLU_FILL);
		gluCylinder(qobj1, 1, 4, 3, 15, 10);
		gluDeleteQuadric(qobj1);
	glEndList();

	
}

void alpha3DDisplay()
{
	GLfloat mat_solid[] = {0.75, 0.75, 0.0, 1.0 };
	GLfloat mat_zero[] = {0.0, 0.0, 0.0, 1.0};
	GLfloat mat_transparent[] = {0.0, 0.8, 0.8, 0.6 };
	GLfloat mat_emission[] = {0.0, 0.3, 0.3, 0.6 };

	glClear( GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT );

	glPushMatrix();
		glTranslatef( 5, 0, solidz );
		glMaterialfv( GL_FRONT, GL_EMISSION, mat_zero );
		glCallList( sphereList );
	glPopMatrix();

	glPushMatrix();
		glTranslatef( 5, 0, transparentz );
		glRotatef( 15.0, 1.0, 1.0, 0.0 );
		glRotatef( 30.0, 0.0, 1.0, 0.0 );
		glMaterialfv( GL_FRONT, GL_EMISSION, mat_emission );
		glMaterialfv( GL_FRONT, GL_DIFFUSE, mat_transparent );
		glEnable( GL_BLEND );
		glDepthMask( GL_FALSE );
		glBlendFunc( GL_SRC_ALPHA, GL_ONE );
		glCallList( cubeList );
		glDepthMask(GL_TRUE );
		glDisable( GL_BLEND );
	glPopMatrix();
}

void alpha3DUpdate(float delta)
{
	static bool ani = false;
	static int tTime = 0;
	if (solidz <= MINZ || transparentz >= MAXZ)
	{
		ani = false;
	}

	if ( ani  )
	{
		tTime += delta;
		if (tTime > 100)
		{
			solidz -= ZINC;
			transparentz += ZINC;
			tTime = 0;
		}
	}

	CLInput* pInput = theAppInstance->getInputInstance();
	if (pInput->IsKeyUp(DIK_A))
	{
		ani = true;
	}
	else if (pInput->IsKeyUp(DIK_R))
	{
		solidz = MAXZ;
		transparentz = MINZ;
	}
}



观察两个图元重合的地方。第一幅图是半透明物体在前,第二幅是半透明物体基本被不透明的球体挡住。
告别代码恐惧!用KRobot图形化编程,10分钟搞定Arduino巡线小车(附完整接线图) 本文介绍如何使用KRobot图形化编程工具快速搭建Arduino巡线小车,无需编写代码。从硬件准备到逻辑构建,详细讲解传感器数据处理、电机控制优化及高级功能扩展,帮助教育工作者和创客爱好者10分钟内完成项目。 阅读详情

相关推荐

ROS Noetic + Realsense ROS 2.3.2 在鲁班猫4上的完整工作空间搭建与相机启动调试

本文详细介绍了在鲁班猫4(RK3588S)开发板上搭建ROS Noetic与Realsense ROS 2.3.2开发环境的完整流程,包括Realsense SDK安装、工作空间配置、D435i深度相机驱动调试等关键步骤,为机器人视觉系统开发提供实用指南。

weixin_33217202的博客 234

基于OpenGL实现PS部分混合模式

全网首发!基于带透明度的图片实现 PS 混合模式算法改进

weixin_42407126的博客 5170

T100服务端接口实战:从注册到日志排查的全链路开发指南

本文提供了一份T100服务端接口开发的全链路实战指南。从程序注册与框架签出开始,详细讲解了接口的数据结构设计、核心业务逻辑编写,到最终的部署上线与调用验证。文章重点分享了如何利用日志文件高效定位和排查接口问题,帮助开发者快速掌握T100接口开发的关键步骤与实用技巧。

weixin_28831399的博客 296

《OpenGL编程指南》第九版——2.绘制两个三角形

我将跟随OpenGL编程指南对每个例子进行详解,每个例子将贴出实验结果和实验代码,仅供参考,代码部分可能我会进行一些修改与官方代码不同。 实现效果: TwoTriangles.PNG 1.Main函数 1.glfwInit初始化GLFW库 2.glfwCreateWindow设置程序所使用的窗口类型以及期望的窗口尺寸。还创建了一个与窗口关联...

祝你万事顺利的博客 851

AU混响终极指南:从‘干声’到‘空间感’,用总音轨和发送技巧打造专业人声

本文详细介绍了如何在Adobe Audition(AU)中使用混响效果器,通过总音轨和发送技巧将‘干声’转化为具有专业‘空间感’的人声。从混响基础原理到总线架构设置,再到精细控制和自动化调整,全面解析了提升音频质量的实用技巧,适用于音乐制作、播客和内容创作。

weixin_30512089的博客 331

如何利用通达信进行选股集合操作

每个交易者实际上都有自己的选股策略,这是必然的,也会有自己的主观干预,但是还是需要从客观热点股票进行一个比对的,才能说主观和客观相结合不至于​偏离方向。 这几天我也发了节前最后一天我的选股策略盘中的选择结果, 我也从网上拿到了热点股票池,当拿到之后你会发现如何从几十个股票热点股票选出核心票,这就是个问题了,这里面一定要通过股价涨跌幅来进行过滤,而不是通过指标,因为一切指标都是根据价格变化而改变的了,所以​这一步不要走弯路。 1、把拿到的热点股票名单,导入通达信自定义板块 2、删除

抢财猫股票课堂 2581

OpenGL学习总结(六)

高级OpenGL总结(一)一、深度测试OpenGL在进行投影矩阵变换之后,我们知道所有的三维点都会投影到同一个平面上,那么势必会有一个问题出现——在三维空间中的N个点会落到投影平面上的同一位置,那么OpenGL绘制图像的时候就往往会出现需要显示的顶点被不需要现实的顶点遮盖,为了解决这一问题,OpenGL使用了深度测试。OpenGL开启深度测试后,会开辟一个深度缓冲区,当要绘制一个顶点的时候,会将该顶

xiewenzhao123的博客 1235

矢量网络分析仪校准:原理、方法与系统适配性

矢量网络分析仪(VNA)校准是射频测量的关键环节,通过误差建模(12项误差项)和标准件测量,可将系统不确定度从±5dB降至±0.1dB以下。主流校准方法包括SOLT(适用于同轴系统)和TRL(适用于波导系统),二者在标准件、误差重点及频率上限等方面存在显著差异。随着6G与量子通信的发展,动态实时校准将成为新趋势。工程师需根据传输结构、频率范围及精度需求选择合适方法,确保测量精度。

u014344410的博客 262

OpenGL学习笔记(十二)

OpenGL 高级篇(三)

weixin_42050609的博客 2207

CarSim仿真快速入门(十八)-CarSim2021中的混合动力和纯电动系统

CarSim和TruckSim包括用于电动汽车(BEV)和混合电动汽车(HEV)的动力总成系统。电动和混合电动系统可与所有现有驱动系统配合使用,例如:FWD,RWD,AWD和多轴驱动系统。混合动力/电动系统模型还包括电池管理控制。CarSim或TruckSim中的默认动力总成是为闭环速度控制器提供的备用动力总成。要安装和使用完整的动力总成,请从Vehicle: Assembly库或Vehicle: Lead Unit 库链接到Powertrain数据集。在“动力总成”界面上,从下拉列表控件中选择以下三个选项

小明师兄的博客 7453

在isaacsim仿真系统进行遥操作(设备是quest3):怎么让遥操作设备(quest3)在Isaac sim系统中控制机械臂并把其中的参数传输出来??

我长期专注 Python 爬虫工程化实战,主理专栏 👉 《Python爬虫实战》:从采集策略到反爬对抗,从数据清洗到分布式调度,持续输出可复用的方法论与可落地案例。内容主打一个“能跑、能用、能扩展”,让数据价值真正做到——抓得到、洗得净、用得上。

**My Coding Family** 936

Android OpenGLES2.0(十八)——轻松搞定Blend颜色混合

Blend是OpenGL中的一个非常重要的部分,它可以让每个输出的源和目的颜色以多种方式组合在一起,以呈现出不同的效果,满足不同的需求。

偶尔记录的一些学习笔记 1万+

ardupilot 方向余弦矩阵/旋转矩阵的理解

本节主要记录自己对ardupilot中用到的方向余弦矩阵/旋转矩阵的理解,欢迎批评指正,有些资料参考网上写的比较好的资料,免得查找资料麻烦。旋转矩阵的坐标理解:表示从旋转矩阵的下标的坐标系的坐标变换到上标表示的坐标系坐标下。旋转矩阵的坐标系理解:表示从旋转矩阵的上标的坐标系变换到下标表示的坐标系下。从旋转矩阵的投影更好理解,比如下面旋转矩阵的第一行是左边坐标系的第一维分量在右边坐标系的投影。

陌城烟雨 612

OpenGL 记录 -- 关于“混合”渲染

关于Opengl的混合

wqwtan的专栏 647

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

OPENG 获取状态的一些枚举值

oid glGetBooleanv( GLenum pname, GLboolean * params);void glGetFloatv( GLenum pname, GLfloat * params);void glGetIntegerv( GLenum pname, GLint * params);另附上Windows MSDN的opengl比较全的文档说明:纹理状态变量 - Win32 apps | Microsoft DocsGL_ACTIVE_TE

whl0071的专栏 465

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

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

OpenGL学习之混合——Blending

什么是混合? 混合(Blending)在词意思上可以理解为将两种或两种以上的颜色进行组合形成一种新的颜色。在OpenGL中,混合常用来做透明处理,但是这不是混合唯一的用处,还可以去做其他的特效。物体的透明处理一般是前面物体和后面物体颜色的一种混合,形成最终人眼睛看到的颜色,如通过有色玻璃看到的物体颜色就是玻璃的颜色和物体混合后最终的效果。(图片来源) 混合功能是打开时,在处理过程中,先向颜色缓

u011371324的专栏 3297

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

GLES2.0中文API-glGet

名称 glGet - 返回所选参数的值 C规范 void glGetBooleanv(    GLenum pname,      GLboolean * params); void glGetFloatv(    GLenum pname,      GLfloat * params); void glGetIntegerv(    GLenum pname,      GLint *...

flycatdeng的专栏 3316

OPENGL该如何用混合模式

wter26的专栏 795

深入HAL库中断处理:以HAL_SPI_Receive_IT为例,剖析STM32 SPI‘后台配置,前台响应’的设计模式

本文深入解析了HAL库中断处理机制,以HAL_SPI_Receive_IT为例详细剖析了STM32 SPI的'后台配置,前台响应'设计模式。通过分析状态机、句柄结构和回调函数机制,揭示了HAL库中断模型的核心架构,并提供了SPI中断接收的完整执行流程和优化策略,帮助开发者编写高效可靠的中断驱动代码。

weixin_30263277的博客 384

opengl 实体和网格绘图函数(基础)

GLUT工具箱提供几种图形3维图形的函数: void glutWireSphere(GLdouble radius, GLint slices, GLint stacks);  丝状球 void glutSolidSphere(GLdouble radius, GLint slices, GLint stacks); 实心球void glutWireCube(GLdouble size);

he_wen_jian的专栏 1万+

OpenGL入门第六课-- 裁剪和混合

裁剪 前面两节分别说到了深度测试和正背面剔除,这两种技能都是OpenGL中常用的提高渲染性能的方式;裁剪也是一种提高渲染性的方式. OpenGL允许只刷新屏幕上发⽣变化的部分,可以在要进行渲染的窗⼝去指定⼀个裁剪框.在这个裁剪框里去渲染你需要的画面。 其基本原理是在渲染时限制绘制区域,通过此技术可以再屏幕(帧缓冲)指定⼀个矩形区域。然后启...

weixin_34344677的博客 432

opengl SwapBuffers的等待,虚伪的FPS

转自:http://www.zwqxin.com/archives/opengl/swapbuffers-fps-vsync.html   FPS在实时渲染中扮演着一个重要的角色,也许你会去笑一个不懂FPS是什么的游戏新手,但也许,这只是五十步笑一百步罢了。你能读懂SwapBuffers的深情等待吗?——ZwqXin.com 本文来源于 ZwqXin (http://www.zwqxin.c

smilestone322的专栏 7427

深入了解OpenGL——颜色混合

大家好。这一讲,我们讲介绍OpenGL的颜色混合模式。其实颜色混合用到的场合很多,比如多张图片的合成,动画游戏中的一些画面特效等都可以通过颜色混合进行实现。最常用的混合方式就是实现物体与背景的半透明效果。另外,在制作2D游戏时颜色混合可以用来通过制作目标物体的蒙板实现移动。通过蒙板来消除旧位置的物体对象可以不必重绘当前整帧内容,而仅仅是发生变化的那些物体。为了各位从事iPhone开发的考虑。后面的

1万+

[WebGL入门]三十,混合系数

混色是将颜色和颜色混合处理的总称,在WebGL中主要是指源颜色和目标颜色这两种颜色的混合。源颜色是即将要绘制的颜色,目标颜色是已经绘制的颜色,源颜色如何处理,目标颜色如何处理,这些都可以单独进行设置。颜色如何处理是由混合系数决定的,混合系数有很多种,不同的组合绘制的结果也会有很大不同。根据自己的创意,可以实现透明处理,加算合成,反转合成等各种各样的合成处理。 这次,来更进一步详细说说混合系数。而这回的demo,也会将这些混合系数做成可调整的形式,大家可以试一下各种混合系数的组合。

lufy小屋 4202

OpenGL混合

前面我们讲深度测试的时候说过,深度值的会把深度值小的覆盖住

jk823394954的专栏 847

OpenGL混合模式

混合是什么呢?混合就是把两种颜色混在一起。具体一点,就是把某一像素位置原来的颜色和将要画上去的颜色,通过某种方式混在一起,从而实现特殊的效果。 假设我们需要绘制这样一个场景:透过红色的玻璃去看绿色的物体,那么可以先绘制绿色的物体,再绘制红色玻璃。在绘制红色玻璃的时候,利用“混合”功能,把将要绘制上去的红色和原来的绿色进行混合,于是得到一种新的颜色,看上去就好像玻璃是半透明的。 要使用OpenG

风流海的专栏 3569
上一篇: OpenGL学习日记-2014.12.21--光照
下一篇: OpenGL学习日记-2015.3.5——Hello glsl(着色器)
CoderLing
博客等级 码龄15年 40粉丝 38原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值