Vulkan教程翻译之十四 创建 Vertex Buffer

ARM设备运行x86 Unity游戏:Box64+Zink方案实战指南 跨平台应用兼容性是软件开发与系统部署中的常见挑战,其核心在于解决不同硬件架构(如x86与ARM)和软件接口(如DirectX与OpenGL)之间的差异。通过动态二进制翻译和API转换技术,可以在不修改源代码的前提下,实现应用程序在不同平台间的无缝迁移,这极大地扩展了软件的生命周期和硬件适用范围。在ARM架构设备上运行为x86_64 Windows开发的Unity游戏,正是这一技术价值的典型体现。具体实践中,通过组合使用Box64(指令集翻译)、Wine(Windows API转换)和Zink(OpenGL到 阅读详情

原文链接:https://vulkan.lunarg.com/doc/sdk/1.2.131.2/windows/tutorial/html/13-init_vertex_buffer.html

创建 Vertex Buffer

本章节代码文件是 13-init_vertex_buffer.cpp

vertex buffer 是 CPU 和 GPU 都可见的缓冲区,它包含描述你想要渲染的物体网格的顶点数据。一般来说,顶点数据包含位置数据(x,y,z)和可选颜色,法线,或其他信息。像其他 3D API一样,这里的方法是用顶点数据填充缓冲区,然后在绘制操作中传递给 GPU。

创建 Vertex Buffer 对象

创建 vertex buffer 和创建 uniform buffer 几乎是一样的,就像你在 uniform 示例中做过的那样,从创建一个缓冲区对象开始。

VkBufferCreateInfo buf_info = {};
buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
buf_info.pNext = NULL;
buf_info.usage = VK_BUFFER_USAGE_VERTEX_BUFFER_BIT;
buf_info.size = sizeof(g_vb_solid_face_colors_Data);
buf_info.queueFamilyIndexCount = 0;
buf_info.pQueueFamilyIndices = NULL;
buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
buf_info.flags = 0;
res = vkCreateBuffer(info.device, &buf_info, NULL, &info.vertex_buffer.buf);

创建一个 uniform buffer 对象和一个 vertex buffer 对象唯一真正的不同就是 usage 字段的设置。

立方体的数据(g_vb_solid_face_colors_Data)包含了36个顶点,定义了12个三角形,6个立方体面上每个面2个。每个三角形还有关联着表面颜色。你可以检查 cube_data.h 文件来看看实际的数据。

分配 Vertex Buffer 内存

这里也是,步骤和分配 uniform buffer 的步骤很相似。首先查询内存需求,包括考虑到机器限制比如内存对齐。查看示例中的代码就能看到这个过程和 uniform 示例中执行的步骤是很相似的。

把顶点数据存入缓冲区

分配完后,内存就被映射,用顶点数据初始化,再取消映射:

uint8_t *pData;
res = vkMapMemory(info.device, info.vertex_buffer.mem, 0,
                  mem_reqs.size, 0, (void **)&pData);

memcpy(pData, g_vb_solid_face_colors_Data,
       sizeof(g_vb_solid_face_colors_Data));

vkUnmapMemory(info.device, info.vertex_buffer.mem);

作为最后一步,内存被绑定到缓冲区对象上:

res = vkBindBufferMemory(info.device, info.vertex_buffer.buf,
                         info.vertex_buffer.mem, 0);

输入顶点数据的描述

示例按以下顺序排列顶点数据:

struct Vertex {
    float posX, posY, posZ, posW; // Position data
    float r, g, b, a;             // Color
};

你需要创建顶点输入绑定来向GPU描述数据排列顺序。以下的 vi_binding 和 vi_attribs 成员在这里被设置,但是稍后在 subsequent 示例中才被使用作为创建图形管道的一部分。因为你正在看顶点数据格式,最好在这里就了解一下这些代码:

info.vi_binding.binding = 0;
info.vi_binding.inputRate = VK_VERTEX_INPUT_RATE_VERTEX;
info.vi_binding.stride = sizeof(g_vb_solid_face_colors_Data[0]);

info.vi_attribs[0].binding = 0;
info.vi_attribs[0].location = 0;
info.vi_attribs[0].format = VK_FORMAT_R32G32B32A32_SFLOAT;
info.vi_attribs[0].offset = 0;
info.vi_attribs[1].binding = 0;
info.vi_attribs[1].location = 1;
info.vi_attribs[1].format = VK_FORMAT_R32G32B32A32_SFLOAT;
info.vi_attribs[1].offset = 16;

stride 是一个顶点的大小,或者说为获取下一个顶点需要给指针增加的数量。

binding 和 location 成员指向在 GLSL shader 源码里它们各自的值。你可以回顾 shader 示例中的着色器源码来了解对应关系。

即使第一个 attribute 是位置数据,也在attribute 0 的 format 成员中用一个4字节的 float 数据格式来描述它。attribute 1 的 format 更明显是一个颜色格式,因为 atttibute 1 就是颜色。

offset 成员就简单的表明在顶点数据中每个 attribute 在哪里被找到。

绑定 Vertex Buffer 到 Render Pass

你可以先跳过设置 render pass 的大部分代码,因为你会在之后的示例中看到。但是现在,找到绑定 vertex buffer 和 render pass 的代码:

vkCmdBeginRenderPass(info.cmd, &rp_begin, VK_SUBPASS_CONTENTS_INLINE);

vkCmdBindVertexBuffers(info.cmd, 0,             /* Start Binding */
                       1,                       /* Binding Count */
                       &info.vertex_buffer.buf, /* pBuffers */
                       offsets);                /* pOffsets */

vkCmdEndRenderPass(info.cmd);

注意你只能在 render pass 内部将 vertex buffer 和 render pass进行连接;也就是说,在 vkCmdBeginRenderPass 和 vkCmdEndRenderPass 之间录入 command buffer 的时候。这实际上告诉GPU在绘制时使用什么 vertex buffer。

C#跨平台渲染架构:从抽象层到多图形API实战 在现代游戏与图形应用开发中,跨平台渲染是核心技术挑战,它要求同一套渲染逻辑能在DirectX、Vulkan、Metal等不同图形API上高效运行。其核心原理在于构建一个与平台无关的渲染抽象层,通过接口设计封装底层API差异,实现资源管理、状态同步与着色器编译的统一。这一架构的技术价值在于显著提升代码复用率,降低多平台维护成本,并允许开发者专注于渲染算法与效果实现。典型的应用场景包括跨PC、主机和移动设备的游戏开发,以及需要部署到多种环境的实时可视化应用。本文以C#和.NET生态为例,深入探讨了渲染抽象层的具 阅读详情

相关推荐

Godot着色器实例化:3行代码优化百万面场景渲染性能

在实时渲染与游戏开发中,Draw Call(绘制调用)和顶点处理是影响性能的关键瓶颈,尤其当场景需要渲染大量重复模型时。GPU实例化技术通过允许一次性提交单个模型数据与包含所有实例变换信息的数组,将原本需要多次的绘制调用合并为一次,从而大幅降低CPU开销与数据冗余传输。这项技术的核心价值在于显著提升渲染效率,特别适用于开放世界、植被系统、建筑群等需要海量重复对象的应用场景。本文以Godot引擎为例,深入解析如何通过着色器实例化实现性能飞跃,其中涉及顶点着色器与片段着色器的协同工作,以及INSTANCE_ID

weixin_34342905的博客 456

Vulkan vertex buffer绑定过程

代码侧调用vkCmdBindVertexBuffers告诉gpu从哪个binding位置读取顶点数据(即vkCmdBindVertexBuffers的firstBinding参数,与shader中layout的binding完全没关系,这点在后面的descriptor章节再讲)。本例画6个三角形,对于编号i的三角形,会读取顶点数据vertices[0],vertices[1],vertices[2]以及中心点位置instancePosData[i]。gpu知道了从哪里读数据,但是怎么读?

程序人生的专栏 1111

揭秘glDrawElements:从CPU到GPU的绘制全链路

核心认知——表面是一行 C 函数调用,但它不是"立即把三角形画出来",而是"记录一条绘制命令塞进队列",CPU 调用完就返回继续往下跑,GPU 在后面异步执行。它经历五大阶段:① 用户态驱动——这个函数其实是指向显卡驱动(NVIDIA/AMD/Intel)实现的函数指针,进入后驱动要做参数验证(着色器绑了吗、顶点数据有效吗、count 合法吗)和状态脏检查(自上次 DrawCall 哪些状态改了);

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 439

vulkan学习笔记十九

创建指令缓冲对象VkCommandBuffer

hometoned的博客 693

顶点缓存数组(Vertex Buffer Object)的示例程序

顶点缓存数组(Vertex Buffer Object)的示例程序 VBO允许把顶点数据存储在GPU缓存中,并且只传输一次,前提是有足够的内存资源可以保存这些顶点数据。

利用python-docx提取word的高亮部分

利用python-docx提取word的高亮部分 没有找到分享的文档,于是就自己研究了一下。 可以通过python里的python-docx去提取word内的高亮文本。 file=docx.Document(filepath) for para in file.paragraphs: for i in para.runs: #i.font.highlight_color设置了高亮颜色 if i.font.highlight_color is not None:

double_0221的博客 1809

vulkan中vertex buffer的用法

-Vulkan的资源(buffer或者image)都用descriptor表示,vertex buffer也是以descriptor的形式来分配和使用的 下面讲的是如果使用vertex buffer来向shader传递顶点数据 1.准备vertex数据     const float vb[3][5] = {         /*      position             tex

arag2009的学习专栏 2577

C2000 ePWM与SDFM同步配置:从寄存器到Driverlib实战解析

在嵌入式实时控制系统中,脉宽调制(PWM)是实现电机驱动、数字电源等应用的核心技术,其信号质量和时序精度直接决定了系统性能。为实现精确控制,PWM信号常需与模数转换器(ADC)或Sigma-Delta滤波器(SDFM)的采样时刻严格同步,以消除开关噪声并获取准确的反馈信号。其技术原理在于通过硬件同步机制,将PWM的特定时间点(如周期中心)作为触发源,控制数据采集的启动时刻。这种硬件级同步能有效提升闭环控制的稳定性和动态响应速度,广泛应用于伺服驱动、变频器等高性能场景。本文聚焦于TI C2000系列微控制器,

weixin_33692284的博客 441

Vulkan学习--16.创建索引缓冲

绘制一个矩形可以通过绘制两个三角形来实现,如果不共享顶点,就需要 6 个顶点。共享顶点的话,只需要 4 个顶点就可以。可以想象对于更加复杂的三维网格,通过共享顶点可以节约大量内存资源。 索引缓冲是一个包含了指向顶点缓冲中顶点数据的索引数组的缓冲。使用索引缓冲,我们可以对顶点数据进行复用。上图演示了索引缓冲的原理,顶点缓冲中包含每一个独一无二的顶点的数据,索引缓冲使用顶点缓 冲中顶点数据的索引来引...

yuxing55555的博客 696

Emscripten安装(wasm编译)

5:配置对应环境变量--替换成自己对应的安装路径(2025最新的Emscripten工具链默认使用LLVM/WebAssembly标准工作流,java依赖已经移除了,所以以下java环境不配,需要使用java的手动添加即可---->emsdk install java-8-152-64bit。3:下载相应的依赖库---->emsdk install latest(我这里下的是最新的,如果有指定版本,把latest替换成版本号即可)6:测试是否成功---> emcc- v/em++ -v。

qq_31578301的博客 554

保姆级教程:在Ubuntu 21.04上搞定USRP X410的UHD 4.1驱动与Gnuradio 3.9安装(含虚拟机网络避坑指南)

本文提供在Ubuntu 21.04上配置USRP X410的UHD 4.1驱动与Gnuradio 3.9的详细教程,涵盖虚拟机网络设置、依赖安装、源码编译及常见问题解决方案,帮助开发者高效搭建SDR开发环境。

weixin_27869497的博客 271

Vertex buffers/Vertex buffer creation

Vulkan Tutorial 阅读记录(机翻)

J__yaoyao 的博客 569

SAP各模块表清单及逻辑关系介绍

分享韩国同行总结的各模块的表清单及逻辑关系,这对ABAP顾问和各模块业务顾问应该非常有用的 物料主数据 SD与MM PS模块 PP模块 QM模块 CO模块 FI模块

weixin_40672823的博客 9599

Vulkan教程翻译之九 Descriptor Set Layouts 和 Pipeline Layouts

原文链接:https://vulkan.lunarg.com/doc/sdk/1.2.131.2/windows/tutorial/html/08-init_pipeline_layout.html Descriptor Set Layouts 和 Pipeline Layouts 这一章节的代码文件是08-init_pipeline_layout.cpp 在之前的示例中,你创建过一个 uniform buffer,但是你还没有做任何事情来描述它如何被 shader 使用。你是知道的,该缓冲区里包含.

Bleach3的博客 1711

verilog CORDIC对数运算

verilog CORDIC对数运算

m0_64355812的博客 1735

使用 MATLAB/Simulink + Communications Toolbox + 5G Toolbox,构建一个2×2 MIMO-OFDM通信系统

本文通过Simulink+CommunicationsToolbox构建2×2 MIMO-OFDM通信系统,重点实现信道均衡滤波器(ZF与MMSE)的设计与应用。详细介绍了系统架构、建模步骤(包括信道估计、均衡器实现)和仿真场景设计,通过BER、星座图和EVM对比分析验证了MMSE均衡器在抑制噪声和信号恢复方面的优势。文章总结了MIMO均衡的核心原理与实践经验,并提出了扩展至大规模MIMO、深度学习均衡器等优化方向,为无线通信系统设计提供实用指导。

amy_mhd的博客 125

2025年最全面的Vulkan中文教程:从零基础到精通图形渲染

你是否还在为学习现代图形API而苦恼?是否想深入了解高性能跨平台图形编程的核心技术?本文将带你全面掌握Vulkan(图形处理器通用计算接口)的核心概念与实战技巧,通过系统学习,你将能够独立开发高性能的图形应用程序,无论是游戏开发、虚拟现实还是科学可视化领域都能游刃有余。读完本文,你将获得:Vulkan环境搭建的完整步骤、核心API的深入解析、渲染管线的优化技巧、以及实际项目开发中的最佳实践。 #...

gitblog_00094的博客 502

高通平台蓝牙学习-- 基于WCN6750 Bluetooth 5.2的讲解

摘要:蓝牙5.2解决方案WCN6750具备多项先进特性:完全兼容5.2标准及ANT+协议,支持2Mbps高速BLE和长距离传输;采用射频集成方案,与WLAN共享天线并支持5G并发;内置功率放大器,支持Class1/2传输;提供双音频流和Slimbus接口优化。其HCI UART接口支持3.2Mbps速率,通过BlueZ协议栈实现蓝牙5.2功能,包括2Mbps模式和长距离传输,符合核心规范要求。(149字)

专业开发者的博客,一个从事Android WiFi和蓝牙的工程师 3万+

Vulkan-tutorial-rs与C++对比:600行Rust vs 950行C++的Vulkan实现

在图形编程领域,**Vulkan**作为现代高性能图形API,以其强大的功能和跨平台特性赢得了开发者的青睐。然而,Vulkan的复杂性也让人望而却步——冗长的初始化代码、繁琐的资源管理、容易出错的手动内存管理,这些都是初学者需要克服的障碍。今天,我们将深入探讨一个令人惊叹的项目:**vulkan-tutorial-rs**,这是用Rust语言重写的Vulkan教程,它展示了如何用更少的代码(约60

gitblog_00657的博客 745

数学建模模型总结

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

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

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

Vulkan图形编程:从零到一的现代渲染技术深度指南

Vulkan作为新一代图形API,正在彻底改变高性能图形编程的游戏规则。与传统的OpenGL相比,Vulkan提供了更低的开销、更精细的控制和更好的多线程支持,使其成为现代游戏引擎、虚拟现实和科学可视化应用的理想选择。通过VulkanTutorialCN这个中文教程项目,开发者可以系统学习这一革命性技术,掌握构建高性能跨平台渲染应用的核心技能。 ## 为什么现代开发者需要学习Vulkan? #

gitblog_01007的博客 142

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Nabla扩展生态解析:MultiDrawIndirect加持的ImGui为何只需一个drawcall

Nabla 是面向 PC/Linux/Android 的模块化渲染库与框架,深度整合 Vulkan、OptiX 和 CUDA。在其丰富的扩展生态中,ImGui 扩展是最具代表性的性能范例——它基于 **MultiDrawIndirect** 间接绘制技术,让整个 ImGui 界面只需 **一个 drawcall** 就能完成渲染。本文将拆解其实现原理,帮助新手理解这场"多指令合一"的渲染革命。

gitblog_00591的博客 323

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

vulkanizer描述符系统详解:SPIRV-Reflect自动布局生成与push描述符更新模板

vulkanizer 是一个基于 Vulkan 1.3 的进阶渲染引擎原型,它能用几毫秒渲染数十亿三角形。它的最大亮点之一是:**完全由 SPIRV-Reflect 自动生成描述符集布局,配合描述符更新模板(Descriptor Update Template)与 push descriptors 扩展,彻底绕开了传统的 VkDescriptorPool / VkDescriptorSet 分配与

gitblog_01166的博客 989

告别卡顿!Cemu图形优化全指南:渲染管线与着色器调优策略

你还在为Wii U模拟器画面卡顿、帧率不稳而烦恼吗?作为一款强大的Wii U模拟器(Wii U emulator),Cemu通过精准的硬件模拟让玩家在PC上体验主机游戏,但复杂的图形渲染流程常成为性能瓶颈。本文将从渲染管线架构到着色器缓存优化,手把手教你释放显卡潜力,让《塞尔达传说:荒野之息》等大作稳定60帧运行。读完本文,你将掌握: - Cemu渲染管线的工作原理与关键优化点 - 着色器缓存合并...

gitblog_00643的博客 1207

C++/C#游戏引擎与图形库实战:从架构选型到性能调优

游戏引擎是现代游戏开发的核心框架,它整合了图形渲染、物理模拟、音频处理等模块,为开发者提供高效的内容创作环境。其工作原理基于实体组件系统(ECS)等架构模式,通过数据与逻辑分离提升性能。在技术价值上,引擎不仅加速了开发流程,还通过底层图形API(如DirectX、Vulkan)的优化调用,实现了跨平台的高性能渲染。应用场景广泛,从3A大作到独立游戏,都依赖引擎处理复杂的实时图形计算与资源调度。本文聚焦于C++和C#在引擎开发中的实战协作,探讨了在Unity和Unreal Engine等商业引擎中,如何通过P

aaa1231722的博客 432

Citra 3DS模拟器终极配置实战手册:性能翻倍与深度调优指南

Citra作为一款开源的高性能Nintendo 3DS模拟器,通过精准的CPU模拟、GPU渲染优化和内存管理技术,为PC用户提供原汁原味的掌机游戏体验。本实战手册将深入解析Citra的核心架构、多线程优化配置、图形渲染调校和性能瓶颈突破,帮助你从基础配置到专家级调优全面掌握这款强大的模拟器工具。 ## 快速上手:构建你的3DS游戏环境 ### 系统要求与基础部署 在开始Citra配置之前,确

gitblog_01164的博客 1046

Qt 6着色器编译全解析:从GLSL到SPIR-V的跨平台图形开发实践

着色器编译是现代图形编程的核心环节,它负责将人类可读的着色器代码转换为GPU可执行的指令。其原理在于通过编译器前端进行语法语义分析,再经优化器生成高效的中间字节码,最终适配不同图形API。这一流程的技术价值在于将运行时的不确定性转化为构建时的确定性,从而确保跨平台渲染的一致性与性能。在应用场景上,它尤其适用于Vulkan、Metal、Direct3D 12等现代图形API的跨平台项目,能够有效解决不同GPU驱动行为差异和API适配的难题。本文聚焦于Qt 6 Shader Tools模块,深入探讨其如何通过集

culuo8053的博客 457
上一篇: 利用 OpenCV 转换图片颜色格式
下一篇: Vulkan教程翻译之十五 创建Graphics Pipeline
Bleach3
博客等级 码龄15年 29粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值