Vulkan 开发(十三):Vulkan 帧缓冲区(FrameBuffer)

vulkan从小白到专家——RenderPass&Framebuffer 渲染最重要的就是每帧的执行逻辑,一帧包含多个renderPass。如果pipeline跟drawcall对应,那么renderPass是包含了一组pipeline。RenderPass定义了vulkan渲染过程中要使用到的三种Object的细节,分别是。 阅读详情

Vulkan 系列文章:

1. 开篇,Vulkan 概述

2. Vulkan 实例

3. Vulkan 物理设备

4. Vulkan 设备队列

5. Vulkan 逻辑设备

6. Vulkan 内存管理

7. Vulkan 缓存

8. Vulkan 图像

9. Vulkan 图像视图

10. Vulkan 窗口表面(Surface)

11. Vulkan 交换链

12. Vulkan 渲染通道


Vulkan 帧缓冲区

Vulkan 帧缓冲区(Framebuffer)是一个容器对象(资源管理类型的对象),包含了一组图像视图(Image Views),用于在渲染通道(Render Pass)中作为附件(Attachments)进行渲染。

每个帧缓冲区的附件与渲染通道的附件描述(Attachment Description)相对应,它们共同定义了渲染的目标,重点强调一下,附件必须与渲染通道的附件描述匹配。

帧缓冲区在 Vulkan 中的概念类似于 OpenGL 的帧缓冲对象(FBO),每个帧缓冲区包含一组图像视图,这些图像视图表示实际的图像资源,可以是颜色附件、深度附件或模板附件,帧缓冲区用于将渲染输出写入这些图像中(存储渲染通道(Render Pass)输出的图像)。

在 Vulkan 中,每个帧缓冲区至少需要一个颜色附件,而这个颜色附件可以是与 SwapChain 关联的 ImageView。

创建 Vulkan 帧缓冲区

帧缓冲区的创建过程通常涉及以下步骤:

  1. 确定帧缓冲区需要兼容的 RenderPass(前文中已经讲过),因为 RenderPass 定义了渲染操作的结构和执行顺序,以及所需的附件的数量、类型和格式。

  2. 为每个 SwapChain 图像创建对应的 ImageView (前文中已经讲过),因为最终渲染的图像需要显示在屏幕上,SwapChain 的 ImageView 就是用来呈现到屏幕上的。

  3. 使用 VkFramebufferCreateInfo 结构体来创建 Framebuffer,指定渲染通道、附件个数、附件信息、宽度、高度和层数等参数。

用于创建帧缓冲区(Framebuffer)的结构体 VkFramebufferCreateInfo :

 1typedef struct VkFramebufferCreateInfo {
 2    VkStructureType          sType;         // 必须是 VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO
 3    const void*              pNext;         // 指向扩展结构的指针,通常为 nullptr
 4    VkFramebufferCreateFlags flags;         // 帧缓冲区创建标志,目前保留,必须为 0
 5    VkRenderPass             renderPass;    // 与帧缓冲区相关联的渲染通道(Render Pass)
 6    uint32_t                 attachmentCount; // 帧缓冲区的附件数量
 7    const VkImageView*       pAttachments;  // 指向 VkImageView 的指针数组,每个指针指向一个附件
 8    uint32_t                 width;         // 帧缓冲区的宽度
 9    uint32_t                 height;        // 帧缓冲区的高度
10    uint32_t                 layers;        // 帧缓冲区的层数(通常为 1)
11} VkFramebufferCreateInfo;

创建包含颜色、深度模版附件的帧缓冲区:

 1// 创建交换链图像视图(作为颜色附件)
 2std::vector<VkImageView> swapChainImageViews(swapChainImages.size());
 3for (size_t i = 0; i < swapChainImages.size(); i++) {
 4    VkImageViewCreateInfo createInfo = {};
 5    createInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
 6    createInfo.image = swapChainImages[i]; // 交换链图像
 7    createInfo.viewType = VK_IMAGE_VIEW_TYPE_2D; // 2D 图像视图
 8    createInfo.format = swapChainImageFormat; // 图像格式
 9    createInfo.components.r = VK_COMPONENT_SWIZZLE_IDENTITY; // 红色分量
10    createInfo.components.g = VK_COMPONENT_SWIZZLE_IDENTITY; // 绿色分量
11    createInfo.components.b = VK_COMPONENT_SWIZZLE_IDENTITY; // 蓝色分量
12    createInfo.components.a = VK_COMPONENT_SWIZZLE_IDENTITY; // 透明度分量
13    createInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; // 颜色附件
14    createInfo.subresourceRange.baseMipLevel = 0; // 基础 mip 级别
15    createInfo.subresourceRange.levelCount = 1; // mip 级别数量
16    createInfo.subresourceRange.baseArrayLayer = 0; // 基础数组层
17    createInfo.subresourceRange.layerCount = 1; // 数组层数量
18
19    if (vkCreateImageView(device, &createInfo, nullptr, &swapChainImageViews[i]) != VK_SUCCESS) {
20        throw std::runtime_error("failed to create image views!");
21    }
22}
23
24//创建深度模版图像视图
25VkImage depthStencilImage;//假设已经创建好
26VkImageView depthStencilImageView;
27VkImageViewCreateInfo viewInfo = {};
28viewInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
29viewInfo.image = depthStencilImage;
30viewInfo.viewType = VK_IMAGE_VIEW_TYPE_2D;
31viewInfo.format = depthFormat;
32viewInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
33viewInfo.subresourceRange.baseMipLevel = 0;
34viewInfo.subresourceRange.levelCount = 1;
35viewInfo.subresourceRange.baseArrayLayer = 0;
36viewInfo.subresourceRange.layerCount = 1;
37
38if (vkCreateImageView(device, &viewInfo, nullptr, &depthStencilImageView) != VK_SUCCESS) {
39    throw std::runtime_error("failed to create depth image view!");
40}
41
42
43// 创建帧缓冲区
44std::vector<VkFramebuffer> swapChainFramebuffers(swapChainImageViews.size());
45for (size_t i = 0; i < swapChainImageViews.size(); i++) {
46    std::array<VkImageView, 2> attachments = {
47        swapChainImageViews[i],   // 颜色附件
48        depthStencilImageView     // 深度模板附件
49    };
50
51    VkFramebufferCreateInfo framebufferInfo = {};
52    framebufferInfo.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
53    framebufferInfo.renderPass = renderPass; // 前文创建好的渲染通道
54    framebufferInfo.attachmentCount = static_cast<uint32_t>(attachments.size()); // 附件数量
55    framebufferInfo.pAttachments = attachments.data(); // 附件数组数据
56    framebufferInfo.width = swapChainExtent.width; // 帧缓冲区宽度
57    framebufferInfo.height = swapChainExtent.height; // 帧缓冲区高度
58    framebufferInfo.layers = 1; // 层数量
59
60    if (vkCreateFramebuffer(device, &framebufferInfo, nullptr, &swapChainFramebuffers[i]) != VK_SUCCESS) {
61        throw std::runtime_error("failed to create framebuffer!");
62    }
63}
64
65// Vulkan 编程。。。
66
67// 销毁帧缓冲区
68for (size_t i = 0; i < swapChainFramebuffers.size(); i++) {
69    vkDestroyFramebuffer(device, swapChainFramebuffers[i], nullptr);
70}
71
72// 销毁交换链图像视图
73for (size_t i = 0; i < swapChainImageViews.size(); i++) {
74    vkDestroyImageView(device, swapChainImageViews[i], nullptr);
75}
76
77// 销毁深度模板图像视图
78vkDestroyImageView(device, depthStencilImageView, nullptr);
从KVM虚拟化到Openstack云化架构综述 目录 摘要 OpenStack的虚拟化技术 OpenStack架构介绍 Nova Swift KeyStone Neutron Glance Cinder Ceilometer Heat 摘要 这两年的工作中,接触到公有云和私有云的项目还不少。起初对于Openstack的了解,仅停留在其几大组件的交互上,如Nova、Neutron、Glance等,以及对各大云厂商功能点上... 阅读详情

相关推荐

AI 代码生成工具的质量评估体系

基础需求层包括响应速度(Response Time)和界面友好性(UI Friendliness),期望需求层涵盖智能提示(Smart Suggestions)和个性化配置(Personalization),兴奋需求层则涉及多模态交互(Multimodal Interaction)和代码进化(Code Evolution)。在金融领域,代码审计合规性(Compliance Audit)权重应提升至40%,而在Web开发中,API兼容性(API Compatibility)的权重需达到35%。

2503_92418637的博客 3372

Vulkan帧缓冲区

一、简介 我们在创建渲染流程对象时指定使用的附着需要绑定在帧缓冲对象上使用。帧缓冲对象引用了用于表示附着的 VkImageView 对象。对于我们的程序,我们只使用了一个颜色附着。但这并不意味着我们只需要使用一张图像,每个附着对应的图像个数依赖于交换链用于呈现操作的图像个数。我们需要为交换链中的每个图像创建对应的帧缓冲,在渲染时,渲染到对应的帧缓冲上。 二、帧缓冲实例分析 基本的Vulkan编程流...

weixin_38498942的博客 1082

保姆级教程:用Python和PyTorch复现PTB-XL心电信号分类论文(附完整代码)

本文提供了一份详细的PTB-XL心电信号分类教程,涵盖从数据预处理到模型优化的完整流程。通过PyTorch实现三种深度学习架构(Conv1D、SincNet和熵特征融合网络),并针对医疗AI特有的类别不平衡问题提供解决方案。教程包含可运行的代码示例,帮助开发者快速复现论文结果并应用于实际心电信号分析场景。

weixin_30555125的博客 405

Vulkan中的SwapChain、FrameBuffer和RenderPass:概念理解及关系

实际上,imageView并没有直接存储图像数据,你可以将其比喻为一个"窗口",你可以透过这个窗口看到图像的一部分,同时指定这个窗口的属性,比如窗口的大小、位置等。SwapChain提供了可以呈现到屏幕上的图像和图像视图,FrameBuffer关联了这些图像视图,并指定了RenderPass,RenderPass定义了渲染操作的步骤和依赖关系。总体而言,framebuffer 的附件设置是根据你的渲染需求而定的,但通常会包括至少一个与 swapchain 相关的颜色附件。如果你有其他需要渲染的内容,例如。

记录值得记录的东西 2719

什么是深度展开网络?如何将迭代算法的每一次迭代展开成深度网络对应的一层?深度展开网络进行端对端训练,其中端对端是什么意思?

在深度学习和机器学习的背景下,“端到端”(End-to-end)训练指的是将输入数据直接映射到最终输出的过程,而不需要任何中间的手动数据预处理或特征工程。- **自然语言处理**:端到端自然语言处理系统可以将自然语言输入直接转化为计算机可理解的语言输出,而不需要对语言进行分解和转化。- **推荐系统**:通过使用深度神经网络,端到端推荐系统可以直接根据用户历史行为预测其未来的兴趣爱好,并推荐相应的产品或服务。4. **直接映射**:从输入到输出的直接映射,中间没有任何拆分或分解的过程。

m0_67897882的博客 5433

01 Python学习总结:Python简介及入门

Python 是一门高级编程语言,以其简洁、易读和强大的功能而广受欢迎。它适用于多种应用场景,包括 Web 开发、数据分析、人工智能、自动化脚本等。以下是 Python 的简介及入门知识总结,帮助你快速了解并开始学习 Python。

数据知道的博客 1万+

Vulkan教程翻译之十三 创建 Framebuffer

原文链接:https://vulkan.lunarg.com/doc/sdk/1.2.131.2/windows/tutorial/html/12-init_frame_buffers.html 创建 Framebuffer 本章节的代码文件是12-init_frame_buffers.cpp Vulkan Framebuffer Framebuffer 代表了一个 render pass 实例中使用的内存附件的集合。这些内存附件的例子包括我们在前面示例中创建的 color image buffe.

Bleach3的博客 1354

OPTEE:TA命令操作的实现(三)

上文我们创建好了通道,现在就是操作,怎么操作TA呢?REE侧的CA执行创建会话操作成功后,CA就可使用获取到的调用来让TA执行特定的命令。通过ioctl的系统调用发送到OP-TEE的驱动中,保存在共享内存中,并触发安全监控模式调用(smc)切换到Monitor模式(ARMv7)或EL3(ARMv8)中进行安全世界状态的处理。

叫好与叫座虽然不是对立面,但想在同一个作品中达到双重效果很难。 1268

Vulkan 学习(13)---- Vulkan Framebuffer&Command Buffer

每个帧缓存区包含一组图像视图,这些图像视图表示实际的图像资源,可以是颜色附件,深度附件或者模板附件,帧缓冲区用于将渲染输出写入到这些图像中(就是用于存储渲染通道(上执行,可以执行不同类型的工作,包括绑定顶点缓存、绑定流水线、录制渲染通道指令、设置视口和裁切矩形,设置绘制指令,执行。):不能直接提交给队列,必须嵌套在主指令缓存中执行,可以用于记录可重用的指令或者多线程录制指令。每个帧缓冲区的附件和渲染通道的附件描述相对应,它们共同定义了渲染的目标。指令缓存可以是一直存在的,只需创建一个,就可以一直反复使用。

小猪佩奇的博客 1318

华为OD机试 - 第k个排列 - 全排列递归(Python/JS/C/C++ 2025 C卷 100分)

给定参数n,从1到n会有n个整数:1,2,3,…,n,这n个数字共有n!按大小顺序升序列出所有排列的情况,并一一标记当n=3时,所有排列如下“123”,“132,“213”,“231”,“312”,“321”输入两行,第一行为n,第二行为k,给定n的范围是[1,9],给定k的范围是[1,n!排列为“12”和“21”,第2个是“21”。给定n和k,返回第k个排列。输出排在第k位置的数字。只有一个排列,直接返回。

学Java,找哪吒 983

融合Retinex理论与Transformer的YOLOv8低光照目标检测增强方法【YOLOv8】

图像分解:将输入图像分解为光照成分和反射成分。光照估计:估计光照图以消除暗光区域。图像重建:将光照增强后的反射图像重建成最终图像。Retinexformer通过在Transformer中引入Retinex的图像增强思路,使得低光照图像的细节能够得到充分保留。本文提出了一种基于Retinexformer的低光照增强方法,用于改进YOLOv8模型在夜间和低光照环境下的目标检测性能。

博客 1929

Vulkan编程指南翻译 第七章 图形管线 第3节 帧缓冲区

7.3  Framebuffer 帧缓冲区是一个用来表示一些存储渲染结果的图像的对象。这影响管线最后几个阶段:深度和stencil测试,混合,logic 操作,多采样等等。一个帧缓冲区对象通过使用renderpass的引用来创建,可以和多个有类似附件排放的renderpass一同使用。调用vkCreateFramebuffer()可创建一个帧缓冲区对象,其原型如下:          VkRe

know yourself 1136

Android15 修改触摸点上限为40

把MAX_POINTER_ID从默认的31修改为39,这里为什么要从31修改为39,是因为上面说明用BitSet32极限就只能支持32个点,因为从最小的ID是0,所以要支持40个点ID也要对应改为39.最近有个需求,需要修改Android系统的触摸点数,Android系统默认的点数是16个点,因为现在是大屏项目,有客户需要修改为40个点,好吧,客户最大。6.最后进行编译,开机开启触摸点检测,可以使用开发者模式中的显示触摸点功能,再叫上3个人,用双掌触摸屏幕,发现左上角有显示40个触摸点,修改成功。

tzj1058756809的博客 573

Vulkan填坑学习Day14—帧缓冲区

Vulkan 帧缓冲区,我们在前面的章节中已经讨论了很多次framebuffers帧缓冲区,到目前为止我们配置了render pass渲染通道并希望输出一个与交换链图像格式一致的帧缓冲区,但是我们实际上还没有创建。 在render pass创建阶段我们指定了具体的附件,并通过VkFramebuffer对象包装绑定。帧缓冲区对象引用表示为附件的所有的VkImageView对象。在我们的例子中只会使...

qq_35312463的博客 870

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Vulkan笔记(十三)-帧缓冲区与命令池命令缓冲区

帧缓冲区(Framebuffer)是 Vulkan/D3D12/OpenGL 中的核心对象,用于存储渲染结果的最终目标(即“画布”)。命令池负责为命令缓冲区分配和回收内存,避免频繁的内存申请/释放开销。(Color Attachments):存储像素颜色(输出到屏幕或纹理)。:可同时绑定多个颜色附件(如延迟渲染中的 G-Buffer)。(创建时指定队列族),确保命令缓冲区在正确的线程中录制和提交。命令缓冲区寿命短(每帧或频繁重置),驱动会优化内存分配。分配命令池(Command Pool)和命令缓冲区。

u012415226的博客 1059

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

初识Vulkun(11):帧缓冲区(FrameBuffers)

创建帧缓冲区

weixin_44200074的博客 1178

STM32F407中文手册

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

Vulkan入门(8)-帧缓冲区和指令缓冲区.md

文章目录参考资料简述一. VkFramebuffer 创建帧缓冲区二. Command buffers 指令缓冲区2.1 Command pools 指令池2.1.1 创建指令池2.1.2 VkCommandPoolCreateInfo2.1.3 VkCommandPoolCreateFlags2.1.4 vkDestroyCommandPool2.2 Command buffer allocation 指令缓冲区分配2.2.1 vkAllocateCommandBuffers2.2.2 VkCommand

SwallowJoe的博客 1745

[Vulkan 学习之路] 14 - 帧缓冲区 (Framebuffers):给画作装裱

本文介绍了Vulkan渲染前的关键准备步骤——创建帧缓冲区(Framebuffer)。主要内容包括:1. 帧缓冲区的作用是将RenderPass与SwapChain中的具体图像视图(ImageView)绑定,建立一对一的映射关系;2. 创建过程需要为每个SwapChain图像视图单独创建对应的帧缓冲区;3. 帧缓冲区创建必须在RenderPass和Pipeline之后进行,并在销毁时遵循正确的顺序;4. 至此已完成Vulkan渲染的所有基础设施准备,包括实例、设备、交换链、渲染流程和管线等。

wang的博客 436

Vulkan Tutorial 4

我们已经将渲染传递设置为期望一个与交换链图像格式相同的单一帧缓冲,但我们还没有实际创建任何图像。在渲染过程创建期间指定的附件通过将它们包装到一个对象中来绑定。帧缓冲区对象引用代表附件的所有对象。

qq_41061477的博客 1242

Vulkan Cookbook 第六章 5 创建一个帧缓冲区

创建渲染过程 译者注:示例代码点击此处 帧缓冲区与渲染过程一起使用。 它们指定应该为渲染过程中定义的相应附件使用哪些图像资源。 它们还定义了可渲染区域的大小。 这就是为什么当我们想要记录绘图操作时,不仅需要创建渲染过程,还需要创建帧缓冲。 怎么做... 1.获取应与framebuffer兼容的渲染过程的句柄,并使用它来初始化名为render_pass的VkRenderPass类型的变量。 ...

qq_19473837的博客 463

绘制图片-vulkan

文章目录1、Framebuffers 帧缓冲区2、Command buffer命令缓冲区2.1 Command Pool命令池 1、Framebuffers 帧缓冲区 1、帧缓冲区与交换链的关系和区别? 帧缓冲区含有一个和交换链大小格式相同的attachments附件和渲染通道,附件中是帧缓冲区已有的颜色,交换链中的图片经过渲染和与帧缓冲区已有颜色混合,重新放回交换链? 问题:Vulkan 没有 默认帧缓冲区的概念,因此需要交换链来拥有将渲染的缓冲区,使得图片能在屏幕上可视化。那么图片渲染之后放置到哪里?

梁新怡的博客 890

Vulkan学习(十三): Depth Buffering

目录Depth BufferingDepth image and view Depth Buffering 有两种方法: 从后到前按深度对所有绘制调用进行排序 使用深度缓冲区进行深度测试   第一种方法通常用于绘制透明对象,因为与顺序无关的透明度很难进行深度检测。 按深度对片段进行排序的问题通常使用深度缓冲区来解决。    Vulkan的深度值范围是0 to 1。使用定义GLM_FORCE_DEPTH_ZERO_TO_ONE 因为OpenGL为-1 to 1 #define GLM_FORCE_RADI

jiamada的博客 916

Vulkan 1.3 动态渲染(Dynamic Rendering):彻底告别 RenderPass 与 Framebuffer 的历史包袱

在 Vulkan 1.0 发布之初,每一个试图将自研渲染器迁移到 Vulkan 的图形工程师,都会被其极其繁琐且冗长的“样板代码巨兽(Boilerplate Beast)”折磨得身心俱疲。其中最反人类、耦合度最高的设计,莫过于显式的。

rain_sxr的博客 2063

Vulkan Cookbook 第六章 渲染过程和帧缓冲区

渲染过程和帧缓冲区 本章中,我们将介绍一下内容: 指定附件描述 指定子过程描述 指定子过程之间的依赖关系 创建渲染过程 创建一个帧缓冲区 为几何渲染和后处理准备渲染过程subpasses 使用颜色和深度附件准备渲染过程和帧缓冲 开始渲染过程 进入下一个子过程 结束渲染过程 销毁帧缓冲区 销毁渲染过程 介绍 在Vulkan中,绘图命令被组织成渲染过程。渲染过程是一组子视...

qq_19473837的博客 507

Vulkan学习笔记(7):绘制三角形之绘制

摘要 本文介绍了Vulkan中帧缓冲区和命令缓冲区的创建过程。帧缓冲区通过绑定图像视图作为附件与渲染通道配合使用,需要为交换链中的每个图像创建单独的帧缓冲区。命令缓冲区则用于记录和执行绘图指令,需要先创建命令池来管理内存分配。文章详细说明了创建帧缓冲区数组和命令缓冲区的步骤,包括相关参数配置和资源清理。这些组件是实现Vulkan渲染管线的基础,为后续绘制操作做好准备。

闹中取静的专栏 890

Vulkan填坑学习Day12—渲染通道

Vulkan 渲染通道 Vulkan 渲染通道,在我们完成管线的创建工作之前,我们需要告诉Vulkan渲染时候使用的framebuffer帧缓冲区附件相关信息。我们需要指定多少个颜色和深度缓冲区将会被使用,指定多少个采样器被用到及在整个渲染操作中相关的内容如何处理。所有的这些信息都被封装在一个叫做 render pass 的对象中。 一、设置 我们新添加一个createRenderPass函数,在...

qq_35312463的博客 1296
上一篇: Android Java 版本的 MSAA OpenGL ES 多重采样
下一篇: 关于 OpenGL 的上下文、线程和共享上下文之间的关系
字节流动
字节流动 优质创作者: 编程框架技术领域 优质创作者: 编程框架技术领域 领域专家: 嵌入式与硬件开发技术领域 领域专家: 嵌入式与硬件开发技术领域
博客等级 码龄11年 1912粉丝 168原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

字节流动

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值