Cg In Two Pages

【信息科学与工程学】计算机科学与自动化—第十五篇 云计算 11 算法篇02 但若第一个应用需求40GB/s,第二个10GB/s,总需求50GB/s>40GB/s,第一个得32GB/s,第二个得8GB/s,不公平。但若分区负载不均(分区1-2各有100任务/s,分区3-4各有50任务/s),A负责1-2(200/s),B负责3-4(100/s),仍均衡。任务 τi​ 的计算需求 Wi​(CPU周期),在频率 f 下执行时间 Ti​=Wi​/f,能耗 Ei​=Pdyn​⋅Ti​=Ceff​⋅V2⋅f⋅(Wi​/f)=Ceff​⋅V2⋅Wi​。若 Mneed​>Mi​,需使用远程显存。 阅读详情

Cg in Two Pages

Mark J.Kilgard
NVIDIA Corporation
Austin, Texas
January 16, 2003

游戏引擎开发网 龚敏敏 翻译

1. Cg用例

Cg是用于GPU编程的语言。Cg程序看起来非常像C程序。这儿有一个Cg顶点程序:

void simpleTransform(float4 objectPosition  : POSITION,
   float4 color  : COLOR,
   float4 decalCoord  : TEXCOORD0,
   float4 lightMapCoord : TEXCOORD1,
   out float4 clipPosition : POSITION,
   out float4 oColor : COLOR,
   out float4 oDecalCoord : TEXCOORD0,
   out float4 oLightMapCoord : TEXCOORD1,
   uniform float brightness,
   uniform float4x4 modelViewProjection)
{
 clipPosition = mul(modelViewProjection, objectPosition);
 oColor = brightness * color;
 oDecalCoord = decalCoord;
 oLightMapCoord = lightMapCoord;
}

1.1 顶点程序的讲解

这个程序把一个顶点的对象空间位置通过一个包含世界、观察和投射串联转换的4x4矩阵进行转换。得出的结果向量是顶点在夹持空间的位置。每个顶点的颜色在输出前都通过一个浮点参数进行放缩。同样,两个纹理坐标集自然也传过去了。

Cg支持标量数据类型,比如float,但也很好地支持向量数据类型。float4表示包含四个浮点数的向量。float4x4表示一个矩阵。mul是一个标准库函数,完成矩阵和向量乘法。Cg提供像C++的函数重载;mul是一个重载函数,所以它可以用于向量和矩阵相乘的所有组合情况。

Cg提供和C一样的操作符。但是不像C,Cg的操作符可以接受和返回标量和向量。比如,标量brightness对向量color进行了放缩,就像你期望的。

在Cg中,用uniform修饰符声明一个参数表明它的值是由外部的数据源初始化的,而且在给定这批向量的处理中保持不变。从这点看来,Cg中的uniform修饰符和RenderMan中的uniform修饰符不同,但使用的场合一样。实际上,外部数据源是你的应用程序载入的一些OpenGL或Direct3D状态。比如,你的程序必须提供modelViewProjection矩阵和brightness标量。Cg运行库提供一个API把你程序的状态转化成编译的程序需要的适当的API状态。

跟在objectPosition、color、decalCoord和lightMapCoord参数后面的POSITION、COLOR、TEXCOORD0和TEXCOORD1标示符叫做输入语义。它们表明参数是怎么由每个顶点不同的数据初始化的。在OpenGL中,glVertex命令需要POSITION输入语义;glColor命令需要COLOR语义;glMultiTexCoord命令需要TEXCOORDn语义。

out修饰符表明clipPosition、oColor、oDecalCoord和oLightMapCoord参数是由这段程序输出的。跟在参数后面的语义就是输出语义。这些语义分别表明程序输出一个转换后的夹持空间位置和颜色量。同样,两个纹理坐标集也传递过去了。得出的结果顶点提供给图元汇编程序来生成一个光栅化的图元。

编译这个程序需要程序源代码、要编译的入口函数名和profile名(vs_1_1)。

然后Cg编译器可以把上面的Cg程序编译为下面的DirectX 8 vertex shader:

vs.1.1
mov oT0, v7
mov oT1, v8
dp4 oPos.x, c1, v0
dp4 oPos.y, c2, v0
dp4 oPos.z, c3, v0
dp4 oPos.w, c4, v0
mul oD0, c0.x, v5

Profile用来表明程序要被编译为用于哪个API运行环境的。同一个程序可以编译为用于DirectX 9 vertex shader profile(vs_2_0),多厂商OpenGL顶点程序扩展(arbvp1)或NVIDIA私有的OpenGL扩展(vp20和vp30)。

编译Cg程序的过程可以在你使用Cg的程序初始化的时候进行。Cg运行库包含Cg编译器,也以API的方式包含一个非常简单的过程,可以让你配置编译过的程序是用于OpenGL还是Direct3D的。

1.2 片元程序的讲解

除了写处理顶点的程序之外,你还可以写处理片元的程序。这儿有一个Cg片元程序:

float4 brightLightMapDecal(float4 color   : COLOR,
    float4 decalCoord  : TEXCOORD0,
    float4 lightMapCoord : TEXCOORD1,
    uniform sampler2D decal,
    uniform sampler2D lightMap) : COLOR
{
 float4 d = tex2Dproj(decal, decalCoord);
 float4 lm = tex2Dproj(lightMap, lightMapCoord);
 return 2.0 * color * d * lm;
}

输入的参数是颜色插值和两个纹理坐标集,由它们的输入语义定义。

sampler2D类型对应于一个2D纹理单元。Cg标准库程例tex2Dproj可以进行2D纹理映射查找。两次tex2Dproj调用对decal和light map纹理进行取样,然后把结果分别赋值给局部变量d和lm。

这段程序把两个纹理结果,颜色插值和常数2.0相乘,得出RGBA颜色的结果。这段程序返回一个float4和返回值是COLOR的语义,也就是片元最后的颜色。

当要编译为arbfp1多厂商OpenGL片元profile时,Cg编译器把brightLightMapDecal转化成以下代码:

!!ARBfp1.0
PARAM c0 = {2, 2, 2, 2}; TEMP R0; TEMP R1; TEMP R2;
TXP R0, fragment.texcoord[0], texture[0], 2D;
TXP R1, fragment.texcoord[1], texture[1], 2D;
MUL R2, c0.x, fragment.color.primary;
MUL R0, R2, R0;
MUL result.color, R0, R1;
END

同一个程序可以编译为用于DirectX 8或9的profile(ps_1_3和ps_2_x)或NVIDIA私有的OpenGL扩展(fp20和fp30)。

2. 其他Cg的功能

2.1 从C来的特性

Cg提供结构体和数组,包含多维数组。Cg提供所有C的数学操作符(+、*、/等)。Cg提供一个布尔类型和那些与布尔类型相关的操作符(||、&&、!等)。Cg提供递增/递减(++/--)操作符,条件表达式操作符(?:),赋值表达式(+=等),甚至还有C逗号操作符。

Cg提供用户定义函数(除了已定义的标准库函数之外),但是不允许递归函数。Cg提供C的控制流结构的子集(do、while、for、if、break、continue);其他结构比如goto和switch在当前的Cg实现版本并不支持,但保留了必要的关键字。

就像C,Cg对数据类型的精度和范围并不严加限制。实际上,用于编译的profile的选择决定了每种数据类型具体的表现。float、half和double用来表示连续的值,理想的浮点数,但这依赖于profile。half指的是16位半精度浮点数据类型(NVIDIA的CineFX架构提供这样的数据类型)。int是整数,通常用于循环和索引。fixed是一个额外的数据类型,用来表示不是浮点数的定点的连续数据。

Cg提供#include、#define、#ifdef等,和C的预处理一样。Cg支持C和C++的注释风格。

2.2 C没有的附加特性

Cg对向量数据类型提供内建的构造函数(类似于C++,但不是由用户自定义的):

float4 vec1 = float4(4.0, -2.0, 5.0, 3.0);

Swizzling是一种用来重组向量的组成或者构造更短或更长向量的方法。例子如下:

float2 vec2 = vec1.yx;  // vec2 = (-2.0, 4.0)
float scalar = vec1.w;  // scalar = 3.0
float3 vec3 = scalar.xxx;  // vec3 = (3.0, 3.0, 3.0)

矩阵可以用更复杂的swizzling语法。向量和矩阵元素也可以用标准数组索引语法来访问。

写入掩码可以限制只给向量指定的部分赋值。例子如下:

vec1.xw = vec3; // vec1 = (3.0, -2.0, 5.0, 3.0)

使用.xyzw或.rgba后缀来组成swizzling和写入掩码。

Cg标准库包含大量的内建数学函数(abs、dot、log2、reflect、rsqrt等)和纹理访问函数(texCUBE、tex3Dproj等)。标准库广泛应用了函数重载(类似于C++)来支持不同长度的向量和不同的数据类型。你不必像在C里一样使用#include来包含标准库程例的原型,Cg标准库程例都是自动生成原型的。

除了用于call-by-result传参的out修饰符之外,inout修饰符使参数既是call-by-value输入参数也是call-by-result输出参数。

关键字discard类似于return,但是不返回转换好的片元就终止处理了。

2.3 不支持的特性

Cg目前还不支持指针和位运算(但是,必要的C操作符和关键字为这些目的保留了)。Cg(目前)不支持联合体和函数变元。

Cg没有C++“大型的编程”特性,比如类、模板、操作符重载、异常处理和名字空间。

Cg标准库没有功能性的程例,比如字符串处理、文件输入/输出和内存配置,这些超出了Cg的专有领域。

但是,Cg保留了所有的C和C++关键字,这为从这些语言来的特性可以合入未来的Cg实现作保证。

3. Profile依赖

当你编译一个C或C++程序时,它不会因为程序过大(在一定前提之内)或因为这个程序的用途而无法通过编译。对于Cg,一个语法和语义都正确的程序可能仍然不能编译,因为这还受限于你编译这个程序的profile。

比如,目前当用顶点profile编译时,如果访问纹理就会产生一个错误。未来的顶点profile可能会允许纹理访问,但现在的顶点profile不行。其他错误更为固有。比如,一个片元profile不能以TEXCOORD0语义输出一个参数。其他错误可能是因为超出了当前的GPU能力范围,比如超过最大的指令数或可利用的纹理单元数目。

要知道,这些profile依赖错误并不反映出Cg语言的限制,而是目前Cg实现的限制或者你的目标GPU的潜在硬件限制。

4. 兼容性和移植性

NVIDIA的Cg实现和Microsoft的高级着色语言(HLSL)非常相似,因为它们是合作开发的。HLSL是和DirectX 9以及Windows操作系统整合在一起的。Cg则提供了多API(OpenGL、DirectX 8和DirectX 9)和多操作系统(Windows、Linux和Mac OS X)的支持。因为Cg对多厂商API有接口,Cg可以在多个厂商的GPU上运行。

5. 更多信息

可以看《The Cg Tutorial:The Definitive Guide to Programmable Real-Time Graphics》(ISBN 0321194969),由Addison-Wesley在2003年3月出版。详见http://www.awprofessional.com/titles/0321194969。

3dMax脚本类插件:不写 C++也能造“原生”工具 从plugin关键字到场景持久化,拆解 MAXScript 插件开发全流程! 阅读详情

相关推荐

Mac上安装虚拟机搭载window系统

用Mac的都知道,很多window用的软件是Mac版本没有的。平时有的还得要求去用那些软件,有几种方式可供大家选择: 1.再买个window本; 2.装双系统; 3.装虚拟机,搭载window系统。 我比较推荐第3条,这样可以在Mac本上做到双开,一边开着mac一边开着window,还能做到同时处理文件,不至于重新启动操作系统,下边是具体实现步骤,其中有几个需要下载的,建议在网速好的时候完...

Coder_Mumu的博客 1万+

NIVIDIA 硬解码学习3

NIVIDIA 硬解码学习3 今天主要学习的 Demo 是AppDecGL This sample application illustrates the decoding of media file and display of decoded framesin a window. This is done by CUDA interop with OpenGL. C...

【黑键】 1822

28-基于STM32单片机的便携式健康监测系统设计与实现(程序+原理图+元件清单)

本文详细介绍了基于STM32单片机的便携式健康监测系统设计与实现,该系统集成MAX30102光电传感器和MSP20压力传感器,实时监测心率、血氧和血压等关键生理指标。通过STM32F103C8T6主控芯片和HC-05蓝牙模块,实现数据采集、处理及无线传输,具有便携性高、操作简便等特点,适用于家庭健康监护和户外运动场景。

weixin_29191669的博客 420

OpenGL显卡编程

文档简述:   随着显卡的飞速发展,更快的速度以及越来越多的新功能为硬件所支持,硬件的进步使得图形程序开发人员可以创造出更加绚丽的视觉效果,现在,电影级动画的实时渲染已不再是梦想。我们怎么在OpenGL中利用显卡的新特性呢?答案就是OpenGL扩展。   注:如不作特别说明,本站文章中的显卡均指面向普通用户的非专业显卡。 文档目录:   OpenGL扩展   显卡差异   顶点/片

痞子龙3D编程 4769

从ResNet到EfficientNet:特征金字塔网络(FPN)在不同骨干网中的适配指南

本文深入探讨了特征金字塔网络(FPN)与ResNet、VGG、EfficientNet等主流骨干网络的适配策略。文章详细解析了FPN的核心原理,并针对不同骨干网络的特征提取特性,提供了通道对齐、参数量估算及迁移学习的系统化指南,旨在帮助开发者在目标检测等视觉任务中构建高性能、高效率的模型。

weixin_29047919的博客 220

金蝶云星空v8.0私有化部署与cpolar内网穿透:构建企业级远程ERP访问通道

本文详细介绍了金蝶云星空v8.0企业版的私有化部署流程与cpolar内网穿透技术,帮助企业构建安全高效的远程ERP访问通道。从系统环境准备、SQL Server配置到内网穿透安全加固,提供全流程实战指导,助力企业实现本地部署与远程办公的无缝衔接。

weixin_28736335的博客 376

反编译ARB program to GLSL shader日记

为什么80%的码农都做不了架构师?>>> ...

weixin_34055787的博客 608

WinCC动态选择报警记录案例

本例中需要确认查询的时间段以及查询的关键字,然后通过一个按钮来执行报警数据查询脚本,并把查询出的结果加载到当前报警控件中。<本例中数据查询脚本的思路是根据选项组所选定的参数加载相应的归档变量到在线趋势控件,根据设定的查询时间范围设定控件时间轴的开始时间及结束时间。本文以 WinCC V8.0为例,介绍如何动态的查询WinCC报警记录,包括关键字查询/时间&关键字查询,如图1所示。<在WinCC变量管理中创建不同的变量组,并在变量组下创建相应的变量,如图2 所示(下图并非实际变量值)。

weixin_45072604的博客 2708

Cg in Two Pages

Cg in Two PagesMark J.KilgardNVIDIA CorporationAustin, TexasJanuary 16, 2003游戏引擎开发网 龚敏敏 翻译1. Cg用例Cg是用于GPU编程的语言。Cg程序看起来非常像C程序。这儿有一个Cg顶点程序:void simpleTransform(float4 objectPosition : POSITION

OJ的专栏 1218

保姆级教程:用Anaconda+PyCharm搞定YOLOv8本地部署(附避坑指南)

本文提供了一份详细的YOLOv8本地部署指南,涵盖Anaconda环境配置、PyCharm集成到模型部署的全过程。特别针对国内开发者需求,整合了镜像加速和常见报错解决方案,帮助快速完成目标检测模型的本地部署与实战应用。

weixin_42528090的博客 433

Unity 面试篇|(六)数据结构和算法篇 【全面总结 | 持续更新】

先拿10000个数建堆,然后一次添加剩余元素,如果大于堆顶的数(10000中最小的),将这个数替换堆顶,并调整结构使之仍然是一个最小堆,这样遍历完后,堆中的10000个数就是所需的最大的10000个。桶排序是计数排序的升级版。它的工作原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。这样处理就可以分别在每个文件的10^6个数据中找出最大的10000个数,合并到一起在再找出1000*10000中的最终的结果。

游戏开发小Y的博客 12万+

深挖C++:类和对象(中)

(先进后出)

xys_678的博客 215

手把手完整实现STM32+ESP8266+MQTT+阿里云服务器+手机APP应用——第一节—阿里云物联网平台配置+IoTStudio界面绘制+MQTT.fx模拟MQTT客户端与使用AT命令发布订阅消息

通过MQTT.fx模拟连接以及通过CH340串口连接ESP8266发送AT命令,实现阿里云物联网平台发送数据同时接收数据,IOT studio界面显示数据。具体来说:使用ESP8266(本系列使用了ESP8266-ESP01/01S以及正点原子的ATK-ESP8266) 来连接网络,获取设备数据发送到阿里云物联网平台并显示数据,通过IOT studio界面显示数据并发送命令控制设备。本系列使用的主控芯片是STM32F103系列,当然也可以使用其他系列单片机都可以实现,思路都是一样的。同时本系列有手机APP源

嵌入式阿齐Archie 5万+

选型笔记:Type‑C 扩展坞方案评估|DP1.4 转 HDMI2.0 桥接芯片 GSV2201S@ACP

本文记录 GSV2201S 这款 DP1.4a 转 HDMI2.0 桥接芯片评估,梳理视频、HDCP、PD 集成能力,总结 Type‑C 转接 Dongle、扩展坞方案的适配边界,以及差分走线、PD 时序、HDCP 握手等高频调试问题,为 C 口视频转接方案选型提供参考。

ACP广源盛的博客 218

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

ThunderKittens 深度解析:一个不基于 MLIR 的 C++ 模板 GPU DSL

Triton 是"让更多人能写 GPU kernel",ThunderKittens 是"让会写的人写得更爽"。前者用 MLIR 换易用性,后者用 C++ 模板换可控性。它们不是替代关系,而是覆盖了 GPU 编程光谱的两端。ThunderKittens 的出现,本质上是对"GPU DSL 必须基于 MLIR"这一默认假设的挑战。编译期类型系统本身就可以是一个强大的 DSL 基础设施,不需要中间 IR,不需要黑盒 pass,也能实现 tile 级抽象和零运行时开销。

Maxwell_Newton的博客 333

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

C++移动构造函数详解

移动构造函数是C++11引入的一种特殊构造函数,用于从临时对象(右值)"窃取"资源来初始化新对象,而不是进行昂贵的深拷贝。char* data;public:// 移动构造函数:参数是右值引用 &&// 关键:把源对象的资源置空。

拒绝AI文,努力在AI时代写出感动人心的好文章 388

假人有限元模型

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

蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级:倍增法求最近公共祖先LCA解析

蓝桥杯报名正在火热进行(软件赛报名 2026-10-08—12-18,省赛 2027-04-10),电子学会 12 月软件编程(C/C++ 一级至十级、Python 一级至六级)考级报名也已开启(9/23—12/2),全国青少年信息素养大赛算法应用主题赛同步推进——把 LCA 这个模板练熟,正是冲刺这些赛事树型考点的关键一步。所谓「最近公共祖先」:在一棵以某个节点为根的树里,两个节点 u、v 向上追溯,最早交汇的那个祖先就叫它们的 LCA。比如家谱里,你和你表哥最近的共同长辈就是你们的祖父。

IT_Scratch的博客 534

【C语言】字符与字符串函数

C语言中字符串为以\0结尾的字符数组,标准库函数基于此约定。本文解析字符串内存布局,详解ctype.h与string.h中字符分类、长度计算、拷贝、比较等函数的使用要点,强调长度判断与越界风险,最后通过命令行待办事项示例整合fgets、sscanf、strncpy、strcmp,展示实际应用中的关键细节。

记录在学习过程中学到的知识 343

C++ 多态详解:作用、原理与实战用法

多态是C++面向对象的核心特性,通过虚函数实现运行期动态绑定,使同一接口在不同对象上表现出不同行为。其核心作用包括统一接口、提升可扩展性、降低耦合、支持运行时分派与批量处理。实现依赖虚函数表(vtable)和虚指针(vptr),需注意虚析构函数、对象切片等陷阱。相比编译期多态(模板),运行期多态灵活性高但有调用开销。合理结合两者,可兼顾代码的灵活性与性能,是构建可扩展、低耦合系统的关键。

2402_85743155的博客 377

C++ 函数模版

模板参数:● template ,T 就是类型占位符,名字可以自定义,习惯用T● 占位符可以在函数返回值、形参、函数内部当作类型使用使用要点模板代码一般写在头文件:编译器需要看到完整模板源码,才能在每个编译单元完成实例化全局函数、类内成员函数都可以写成模板实例化发生在编译阶段,不是运行时隐式实例化:调用时编译器自动推导实参类型,生成对应版本函数。

2501_94041724的博客 301

C++ 运行时多态与虚函数机制全面剖析【面试重点】

构成C++ 运行时多态必须是基类的指针或者引用调用虚函数。被调用的函数必须是虚函数,并且派生类必须对该虚函数完成重写/覆盖(Override)。只有基类的指针或引用才能既指向基类对象,又指向派生类对象(切片机制);而只有完成了虚函数重写,派生类与基类才具备不同的函数行为,达到“指向谁就调用谁”的效果。在类成员函数的前面加上virtual关键字修饰,该成员函数就成为了虚函数。public:// 成员函数前加 virtual 修饰,声明为虚函数。

Fuyo_0209的博客 435

C++ 求抛物线的顶点、焦点和准线(Finding the vertex, focus and directrix of a parabola)

已知抛物线方程 $ y = ax^2 + bx + c $,可利用公式求其顶点、焦点和准线。顶点为 $ \left( -\frac{b}{2a}, \frac{4ac - b^2}{4a} \right) $,焦点为 $ \left( -\frac{b}{2a}, \frac{4ac - b^2 + 1}{4a} \right) $,准线方程为 $ y = c - \frac{b^2 + 1}{4a} $。以 $ a=5, b=3, c=2 $ 为例,计算得顶点 $(-0.3, 1.55)$,焦点 $(-0

csdn_aspnet的专栏,请点击博客主页右上角三个点中的私信联系 163

c++ 超级大坑未定义行为如何避免(下)

尤其是通过。

拒绝AI文,努力在AI时代写出感动人心的好文章 141

C 语言指针与输入输出

指针是 C 语言的魂,输入输出是和人交互的入口。这篇文章把"变量在内存里到底长什么样"讲透,接着用代码验证原码/反码/补码为什么非用补码不可,再拿进制转换、数组、printf/scanf 的格式符收尾。所有输出都是本机 gcc 真实跑出来的。

2401_89953644的博客 161

从“不照人”到“剂量达标”:扇叶遮挡式UV-C空气消毒的工程边界与可验证评估框架

人机共存”正逐渐成为家用 UV-C 空气消毒产品的核心卖点。其中一类常见结构,是把 254 nm 紫外线灯置于吊扇扇叶上方,以扇叶盘作为物理遮挡,同时借助风扇强制对流实现空气循环消毒。专利文献对该结构的意图描述相当清晰:消毒平台遮挡紫外线灯朝下发出的光,使光线射向天花板,从而“不会让紫外线辐射到位于吊扇灯下方的用户”。然而,“结构上不直射”与“工程上安全且有效”之间,仍隔着一段需要实测数据来填补的距离。

HANDY09200的博客 693

【C++】【STL】string_OJ题

本文总结了9道C++ STL中关于string的OJ题目,按操作类型分为三组:反转与就地修改(如917、541、151)、计数与查找(如387、125、58)、模拟与大数运算(如415、43、8)。核心技巧包括双指针收敛、字符分类处理、进位控制及边界值处理。所有题目使用同一套源码,在标准库std::string与自定义容器MyString间切换仅需宏定义,验证结果一致性。代码通过随机测试用例与Trace函数逐行比对,确保逻辑正确性,强调接口对齐的重要性。

这里是Cocatrice的博客,感谢大家一直以来的支持和鼓励,如果对C/C++方向感兴趣的话,可以通过主页的微信名片加Cocatrice的好友,也可以通过邮箱:Chen31980094@163.com 联系,一同加油! 4369
上一篇: Cg FAQ
下一篇: Effective STL 条款1:仔细选择你的容器
AMin2001
博客等级 码龄26年 7粉丝 35原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值