【论文阅读32】《Texture Defragmentation for Photo-Reconstructed 3D Models》

目录

1 introduction

2 overview

 3 Related work

3.1 Single-patch Mesh Parametrization

3.2 Global Mesh Parametrization

3.3 Signal-Specialized UV Maps

3.4 Mesh repairing

3.5 Alleviating the effect of seams

3.6 Packing of texture charts

4 Phases of the algorithms

4.1. Enumeration of candidate merge operations

4.2. Performing a merge operation

 4.2.1. Initial alignment

4.2.2. Local UV re-optimization

4.2.3. Consistency Checks

4.3. Ranking of the candidate operations

4.4. Updating candidate operations

4.5. Atlas Repacking

4.6. Extension to Multiple Texture Sheets

5. Results

5.1 defragmentaion 实验

5.2 ablation study

5.2.1 local optimization (alpha 邻域)

5.2.2 greedy order

5.2.3 appeal score factors

5.3 Comparison against computing an entirely new UV-map

6. conclusions


1 introduction

  1. 不采用重新map的原因:
    1. 模型不连续,高分辨率--不利于参数化(模型复杂)
    2. resample纹理图,导致纹理信息损失
  2. 摄影测量三维重建,纹理问题
    1. 用参数化的思路——走不通
      1. undistorted map--不关注
      2. 根据映射后UV坐标(0~1)对原始重建影像采样(三维顶点投影到视图,得到像素坐标(隐含一次采样),变换得到到UV纹理图)
      3. 渲染时,需要对纹理图再采样(到screen)
      4. 总结:视图-纹理图-屏幕渲染(两次采样:信息损失
      5. 模型不规整
    2. 目前的思路:三维顶点投影到视图,得到像平面坐标,再对像平面坐标采样,直接copy-拼接到最终的UV纹理图,无需额外采样
      1. 三维面片最佳视图的选择,与可视性 && 法向有关(尽可能选择正视图???
      2. 保证了与重建影像相同的采样密度: 近大远小(近处采样密度高,远处采样密度小)
      3. 疑惑?? 采样密度与UV纹理图中像素数相关;在人工UV展开时,像素数,应该与模型部位的重要性有关;而上述方法,像素数与该部位相对于最佳影像的深度
      4. 好处/意义
      5. 需要注意的点
        1. Seam - visible(视觉上尽量不可见)
        2. 全局一致性
        3. [LI07] LEMPITSKY V., IVANOV D.: Seamless mosaicing of image-based texture maps. In Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition (CVPR) (2007), IEEE Computer Society, pp. 1–6.
        4. [GWO∗10] GAL R., WEXLER Y., OFEK E., HOPPE H., COHEN-OR D.: Seamless montage for texturing models. Computer Graphics Forum 29, 2 (2010), 479–486.
    3. 当前做法的问题
      1. [YLT19] YUKSEL C., LEFEBVRE S., TARINI M.: Rethinking texture mapping. Computer Graphics Forum 38, 2 (2019), 535–551.
      2. Texture space - packing
      3. Texture pixel = texel
        1.  Texel 重复
        2. 渲染时,基于UV图,采样颜色值时,采用双线性插值,得到最终的渲染值
        3. 在seam边界处,由于存在空白区域,上述插值,会导致seam边界处的渲染值不一致,进一步使得接缝明显;
        4. 因此seam边界处的插值,要考虑空间邻接性,体现为:将空间邻接的texel重复备份,用于插值
        5. seam越长,备份数据越多
        6. [RNLL10] RAY N., NIVOLIERS V., LEFEBVRE S., LÉVY B.: Invisible seams. Computer Graphics Forum 29, 4 (2010), 1489–1496.
      4. 问题2也加重了问题(预留更多gap来备份)
      5. 双线性插值本身,是种不连续的方式,使得seam两侧还是不一致
      6. Seam顶点的备份(标记seam??)--gpu memory/loading /cache
      7. seam导致缓存不一致?!!!

                  除第一个问题,其他都是渲染方面的问题??

2 overview

  1. 本文核心目标:
    1. 减少缝-碎片减少
    2. 尽可能保留原始变形属性,同时避免重采样
  2. 上述目标,是相互冲突,无法找到全局最优的解决方法,因此,采用贪心策略(需要去了解一下贪心策略的含义)

 3 Related work

3.1 Single-patch Mesh Parametrization

  1. Single :强调只讨论基于变形度的map,不考虑seam
  2. 结合需求,应该侧重于基于纹理映射的参数化!!!!
    1. [FH05] FLOATER M. S., HORMANN K.: Surface parameterization: a tutorial and survey. In Advances in Multiresolution for Geometric Modelling (Berlin, Heidelberg, 2005), Dodgson N. A., Floater M. S., Sabin M. A., (Eds.), Springer Berlin Heidelberg, pp. 157–186.
    2. [SPR∗07] SHEFFER A., PRAUN E., ROSE K., ET AL.: Mesh parameterization methods and their applications. Foundations and Trends R in Computer Graphics and Vision 2, 2 (2007), 105–171.
    3. [HPS08] HORMANN K., POLTHIER K., SHEFFER A.: Mesh parameterization: Theory and practice. In ACM SIGGRAPH ASIA 2008 Courses (2008), SIGGRAPH Asia ’08.
    1. [LZX08] LIU L., ZHANG L., XU Y., GOTSMAN C., GORTLER S. J.: A local/global approach to mesh parameterization. Computer Graphics Forum 27, 5 (2008), 1495–1504.
    2. [SA07] SORKINE O., ALEXA M.: As-rigid-as-possible surface modeling. In Proceedings of the Fifth Eurographics Symposium on Geometry Processing (2007), SGP ’07, pp. 109–116.
    3. [RPPSH17] RABINOVICH M., PORANNE R., PANOZZO D., SORKINEHORNUNG O.: Scalable locally injective mappings. ACMTrans. Graph. 36, 2 (2017).
    1. [LZX∗08] LIU L., ZHANG L., XU Y., GOTSMAN C., GORTLER S. J.: A local/global approach to mesh parameterization. Computer Graphics Forum 27, 5 (2008), 1495–1504.

3.2 Global Mesh Parametrization

  1. global :强调考虑seam+基于变形度的map
  2. 二者同时考虑,构成NP-hard问题——一般采用启发式算法(heuristics)
  3. [PTH∗17] PORANNE R., TARINI M., HUBER S., PANOZZO D., SORKINE-HORNUNG O.: Autocuts: Simultaneous distortion and cut optimization for uv mapping. ACMTrans. Graph. 36, 6 (2017)
  4. 需要关注能够体现 平衡seam + distortion 的度量方式
    1. 难点:seam的衡量
    2. 本文: [MPCT20][MPCT20] MAGGIORDOMO A., PONCHIO F., CIGNONI P., TARINI M.: Real-world textured things: A repository of textured models generated with modern photo-reconstruction tools. Computer Aided Geometric Design 83 (2020).
    3. [LKK∗18] LI M., KAUFMAN D. M., KIM V. G., SOLOMON J., SHEFFER A.: Optcuts: Joint optimization of surface cuts and parameterization. ACMTrans. Graph. 37, 6 (2018).

3.3 Signal-Specialized UV Maps

  1. 含义:参数化过程中重点考虑纹理问题,纹理的信息是否被损耗
  2. 相关研究(重要)!!!
    1. [SWB98] SLOAN P.-P. J., WEINSTEIN D. M., BREDERSON J.: Importance driven texture coordinate optimization. Computer Graphics Forum 17, 3 (1998), 97–104.
    2. [SGSH02] SANDER P. V., GORTLER S. J., SNYDER J., HOPPE H.: Signal-specialized parametrization. In Proceedings of the 13th Eurographics Workshop on Rendering (2002), EGRW ’02, Eurographics Association, pp. 87–98.
    3. [BTB02] BALMELLI L., TAUBIN G., BERNARDINI F.: Space-optimized texture maps. In Computer Graphics Forum (2002), vol. 21, pp. 411– 420.
  3. 本文:不考虑纹理信号(原始纹理图,每个像素同等重要)  && 不保证每个像素在最终的结果中,都1:1保留
  4. Signal specialization && avoid texture area to be resampled 是一个trade-off问题

3.4 Mesh repairing

  1. 用于解决摄影测量生成模型-inconsistent问题
  2. 参考:
    1. [ACK13] ATTENE M., CAMPEN M., KOBBELT L.: Polygon mesh repairing: An application perspective. ACM Comput. Surv. 45, 2 (2013).
  3. 结论:repair不适用
    1. repair步骤需要处理一个具有高几何复杂度和分辨率的mesh,其本身就是当前难以解决的问题
    2. repair后,会涉及到texel密度改变 && 重采样
  4. 本文仍旧基于原始模型(可以尝试repair)

3.5 Alleviating the effect of seams

  1. 减少seam number的几个目的(不同侧重点),相关方法包含一个或多个
    1. Servey:[YLT19] YUKSEL C., LEFEBVRE S., TARINI M.: Rethinking texture mapping. Computer Graphics Forum 38, 2 (2019), 535–551.
  2. 最接近本文应用场景的方法:
    1. [[SWG∗03] SANDER P. V., WOOD Z. J., GORTLER S. J., SNYDER J., HOPPE H.: Multi-chart geometry images. In Proceedings of the 2003 Eurographics/ACM SIGGRAPH Symposium on Geometry Processing (2003), SGP ’03, Eurographics Association, p. 146â ˘A¸S155.] LIU S., FERGUSON Z., JACOBSON A., GINGOLD Y.: Seamless: Seam erasure and seam-aware decoupling of shape from mesh resolution. ACMTrans. Graph. 36, 6 (2017).
    2. 不同点:
      1. 参考文献只考虑了 visual artifacts
      2. 参考文献的实验数据,是小规模mesh,摄影测量的模型是大规模的&& 复杂的

3.6 Packing of texture charts

  1. packing问题嵌入到参数化问题中,类似于一个组合优化问题--采用启发式(类似于autoCut)
  2. 常规方法:chart栅格化-pack to 2d grid(最小化各种损失函数:pack水平高度?? chart之间的空隙空间)
    1. [LPRM02] LÉVY B., PETITJEAN S., RAY N., MAILLOT J.: Least squares conformal maps for automatic texture atlas generation. ACM Trans. Graph. 21, 3 (2002), 362–371.
    2. [SWG∗03] SANDER P. V., WOOD Z. J., GORTLER S. J., SNYDER J., HOPPE H.: Multi-chart geometry images. In Proceedings of the 2003 Eurographics/ACM SIGGRAPH Symposium on Geometry Processing (2003), SGP ’03, Eurographics Association, p. 146â ˘A¸S155.
    3. [NS11] NÖLL T., STRIEKER D.: Efficient packing of arbitrary shaped charts for automatic texture atlas generation. Computer Graphics Forum 30, 4 (2011), 1309–1317.
  3. pack过程中,首先detect大的空隙空间(由复杂的seam边界line造成) ,然后通过split charts来减少这些空隙---其实质与减少seam number && length相悖 --trade-off
  4. 本文:
    1. 直接采用先有的packing方法,增加一个grid-perserving constraint
    2. 本文输入到packing额uv-map,chart 数量更少,形状更加规整
  5. 参考:[LVS18] LIMPER M., VINING N., SHEFFER A.: Box cutter: Atlas refinement for efficient packing via void elimination. ACMTrans. Graph. 37, 4 (2018).

4 Phases of the algorithms

  1. Linked edges: 与seam相对应的边
  2. Charts: connected component in UV-layout
  3. Linked chart: 通过linked edges 联系的charts

4.1. Enumeration of candidate merge operations

  1. Merge operations:
    1. 只考虑:merge the all linked edges of linked charts
    2. merge the subset of linked edges of linked charts:成立,但会增加merge operation的空间,故不考虑
  2. 针对 linked edge出现在同一个chart的情况--intra-chart,合并,不影响chart数目
  3. 舍弃无效的合并操作:将非0亏格变为0的操作

4.2. Performing a merge operation

  1. Merge operations,涉及到transform && topological unifying---会使相关tri变形--违背目的2,因此,用tri变形作为是否接受该merge的评判标准之一
  2. 在merge相关操作中,尽可能较少变形,体现为:
    1. Initial 步骤,采用刚性变换
 

 4.2.1. Initial alignment

  1. Step1:将小的tri,2d gridly transformed to the 大的tri
    1. Transform: 刚性;目标:最小化对应顶点间的距离--最小二乘
      1. 这个变换,仅考虑距离,没有考虑其他限制:例如 变换后导致overlap && 较小tri朝向改变
      2. 前者通过merge取平均,可以消除;后者不可——这也是后续需要进行一致性检查的原因
        1. 绿色表示tir的正确方向,红色表示翻折后tir的错误面片            
        2. 针对intra-chart, transform --identity
        3. transform中的rotation(90°倍数),会引起最终纹理像素从原始零碎纹理图中进行重采样问题!!!(见notebility)

  2.  Step2: Merge(vertice位置取平均)——会引起变形

4.2.2. Local UV re-optimization

  1. 局部调整,其他区域固定position
  2. As-rigid-as-possible(ARAP)
    1. isometric distortions
  3. 评价re-optimization:
    1. Minimized energy  VS local th
    2. accumulated distortion  VS global th

4.2.3. Consistency Checks

  1. Overlap
    1. 4.2.1 (如图2中的翻折)中的刚性变换---4.2.2前可以detected
    2. 4.2.2中的re-optimization
    3. 拒绝新的overlap,接受input中存在的overlap

4.3. Ranking of the candidate operations

  1. 感觉这个rank可以是突破点
  2. rank原因:
    1. merge(re-optimazation)耗时,优先merge成功率高的
    2. merge间相互影响,顺序很重要
  3. Rank-score意义
    1. 体现merge成功率
    2. 符合本文两大核心(seam 短;保留原始distortion/map)
  4. score的影响因素(主要是几何特征)
    1. 碎片少-chart总周长短-linked edges长度 / chart周长
      1. 为什么不是linked edges的绝对长度??
      2. 考虑到面片大小,采用相对长度??
      3. 最大值:1 对应 insidea hole or the other
      4. 此种情况,merge易成功  && 对应的边界容易造成global overlap---应该优先处理
    2. 变形少-initial align幅度越小--transform后,愈接近——linked vertics 平均距离
    3. 成功率大--实验表明,面片越小,计算复杂度越低,越容易成功
    4. 成功率大--实验表明,失败次数越多,越容易再次失败

4.4. Updating candidate operations

  1. Potential queue Q && failed queue F
  2. 成功:弹出操作S,更新 Q &&F (失败的与S相关的操作,在S成功后,可能成功)
    1. 更新:重新定义与S相关的操作 &&计算得分 && 排序
    2. 相关是指与S(a,b)中面片a,b有关
    3. 重新定义:此时该操作不是与a/b有关,而是与a,b merge后的unified chart有关
    4.  失败的与S相关的操作,在S成功后,可能成功:
    5. “当chart边界被以前的操作简化后,比如填补空白,全局重叠就变得不那么频繁了"
    6. 失败:将S放入F

4.5. Atlas Repacking

  1. 重点理解重采样
    1. Merge的对象是以UV坐标(0~1)表示的二维面片
    2. merge前后的对象,都需要对应到纹理图(像素空间)
    3. Tri1(merge前)---纹理图采样1---纹理像素1
    4. Tri2(merge后)---纹理图采样2---纹理像素2
    5. 若tri1 && tri2之间相差90°整数倍旋转/平移/水平 && 垂直翻转 则相同纹理图像素分辨率条件下,纹理图采样1&&2等效,纹理像素1&&2只相差90°整数倍旋转/平移/翻转(纹理像素快size/shape一致)
    6. 此时,可以避免纹理像素1->2过程中,由于采样1 &&2导致的信号损失
    7. ps:三维模型渲染过程的纹理采样
    8. 屏幕像素---屏幕采样--Tri(3d)--Tri(2d)---纹理图采样--纹理像素
  2. 本文packing算法的实质
    1. Grid-preserved(确定旋转)
    2. 最大化空间利用(确定平移-placement)
  3. grid-preserved-具体步骤:
    1. 每个chart内的tri,若能刚性变换,恢复零碎纹理图中(原始)uv位置,标记并记录旋转角度angle1,2,3…
    2. 对某个chart,记角度seta(个人理解 seta = angle1+n1*90° = angle2+n2*90°=…=angle_m+n_m*90°),使得m个三角面片占chart面积比(r)尽可能大--本文,采用3D area占比来代替2D area
    3. 若r大于阈值(本文5%),则上述m个三角面片(2D)被视作preserved,该chart被视作constrainted,在packing算法中,该chart整体的旋转分量为 k*90°-seta
    4. 影响因素:
    5. 结论:merge成功越多,resample也越多
  4. 最大化空间利用(确定平移-placement)
    1. 参考:[LPRM02, SWG∗03]
      1. [LPRM02] LÉVY B., PETITJEAN S., RAY N., MAILLOT J.: Least squares conformal maps for automatic texture atlas generation. ACM Trans. Graph. 21, 3 (2002), 362–371.
      2. [SWG∗03] SANDER P. V., WOOD Z. J., GORTLER S. J., SNYDER J., HOPPE H.: Multi-chart geometry images. In Proceedings of the 2003 Eurographics/ACM SIGGRAPH Symposium on Geometry Processing (2003), SGP ’03, Eurographics Association, p. 146â ˘A¸S155.
    2. triUV--网格化(不是纹理像素化,但二者实质都是采样):
    3. placement:multiple horizons(不懂细节)
    4. 要点:greedy fashion, minimizing a cost function that penalizes wasteful placements.
    5. 放置顺序:
      1. 小于100个chart:随机——提高packing效率
      2. 大于100:根据chart面积,从大到小
  5. 新的纹理图的生成--上述步骤完成了triUVpacking,此时还没有采样到生成纹理像素!!!!
    1. Preserved:直接copy from the 原始纹理图像素值
    2. 其他:逐像素(取像素中心)计算新的uv坐标--变换对应到到旧的uv坐标(由顶点确定变换对应关系),再采样(从uv坐标采样纹理像素值,可能涉及到(双线性)插值)
    3. 之前实现了另一个版本:同于新旧uv坐标分别像素化,两个像素块进行仿射变换,从旧的纹理像素值获得新纹理图的像素值——二者貌似不同,后者似乎没有涉及到采样插值
  6. 针对纹理空间未使用的像素(不是冗余的纹理信息,而是空白部分)
    1. 本文:从使用的纹理像素中进行extend && blend
    2. Push-pull算法:[GGSC96]
    3. 目的/意义:contain the bleeding artifacts at any MIP-map level.

4.6. Extension to Multiple Texture Sheets

  1. 一些思考:见notebility
  1. 本文关于最终纹理图的数量 && 大小 &&分辨率的确定,细节如下:
  2. 假定存在多张纹理图(sheet),size不同,纹理图内部 && 纹理图之间分辨率相近(分析见note)
    1. 分辨率:输出纹理图与原纹理图分辨率保持一致
    2. 大小:等同于最大尺寸??看代码
    3. 数量:placement时,当前chart放不进当前sheet时,新建一个等大(最后去掉无效像素)
    4. 生成的多张纹理图,size可能不同

5. Results

5.1 defragmentaion 实验

  1. Benchmark dataset
    1. [MPCT20].--不同重建 tool
    2. inconsistencies such as nonmanifoldness, non-coherent face orientation, degenerate faces
    3. Texture: multiple image files
  2. 一些参数
    1.  alignment error: 2*seam length ?? 什么东西
    2. Linked edge/周长 最低阈值20%
    3. Arap 阈值 local 0.5 entire 0.025
      1. Entire th要比local: 前者将distortion分散到所有tri,后者将distortion集中在部分邻域tir
  3.  Time 5min
  4. 结果评价(defragmentation--seam减少)——一些定量化指标
    1. Atlas solidity--Seam length / texture area 外接边界
    2. Number of charts
    3. Uv border length
  5. 变形度--ARAP energy (新旧uv layout)
  6. Resample--本文与其他方法的最大区别点???其他方法---统计不需要重采样的面片/总面片 3D mesh
  7. 其他相关问题,practical broblem(与defragmentation间接相关)
    1. Vertex Replication Coefficient(before):the ratios of the number of 2D vertices to 3D vertices
    2. Number of texture samples:
      1. 不是纹理采样次数,而是纹理图size!!!
      2. 异常分析:部分texture size 变大
        1. Packing: padding 4 -pixel --> 8 pixel apart (chart)
          1. 意义:保证了MIP-mapping level two--correct filtering
          2. Mip-mapping---然而一些原始零碎纹理图没有padding
            1. http://Mip映射(Mip-mapping)_百度百科
            2. https://www.techopedia.com/definition/27195/mip-mapping-mipmapping
            3. http://wiki.polycount.com/wiki/Mip_mapping
          3. 根据景深,调整模型纹理贴图的大小(近大远小),节约资源
        2. 合并后,chart变大,packing变难
          1. 解决办法,但从packing角度考虑,cut chart---但与本文goal相反

5.2 ablation study

  1. 对本文方法的一些步骤,进行更细致的讨论

5.2.1 local optimization (alpha 邻域)

  1. 统计不同alpha值下,相关实验结果
  2. alpha值与相关结果的关系:alpha越大,atlas solidity 变大,resample 变大,运行时间边长

5.2.2 greedy order

  1. 本文顺序 vs随机
  2. 后续想进一步改进order???

5.2.3 appeal score factors

  1. 控制变量,去除其中一个factor;Size-Bonus情况较复杂

5.3 Comparison against computing an entirely new UV-map

  1. 现有的软件或者开源方法,无法直接处理基于摄影测量的三维模型:due to various inconsistencies on the input models or their excessive resolution
  2. 转换思路:根本不同是map考虑的变形度量
    1. 3dmesh && 2d new uv layout
    2. 2d old uv layout &&2d new uv layout
    3. 上述两种思路在以下情况,区别明显(还不懂为什么):
    4. Texture samples distribution:纹理分辨率
  3. 具体的对比实验:
    1. Composite Majorization [SPSH∗17], using scaffolding[JSP17] to ensure the new texture atlas is overlap-free.
      1. [SPSH∗17] SHTENGEL A., PORANNE R., SORKINE-HORNUNG O., KOVALSKY S. Z., LIPMAN Y.: Geometric optimization via composite majorization. ACMTrans. Graph. 36, 4 (2017).
      2. [JSP17] JIANG Z., SCHAEFER S., PANOZZO D.: Simplicial complex augmentation framework for bijective maps. ACM Trans. Graph. 36, 6 (2017).
    2. 核心思路:减少原始UV distortion(3dmesh && 2d new uv layout),不影响 cut layout
    3. 重点是为了探讨本文在distortion上衡量的有效性
    4. 结论:本文
      1. preserving highly detailed areas and high frequencies of the input texture image
      2. 中间那列确实有点模糊,可能是因为涉及到大量重采样---看看我自己的实验呢

6. conclusions

  1. 本文方法的亮点(相较于re-parametrization)
  2. the first approach to target specifically the goals set in Sec. 2
  3. Future work
    1. Local optimization 中融入 avoid re-sample 约束
    2. 可能会比较难,但是最近有些数值研究可以参考
    3. [PTH∗17, LKK∗18].
    4. [LKK∗18] LI M., KAUFMAN D. M., KIM V. G., SOLOMON J., SHEFFER A.: Optcuts: Joint optimization of surface cuts and parameterization. ACMTrans. Graph. 37, 6 (2018).
    5. [PTH∗17] PORANNE R., TARINI M., HUBER S., PANOZZO D., SORKINE-HORNUNG O.: Autocuts: Simultaneous distortion and cut optimization for uv mapping. ACMTrans. Graph. 36, 6 (2017).
  4. Limitations
    1. 大量冗余图片,不适用,不懂??
    2. 不适用可以利用超分辨率技术提高纹理质量的情景(我的理解是,如果能用超分辨率提高纹理质量,那么就可以直接re-parametrization)
    3. 也不适用于需要对纹理图像进行降采样的情况(原始重建影像是高分辨率影像)??不懂--In both(b,c) cases, the benefit of inheriting the input texel distribution is diminished (although the reliability and robustness of the proposed method would still be an advantage).
  5. meshlab已经集成了??202105 !!!

MeshLab 2021.05 is out! · Discussion #992 · cnr-isti-vclab/meshlab · GitHub

https://github.com/cnr-isti-vclab/meshlab/releases

体验其在meshlab中的实验,参考meshlab中代码实现 是否与开源一样,是否有关于加速优化等东西可以借鉴

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值