android平台下OpenGL ES 3.0着色语言基础知识(上)

OpenGL ES入门指南(一) 想学OpenGL?想在手机端上实现酷炫效果?那还不快来了解OpenGL ES 阅读详情

OpenGL ES 3.0学习实践

本篇整理自《OpenGL ES 3.0 编程指南第2版》

着色器版本规范

OpenGL ES 3.0 顶点着色器和片段着色器的第1行总是声明着色器版本。声明着色器版本通知着色器编译器预期在着色器中出现的语法和结构。编译器按照声明的着色语言版本检查着色器语法。采用如下语法声明着色器使用OpenGL ES着色语言3.00版本:

#version 300 es

没有声明版本号的着色器被认定为使用OpenGL ES着色语言的1.00版本。着色语言的1.00版本用于OpenGLES2.0。对于OpenGLES3.0,作者决定匹配API和着色语言的版本号,这就是版本号从1.00跳到3.00的原因。

变量和变量类型

在计算机图形中,两个基本数据类型组成了变换的基础:向量和矩阵。这两种数据类型 在OpenGLES着色语言中也是核心。

OpenGLES着色语言中的数据类型

变置分类类 型描 述
标量float,int,uint,bool用于浮点、整数、无符号整数和布尔值的基于标标量的数据类型
浮点向量float,vec2,vec3,vec4有1、2、3、4个分量的基于浮点的向量类型
整数向量int,ivec2,ivec3,ivec4有1、2、3、4个分量的基于整数的向量类型
无符号整数向量uint,uvec2,uvec3,uvec4有1、2、3、4个分量的基于无符号整数的向量类型
布尔向量bool,bvec2,bvec3,bvec4,有1、2.3、4个分量的基于布尔的向量类型
矩阵mat2(或mat2x2),mat2x3,2x2,2x3,2x4,3x2,3x3,3x4,4x2,4x3mat2x4,mat3x2, mat3(或mat3x3),mat3x4,mat4x2,mat4x3,mat4(或mat4x4)

着色语言中的变量必须以某个类型声明。例如,下面的声明描述如何声明一个标量、一 个向量和一个矩阵:

vec4 vPosition;
mat4 mMatirx;
vec2 vOffset;

变量可以在声明时或者声明以后初始化。初始化通过使用构造器进行,构造器也用于类
型转换。

变量构造器

OpenGLES着色语言在类型转换方面有非常严格的规则。也就是说变量只能陚值为相同类型的其他变量或者与相同类型的变量进行运算。

来看看如何使用构造器初始化和转换标量值。

float myFloat = 1.0;
float myFloat2 = 1; //ERROR: 整数类型转换浮点类型错误
bool myBool = true;
int mylnt = 0;
int mylnt2 = 0.0; // ERROR: 浮点类型转换整数类型错误
myFloat =	float(myBool);	//	布尔值转换为浮点型
myFloat =	float(mylnt);	//	整型转换为浮点型
myBool =	bool(mylnt);	//	整型转换为布尔值

构造器可以用于转换和初始化向量数据类型。向量构造器的参数将被转换为与被构造的向量相同的基本类型(float、int或bool)。向量构造器的参数传递有两种基本方法:

  • 如果只为向量构造器提供一个标量参数,则该值用于设置向量的所有值。
  • 如果提供了多个标量或者向量参数,则向量的值从左到右使用这些参数设置。如果提供了多个标量参数,那么在向量中必须有至少和参数中一样多的分量。

构造向量的例子:

vec4 myVec4 = vec4(1.0);	// myVec4 = {l.0, 1.0, 1.0, 1.0}
vec3 myVec3 = vec3(1.0,0.0,0.5);// myVec3 = {1.0, 0.0, 0.5}
vec3 temp = vec3(myVec3); // temp = myVec3
vec2 myVec2 = vec2(myVec3); // myVec2 = {myVec3.x,myVec3.y}
myVec4 = vec4(myVec2, temp); //myVec4 » {myVec2.x,myVec2.y,temp.x,temp.y}

下面是构造矩阵的一些基本规则:

  • 如果只为矩阵构造器提供一个标量参数,则该值被放在矩阵的对角线上。例如:mat4(1.0)将创建一个4 x 4的单位矩阵。
  • 矩阵可以从多个向量参数构造。例如: mat2可以从两个vec2构造。
  • 矩阵可以从多个标量参数构造一每个参数代表矩阵中的一个值,从左到右使用。矩阵的构造比刚才说明的基本规则更灵活,只要在矩阵初始化时提供足够多的分量,矩阵基本上可以从任何标量和向量的组合构造。OpenGLES中的矩阵以列优先顺序存储。使用矩阵构造器时,参数按列填充矩阵。
mat3 myMat3 = mat3(1.0, 0.0, 0.0,	 //第一列
                   0.0, 1.0, 0.0,	 //第二列
                   0.0, 1.0, 1.0);//第三列
向量和矩阵分量

向量的单独分量可以用两种方式访问:

使用'.'运算符或者通过数组下标。根据组成向量的分量数,每个分量可以通过使用{x,y,z,w}、{r,g,b,a}或者{s,t,p,q}组合访问。3种不同命名方案的原因是向量可以互换地用于表示数学上的向量、颜色和纹理坐标。

使用运算符时,可以在操作中重新排列向量的分量:

vec3 myVec3 = vec3(0.0, 1.0, 2.0);	// myVec3 = {0.0, 1.0, 2.0}
vec3 temp;
temp	=	myVec3.xyz;	//	temp	=	{0.0,	1.0,   2.0}
temp	=	myVec3.xxx;	//	temp	=   {0.0,	0.0,   0.0}
temp	=	myVec3.zyx;	//	temp	=	{2.0,	1.0,   0.0}

除了'.'运算符之外,向量还可以使用数组下标"[]"运算符访问。在数组下标中,元素[0]对应于x,元索[1]对应于y,等等。
矩阵被看成由一些向量组成。例如:mat2可以看作两个vec2,mat3可以看作3个vec3,等等。
对于矩阵,单独的列可以用数组下标运算符"[]"选择,然后每个向量可以通过向量访问行为来访问。

mat4 myMat4 = mat4(1.0);	// 将对角线初始化为1.0
vec4 myVec4 = myMat4[0]; // 从矩阵中获取myVec4向量
float m1_1 = myMat4[1][1]; // 在矩阵中获取 [1][1]处的元素
float m2_2 = myMat4[2][2]; // 在矩阵中获取 [2][2]处的元素
常量

可以将任何基本类型声明为常数变量。常数变量是着色器中不变的值。声明常量时,在声明中加入const限定符。常数必须在声明时初始化。

const float zero = 0.0;
const float pi = 3.14159;
const vec4 red = vec4(0.0, 0.0, 1.0);
const mat4 identity = mat4(1.0);

正如在C或者C++中那样,声明为const的变量是只读的,不能在源代码中修改。

结构

除了使用语言中提供的基本类型之外,还可以和c语言一样将变量聚合成结构。 OpenGL ES着色语言中声明结构的语法如下例所示:

struct fogStruct
{
vec4 color;
float start;
float end;
} fogVar;

上述定义的是一个名为fogStruct的新结构类型和一个新变量fogVar。
结构可以用构造器初始化。在定义新的结构类型之后,也用与类型相同的名称定义一个新的结构构造器。结构中的类型和构造器中的类型必须是一对一的。

struct fogStruct
{
vec4 color;
float start;
float end;
} fogVar;

//构造初始化
fogVar = fogStruct(vec4(0.0, 1.0, 0.0, 0.0), //初始化颜色
                   0.5, //初始化 start
                   2.0); //初始化end
数组

数组的语法与C语言很相似,索引从0开始。数组可以用数组初始化构造器初始化

float a[4] = float[](1.0, 2.0, 3.0, 4.0);
float b[4] = float(4](1.0, 2.0, 3,0, 4.0);
vec2 c[2] = vec2[2](vec2(1.0), vec2(1.0));
函数

函数的声明方法和C语言中相同。如果函数在定义前使用,则必须提供原型声明。 OpenGLES着色语言函数和C语言函数的最明显的不同之处在于函数参数的传递方法。 OpenGLES着色语言提供特殊的限定符,定义函数是否可以修改可变参数。

OpenGL ES中也提供了很多内建函数。

限定符描述
in(没有指定时的默认限定符) 这个限定符指定参数按值传送,函数不能修改
inout这个限定符规定变量按照引用传入函数,如果该值被修改,它将在函数退出后变化
out这个限定符表示该变量的值不被传入函数,但在函数返冋时将被修改

注意:函数不能递归。GPU没有堆栈。

控制流语句

OpcnGL ES着色语言中的控制流语句的语法类似于C语言。

if(color.a < 0.25){
    color *= color.a;
}
else{
    color = vec4(0.0);
}

条件语句中测试的表达式求出的必须是一个布尔值。

参考
《OpenGL ES 3.0 编程指南第2版》

第一章 OpenGL ES 基础-屏幕、纹理、顶点坐标 GL_TRIANGLE_STRIP:指定要绘制的基本图元类型为三角形条带,即每三个顶点定义一个三角形,但从第三个顶点开始,每个新顶点都与前两个顶点一起构成一个新的三角形。坐标系 的 左下点(-1, -1),右下角(1,-1) , 左上角(-1, 1) , 右上角(1 , 1)坐标系 的 左下点 (0, 0),右下角(1 , 0) , 左上角(0, 1 ), 右上角(1, 1)0:指定了要渲染的顶点数组的起始索引,这里表示从顶点数组的第一个顶点开始。使用第二个顶点作为三角形条带的第二个顶点。 阅读详情

相关推荐

OPENGL es版本和OGL 及android关系

OpenGL ES 1.0 and 1.1 - This API specification is supported by Android 1.0 and higher. OpenGL ES 2.0 - This API specification is supported by Android 2.2 (API level 8) and higher. OpenGL ES 3.0 - Th

自由理想的足迹 5254

OpenGL ES2.0基础

初级学习OpenGL ES2.0的课程,从无到有,从进本的函数讲起,每一课时都附带一个例子程序。深入浅出的讲解可编程管线技术,令人费解的文理,以及混合技术,各种优化技术:顶点缓冲区,索引缓冲区,帧缓冲区,介绍精灵的使用,并使用shader制作粒子特效。

OpenGL ES for Android(几何着色器)

简介 几何着色器(Geometry Shader)是一个可选功能,他介于在顶点和片段着色器之间,接收一组顶点数据,可以对数据进行处理,而且可以根据数据生成不止一个图形,假如你想绘制四个顶点,按照以前的方式,需要for循环四次,每次都顶点数据进行处理,最后传入顶点着色器中。而集合着色器就做了这样一件事。在移动平台上,几何着色器需要OpenGL ES 3.2版本(android 7之上),同样的我们可以先参考文档或其他相关资料学习3.0新特性。 3.0变化 这里简单学习一下3.0和2.0比较重要的变化

1 731

OpenGL ES入门介绍

OpenGL(Open Graphics Library)是一个跨平台图像程序接口,用于二维和三位图片的渲染。OpenGL ES(Open Graphic Library Embedded Systems)是OpenGL的一个子集,用于手机和嵌入式设备在android中对OpenGL ES的支持如下1. OpenGL ES 2.0 支持android2.2以后的版本2. OpenGL ES 3.0 支持android4.3以后的版本。

WolfKingzyh的博客 1771

Android OpenGL ES 3.0兼容实战:如何优雅降级到2.0而不崩?

本文深入探讨了Android OpenGL ES 3.0到2.0的兼容方案,帮助开发者优雅处理设备兼容性问题。通过设备能力检测、双版本上下文管理、API兼容层设计等功能降级实现,确保应用在不同设备上稳定运行。文章还提供了实战调试技巧和常见崩溃场景处理方案,助力开发者构建健壮的图形应用。

lg888的博客 999

一文快速入门OpenGLES:现代移动GPU编程的第一步

OpenGL ES(OpenGL for Embedded Systems) 是一种免费的跨平台3D图形 API接口,其适用于低功耗设备,可用于嵌入式设备和移动设备(包括手机、车载大屏 和嵌入式电器终端设备)上渲染高效的 2D 、 3D 图形。 其由OpenGL(Open Graphics Library)针对嵌入式设备裁剪而来,去除了OpenGL中许多不是必须冗余特性,比如:GL_QUADS(四边形)、GL_POLYGONS(多边形)绘制模式、glBegin(开始)/glEnd(结束)等特性。 OpenG

bjxiaxueliang的CODING小栈 3903

android平台下OpenGL ES 3.0着色语言基础知识(下)

OpenGL ES 3.0学习实践 android平台下OpenGL ES 3.0从零开始 android平台下OpenGL ES 3.0绘制纯色背景 android平台下OpenGL ES 3.0绘制圆点、直线和三角形 android平台下OpenGL ES 3.0绘制彩色三角形 android平台下OpenGL ES 3.0从矩形中看矩阵和坐标系 android平台下OpenGL ES 3....

handy周 2285

OpenGL ES 3.0 开发(一):绘制一个三角形

该原创文章首发于微信公众号:字节流动 什么是 OpenGLES OpenGLES 全称 OpenGL for Embedded Systems ,是三维图形应用程序接口 OpenGL 的子集,本质上是一个跨编程语言、跨平台的编程接口规范,主要应用于嵌入式设备,如手机、平板等。由科纳斯(Khronos)组织定义和推广,科纳斯是一个图形软硬件行业协会,该协会主要关注图形和多媒体方面的开放标准。 O...

字节流动 8万+

android opengl 3.0,android平台下OpenGL ES 3.0从零开始

OpenGL ES 3.0学习实践android平台下OpenGL ES 3.0从零开始android平台下OpenGL ES 3.0绘制纯色背景android平台下OpenGL ES 3.0绘制圆点、直线和三角形android平台下OpenGL ES 3.0绘制彩色三角形android平台下OpenGL ES 3.0从矩形中看矩阵和正交投影android平台下OpenGL ES 3.0着色语言基...

weixin_35148943的博客 1244

Android平台OpenGL ES 2.0图形绘制实战详解

始终检查返回值:EGL 函数失败时不抛出异常,而是返回特殊值(如),需手动调用获取错误码。避免硬编码配置:应根据设备能力动态选择EGLConfig,必要时降级(如放弃 stencil buffer)以提升兼容性。内存泄漏防范:若中途失败,应调用和释放已分配资源。下面使用 Mermaid 流程图展示完整的 EGL 初始化流程:graph TDA[开始 EGL 初始化] --> B{eglGetDisplay 是否成功?

weixin_36204513的博客 860

STM32 SAI接口实战:用CubeMX快速配置多通道音频采集(附DMA优化技巧)

本文详细介绍了如何使用STM32的SAI接口通过CubeMX快速配置多通道音频采集系统,并提供了DMA双缓冲优化技巧。内容涵盖TDM模式配置、时钟同步、DMA优化及常见问题排查,帮助开发者高效实现高速数据采集应用。

weixin_42549037的博客 225

安卓进阶——OpenGL ES

本文系统介绍了OpenGL在2D和3D图形开发中的应用。2D部分重点阐述了OpenGL ES在Android平台的高性能优势、核心渲染管线(顶点处理、纹理映射、着色器编程)以及实现流程,包括GLSurfaceView配置和Renderer实现。3D部分深入讲解了坐标系转换、矩阵变换(MVP矩阵)、深度测试、光照模型等关键技术,并提供了3D场景渲染的实现框架。文章不仅覆盖了基础绘制方法,还介绍了纹理滤镜、粒子系统、帧缓冲等进阶技巧,为移动端图形开发提供了全面指导。通过系统学习这些内容,开发者可以实现...

Meteors.的博客 981

fMRI脑影像特征提取——静息态与任务态,ALFF/fALFF和ReHo(Dpabi,Rest1.8)

任务态和静息态是大脑的两种状态,前者主要是指大脑在执行记忆、识别以及运动等具体任务时的状态,静息态则是指大脑不执行具体认知任务、保持安静、放松、清醒时的状态,是大脑所处的各种复杂状态中最基础和最本质的状态。任务态fMRI分析有非常悠远的历史,而静息态fMRI自1995年biswal教授及其同事率先报告静息态fMRI具有生理意义后,越来越多的人进入了静息态的研究领域。任务态fMRI主流的分析方法是模型驱动(GLM+HRF),也可以引用静息态fMRI

意疏的学习笔记 6万+

LearnOpenGL - Android OpenGL ES 3.0 绘制纹理

在LearnOpenGL - Android OpenGL ES 3.0 绘制三角形中我们学会了如何在 Android 下搭建 GLES 环境,并绘制三角形。本文我们将讨论如何绘制纹理。本文代码在顶点着色器: 执行次数与顶点数量相同,每个顶点执行一次。片元着色器: 执行次数与片元(像素)数量相同,每个片元执行一次。因此,片元着色器的执行次数通常远多于顶点着色器的执行次数,因为片元数量通常大于顶点数量。具体执行次数取决于渲染的几何图形在屏幕上的覆盖范围。

记录学习的过程 1337

BGE-M3 文本情感分类实战:预训练模型微调,导出ONNX并测试

本文介绍了如何基于BGE-M3开源模型实现一个简单的二分类情感分析任务,展示了NLP中经典的“预训练 + 微调”范式。首先,加载预训练模型和分词器,并构建分类头整合到模型中。接着,进行数据预处理并构建DataLoader。然后,定义优化器、损失函数和训练循环,进行模型微调。微调过程中,可以选择基于[CLS] token的单特征提取或基于池化策略的多特征融合。最后,通过验证与推理评估模型性能,并导出ONNX模型以适应生产环境。BGE-M3在语义表征任务中表现优异,适合作为文本分类、语义搜索等下游任务的基础模型

大鹏的专栏 1404

自组织映射神经网络(SOM)

目录 1 背景:自组织(竞争型)神经网络 2竞争学习的概念与原理 2.1 竞争学习的步骤 2.2 示例 3SOM典型结构 4SOM网的权值调整域 5 SOM Kohonen 学习算法 6 SOM示例 7SOM设计细节 7.1输出层设计 7.2输出层节点排列的设计 7.3 权值初始化问题 7.4学习率的设计 7.5设计拓扑领域 8SOM功能分析 8.1 保序映射 8.2数据压缩 8.3 特征提取 9自组织映射神经网络与K均值算法的区别...

weixin_39910711的博客 1万+

OpenGL ES 3.0多平台开发指南:Windows、Linux、Android、iOS全平台构建

OpenGL ES 3.0是移动和嵌入式设备上高性能图形渲染的行业标准,本指南将带你掌握在Windows、Linux、Android和iOS四大平台上构建OpenGL ES 3.0应用的完整流程。通过GitHub加速计划提供的opengles3-book项目,你将获得丰富的示例代码和跨平台开发最佳实践,轻松开启全平台图形开发之旅。 ## 📋 项目结构解析:跨平台开发的基础 opengles3

gitblog_00163的博客 1140

某头部金融APP防护机制逆向实录:从反调试到TEE加密的全链路攻防拆解

金融APP安全防护体系深度破解分析 本文详细拆解了某头部金融APP的三重防御机制破解过程。首先通过Frida绕过反调试技术,包括ptrace自我绑定、TracerPid检测和debuggerd监控;随后针对12种Root检测方法(如su文件检查、Magisk检测等)进行环境伪装,通过Hook系统调用伪造安全环境;最后逆向分析TEE加密模块,解密关键接口参数。整个破解过程涉及静态分析、动态调试和代码注入技术,揭示了金融级APP安全防护的实现原理与突破方法(注:所有操作均获授权,仅用于安全研究)。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1400

opengles 3.0游戏开发_OpenGl ES 基础入门知识

相信大家都听过大名鼎鼎的 OpenGL,但可能大多数人没有实践使用过,本文就来介绍一下 Android OpenGl ES 的基础入门知识。或许你在工作中不会用到,但为你个人成长着想一下,扩展自己的知识广度,总归是有利无弊的,你说对吧?本文分为以下四部分介绍:OpenGL 基础概念OpenGL 坐标系理解OpenGL 渲染管线OpenGL 着色语言建议收藏本文哦~OpenGL 基础概念O...

weixin_39545805的博客 1101

DeepSeek 赋能太空探索:从轨道优化到星际开拓的 AI 革命

随着人工智能技术蓬勃发展,DeepSeek 在太空探索领域展现出巨大应用潜力。本文深入剖析 DeepSeek 技术核心,包括低功耗运算、开源生态等优势,阐述其与传统航天技术的差异。从航天器自主控制、深空探测、载人航天等关键环节,结合实时轨道调整、故障诊断修复等实例,揭示 DeepSeek 对航天任务效率与安全性的提升作用。同时探讨其应用面临的太空环境适应、伦理安全等挑战,展望技术演进方向及与前沿技术融合前景,展现 DeepSeek 为人类太空探索带来的变革与深远意义。

邓邓子的博客 2258

uni-app - 将 base64 图片编码转为 Blob 本地文件路径(把base64类型的图片,转换成blob二进制文件流)适用于 uni-app / vue.js / JavaScript

uni-app/vue.js/JavaScript将base64转Blob,uniappapp端如何将图片的base64编码转换成File对象或Blob,uni-app/vue.js/JavaScript中拿到base64转blob对象,uniapp图片base64格式转blob格式方法,uniapp上传图片压缩转base64码与base64转图片路径,Base64/Blob/File图片文件转换,url、base64、blob相互转换方法,读取本地文件为Base64并转成B

🏆 前端领域优质创作者 1万+

android平台下OpenGL ES 3.0给图片添加黑白滤镜

android平台下OpenGL ES 3.0给图片添加黑白滤镜

handy周 2020

YOLO26涨点改进 | 独家创新,注意力改进篇 | AAAI 2025 | YOLO26引入 DRM 防御优化模块,进行特征优化/特征增强,助力目标检测、图像分类、图像分割有效涨点

本文提出了一种基于DRM防御优化模块改进的YOLO26网络模型,显著提升了目标检测的鲁棒性和特征提取能力。DRM模块通过优化特征提取过程、增强抗噪声能力和补充细节信息,有效提高了模型在复杂场景下的检测精度和定位准确度。该模块可集成于UNet等主干网络,采用Transformer结构实现特征精炼,在对抗攻击环境下仍能保持稳定的融合效果。实验表明,改进后的模型在红外与可见光图像融合任务中表现出色,同时提升了下游任务性能。文章详细介绍了DRM模块的结构、作用机制及实现代码,并提供了两种YOLO26改进方案.

Ai缝合怪、助力小伙伴高效发论文 145

[OpenGL]从零开始写一个Android平台下的全景视频播放器——1.1 OpenGL ES 2.0基础知识

基本概念与说明 OpenGL是一个图形API,用来绘制,OpenGL ES (OpenGL for Embedded Systems) 是 OpenGL三维图形 API 的子集。 Android平台下,对于OpenGL ES有一套Java的封装,编程时可以避免使用NDK,OpenGL ES 2.0 支持可编程管线(什么是可编程?之后会解释) OpenGL 的基本形状是三角形,无论是绘制形状还是填充,

Martin的博客 4759

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

OpenGL ES 3.0编程指南:从概念到实践的移动图形开发全解析

OpenGL ES 3.0作为移动设备上高性能图形渲染的核心标准,为开发者提供了强大的3D图形处理能力。opengles3-book项目是一套完整的OpenGL ES 3.0编程指南示例代码库,涵盖了从基础三角形渲染到高级特效的全方位实践案例。通过这个项目,我们可以系统学习如何在Android、iOS和桌面平台上构建高效的图形应用。 ## 概念解析:理解OpenGL ES 3.0的核心架构 O

gitblog_00256的博客 1595

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

安卓OpenGL ES 2.0 入门

OpenGL ES

Zach_z的博客 2004
上一篇: android平台下OpenGL ES 3.0从矩形中看矩阵和正交投影
下一篇: android平台下OpenGL ES 3.0着色语言基础知识(下)
handy周
handy周 领域专家: 操作系统技术领域 领域专家: 操作系统技术领域
博客等级 码龄14年 507粉丝 240原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值