当前位置: 首页 > article >正文

WebGPU顶点插槽(Vertex Buffer Slot)使用指南

        本文将通过完整代码示例和逐行注释,详细解释WebGPU中顶点缓冲区的配置方法,特别针对shaderLocation参数与着色器的对应关系进行重点说明。


一、顶点数据定义与缓冲区创建

// 定义顶点数据结构(逻辑层)
// 包含位置(position)、颜色(color)、UV坐标(uv)三个属性 
const vertexData = new Float32Array([// 位置(x,y,z)  颜色(r,g,b,a)       UV(u,v)-0.5, -0.5, 0,   1, 0, 0, 1,     0, 0,0.5, -0.5, 0,    0, 1, 0, 1,     1, 0,0, 0.5, 0,       0, 0, 1, 1,     0.5, 1 
]);// 创建GPU顶点缓冲区 
const vertexBuffer = device.createBuffer({ size: vertexData.byteLength,   // 数据总字节数(36字节/顶点 * 3顶点 = 108字节)usage: GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST,mappedAtCreation: true 
});
new Float32Array(vertexBuffer.getMappedRange()).set(vertexData); 
vertexBuffer.unmap(); 

usage值参阅:

了解 WebGPU 中的 GPUBufferUsage

关键代码解释

new Float32Array(vertexBuffer.getMappedRange()).set(vertexData); 

        这段代码的作用是将vertexData写入到已映射的vertexBuffer中,随后解除映射以供GPU使用。以下是关键点的解释:

临时视图的作用
  1. vertexBuffer.getMappedRange()返回一个映射到CPU内存的ArrayBuffer
  2. new Float32Array(...)创建了一个临时的Float32Array视图,用于操作这个ArrayBuffer
  3. set(vertexData)vertexData的数据直接复制到该视图中,从而写入底层ArrayBuffer(即vertexBuffer的内存)。
无需变量的原因
  1. Float32Array仅用于一次性写入操作,不需要后续访问。写入完成后,临时对象会被垃圾回收,无需保留引用。
  2. 代码简洁性:直接链式调用避免了额外的变量声明,减少冗余。
内存映射流程
  1. 映射getMappedRange)使vertexBuffer的GPU内存可被CPU访问。
  2. 写入数据通过临时Float32Array完成。
  3. 解除映射unmap)后,数据对GPU可见,且vertexBuffer可提交给GPU使用。
潜在影响
  1. 性能影响:临时对象创建的开销极小,远低于数据复制的耗时,对性能无显著影响。
  2. 代码可读性:虽然直接链式调用更简洁,但若需多次操作同一视图,保留变量会更高效。

        总之,利用临时Float32Array视图高效写入数据,无需变量引用,代码简洁且符合WebGPU数据操作的最佳实践。


二、顶点缓冲区布局配置

        顶点缓冲区的布局(vertex buffer layout)在WebGPU中用于描述每个顶点缓冲区的结构。下面代码中的vertexBuffersLayout是一个数组,每个元素对应一个顶点缓冲区的布局配置。为什么是数组呢?因为一个渲染管线可以绑定多个顶点缓冲区。例如,第一个缓冲区存位置,第二个存颜色,第三个存法线等等。每个缓冲区可以有不同的步幅(stride)、输入速率(input rate)以及属性数组。这样分开不同的缓冲区可以提高灵活性,允许不同的数据来源,或者在需要时动态切换部分数据。

const vertexBuffersLayout = [{arrayStride: 36, // 每个顶点数据占36字节(计算方式见下方)attributes: [// --- 位置属性 --- {shaderLocation: 0,  // 对应着色器中的 @location(0)offset: 0,          // 从顶点数据起始位置开始 format: "float32x3" // 3个32位浮点数(占12字节)},// --- 颜色属性 --- {shaderLocation: 1,  // 对应着色器中的 @location(1)offset: 12,         // 位置属性占12字节(3*4),因此颜色从第12字节开始 format: "float32x4" // RGBA四通道(占16字节)},// --- UV属性 --- {shaderLocation: 2,  // 对应着色器中的 @location(2)offset: 28,         // 位置+颜色共28字节(12+16),UV从第28字节开始 format: "float32x2" // 2个32位浮点数(占8字节)}]
}];

关键计算说明

  • arrayStride = 3(position)*4 + 4(color)*4 + 2(UV)*4 = 36字节
  • 每个属性的offset为前序属性总字节数

三、顶点着色器与管线配置

// 顶点着色器(对应上方shaderLocation)
@vertex 
fn vs_main(@location(0) position: vec3<f32>,  // 对应shaderLocation:0 @location(1) color: vec4<f32>,     // 对应shaderLocation:1 @location(2) uv: vec2<f32>         // 对应shaderLocation:2 
) -> @builtin(position) vec4<f32> {return vec4<f32>(position, 1.0); 
}

渲染管线绑定

const pipeline = device.createRenderPipeline({ vertex: {module: shaderModule,entryPoint: "vs_main",buffers: vertexBuffersLayout // 传入顶点布局配置 },// ...其他管线配置(片段着色器、primitive拓扑等)
});

四、高级技巧与优化建议

1. 动态插槽切换

// 在渲染循环中切换不同缓冲区 
passEncoder.setVertexBuffer(0,  positionBuffer); // 绑定位置数据到插槽0 
passEncoder.setVertexBuffer(1,  uvBuffer);       // 绑定UV数据到插槽1 

适用场景:当位置和UV数据需要分别更新时

2. 数据压缩优化

// 使用packed格式减少内存占用 
{shaderLocation: 1,format: "unorm8x4", // 将颜色压缩为4个8位无符号整数 offset: 12 
}

可节省50%颜色数据内存(16字节 → 4字节)


五、完整工作流程示意图

[顶点数据] → [缓冲区创建]  ↓  
[布局声明] → [管线配置]  ↓  
[渲染通道] → [插槽绑定] → [绘制调用]

六、调试建议

  1. 验证数据偏移:通过GPURenderPipeline.getBindGroupLayout 检查属性偏移是否匹配
  2. 使用调试工具:Chrome开发者工具的WebGPU Inspector可实时查看缓冲区内容
  3. 最小化测试:先单独测试每个属性通道,确认数据正确性

完整项目代码可参考WebGPU官方示例


        通过以上注释与配置说明,开发者可以清晰理解顶点数据从JavaScript到着色器的传递逻辑。实际开发中需特别注意shaderLocation@location的数值对应关系,这是数据能否正确传递的关键。

相关文章:

WebGPU顶点插槽(Vertex Buffer Slot)使用指南

本文将通过完整代码示例和逐行注释&#xff0c;详细解释WebGPU中顶点缓冲区的配置方法&#xff0c;特别针对shaderLocation参数与着色器的对应关系进行重点说明。 一、顶点数据定义与缓冲区创建 // 定义顶点数据结构&#xff08;逻辑层&#xff09; // 包含位置(position)、颜…...

JSP(学习自用)

一、本质 JSP解析后就是Servlet类的java代码。 二、jsp内嵌java代码 1、声明脚本 用于声明属性和方法。 <%!//声明脚本//用于声明属性和方法public void test(){}String easyName"张三"; %> 2、运行脚本 相当于在service方法中写代码 <% //运行脚本…...

ZYNQ TCP Server PS端千兆网口速率低问题,要修改BSP中LWIP配置参数

用VITIS教程里面 TCP UDP应用工程例程 打算测试PS端千兆网口速率。ZYNQ核心板用黑金的&#xff0c;外部板子自画的网口电路和其它电路。TCP SERVER时 iperf测试速率 只有60~70Mbit/s&#xff1f;然后用UDP SERVER方式&#xff0c;发现能达到 950Mbit/s&#xff1f;&#xff1f;…...

毕业设计—基于Spring Boot的社区居民健康管理平台的设计与实现

&#x1f393; 毕业设计大揭秘&#xff01;想要源码和文章&#xff1f;快来私信我吧&#xff01; Hey小伙伴们~ &#x1f44b; 毕业季又来啦&#xff01;是不是都在为毕业设计忙得团团转呢&#xff1f;&#x1f914; 别担心&#xff0c;我这里有个小小的福利要分享给你们哦&…...

【计算机网络】数据链路层数据帧(Frame)格式

在计算机网络中&#xff0c;数据帧&#xff08;Frame&#xff09; 是数据链路层的协议数据单元&#xff08;PDU&#xff09;&#xff0c;用于在物理介质上传输数据。数据帧的格式取决于具体的链路层协议&#xff08;如以太网、PPP、HDLC 等&#xff09;。以下是常见数据帧格式的…...

机器学习PCA和LDA

主成分分析&#xff08;PCA, Principal Component Analysis&#xff09;和线性判别分析&#xff08;LDA, Linear Discriminant Analysis&#xff09;是两种常用的降维方法&#xff0c;它们虽然都用于数据降维&#xff0c;但核心思想和应用场景不同。 PCA&#xff08;主成分分析…...

C#: String s = new String(“Hello“)无法编译?编程语言字符集有两个?为什么这种变量名“\u0061\u0062”都能编译通过?

C#: String s new String("Hello")无法编译? C# String类型是literal常量&#xff0c;默认不能用new创建&#xff0c;但可以在unsafe下用char *字符串指针创建。 char* charPtr stackalloc char[2]; charPtr[0] H; charPtr[1] \0; String myString new Strin…...

Visual Studio Code使用ai大模型编成

1、在Visual Studio Code搜索安装roo code 2、去https://openrouter.ai/settings/keys官网申请个免费的配置使用...

nlp|微调大语言模型初探索(1),LLaMA-Factory

前言 微调模型通常比从零开始训练一个模型的技术要求低。公司不需要拥有大量的深度学习专家&#xff0c;利用现有的开源工具和库&#xff08;如Hugging Face的Transformers等&#xff09;&#xff0c;中小型公司可以轻松地使用和微调大型模型&#xff0c;从而快速实现AI能力的集…...

c++TinML转html

cTinML转html 前言解析解释转译html类定义开头html 结果这是最终效果&#xff08;部分&#xff09;&#xff1a; ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6cf6c3e3c821446a84ae542bcc2652d4.png) 前言 在python.tkinter设计标记语言(转译2-html)中提到了将Ti…...

Gentleman:优雅的Go语言HTTP客户端工具包

gentlemen介绍&#xff0c;特点等 插件驱动架构&#xff1a;Gentleman的核心特点是其插件系统&#xff0c;允许用户注册和重用各种自定义插件&#xff0c;如重试策略或动态服务器发现&#xff0c;以增强HTTP客户端的功能。 中间件层&#xff1a;项目内置了一个上下文感知的层次…...

JDK1.8新特性面试题

lambda表达式 Lambda表达式极大地简化了匿名内部类的创建&#xff0c;促进了函数式编程风格。开发者可以更简洁地定义只有一行代码的函数对象&#xff0c;并将其作为参数传递给方法或者赋值给变量。 三要素&#xff1a; 形式参数、箭头、代码块 &#xff08;形式参数&#xf…...

Windchill-PDM-设置环境

Web 浏览器和 Java 插件版本 请确保 Windchill PDMLink 支持您使用的 Web 浏览器及 Java 插件的版本。PTC 软件对照表内列出了所支持的浏览器和插件。 软件一览表列出了平台、操作系统以及经认证可以在 Windows 和 UNIX 操作系统上与 此版本一起使用的第三方产品的组合。产品和…...

《蓝耘服务器:领先架构、技术创新与行业应用全景解析》

&#x1f31f; 嗨&#xff0c;我是Lethehong&#xff01;&#x1f31f; &#x1f30d; 立志在坚不欲说&#xff0c;成功在久不在速&#x1f30d; &#x1f680; 欢迎关注&#xff1a;&#x1f44d;点赞⬆️留言收藏&#x1f680; &#x1f340;欢迎使用&#xff1a;小智初学…...

前端【技术方案】重构项目

1. 明确重构目标 优化性能 减少页面加载时间降低资源占用 提升代码可维护性 更规范的代码风格更清晰的代码结构更明确的模块设计 扩展功能 为项目添加新功能改进现有功能 2. 评估项目现状 审查代码 全面检查现有代码&#xff0c;找出代码中的问题&#xff0c;如代码冗余、耦合…...

C#中反射的原理介绍及常见的应用场景介绍

反射&#xff08;Reflection&#xff09;是C#中的一种机制&#xff0c;允许程序在运行时获取类型信息并动态调用其成员。通过反射&#xff0c;程序可以访问程序集、模块、类型及其成员&#xff08;如方法、属性、字段等&#xff09;&#xff0c;并能在运行时创建对象、调用方法…...

uniapp webview嵌入外部h5网页后的消息通知

最近开发了个oa系统&#xff0c;pc端的表单使用form-create开发&#xff0c;form-create 是一个可以通过 JSON 生成具有动态渲染、数据收集、验证和提交功能的表单生成组件。移动端使用uniapp开发&#xff0c;但是因为form-create移动端只支持vant&#xff0c;不支持uniapp。官…...

java听书项目

项目的架构 网关:1路由转发 2.认证鉴权(token)3.统一处理(跨域) Mysql:关系型数据库 ES:搜索数据库 Redis:页面级缓存,会话状态存储 GitLab:私有托管平台 K8S:自动化部署、扩展和管理容器化应用程序的开源系统 Jenkins:自动化部署 1.环境搭建 创建一个父工程…...

iOS 获取设备占用内存

获取应用占用内存 获取应用进程占用内存 - (NSUInteger)memoryUsage {task_vm_info_data_t vmInfo;mach_msg_type_number_t count TASK_VM_INFO_COUNT;kern_return_t result task_info(mach_task_self(), TASK_VM_INFO, (task_info_t)&vmInfo, &count);if (result …...

C#功能测试

List 内部元素为引用 src[0]为"11" List<Source> src new List<Source>(); src.Add(new Source() { Name "1", Age 1, Description "1" }); src.Add(new Source() { Name "2", Age 2, Description "2"…...

js第八题

题八&#xff1a;滚动弹幕 要求&#xff1a; 1.页面上漂浮字体大小不一、颜色不一&#xff0c;从左向右滚动的弹幕&#xff1b; 2.底部中间有一个发送功能&#xff0c;可以发送新的弹幕&#xff1b; 3.底部的发送部分可以向下收起和弹出。 html <div id"danmu-con…...

第35次CCF计算机软件能力认证 python 参考代码

题目列表1. 密码2. 字符串变换3. 补丁应用4. 通讯延迟5. 木板切割题目列表 第35次CCF计算机软件能力认证 1. 密码 n = int(input()) for _ in range(n):s =...

2025百度快排技术分析:模拟点击与发包算法的背后原理

一晃做SEO已经15年了&#xff0c;2025年还有人问我如何做百度快速排名&#xff0c;我能给出的答案就是&#xff1a;做好内容的前提下&#xff0c;多刷刷吧&#xff01;百度的SEO排名算法一直是众多SEO从业者研究的重点&#xff0c;模拟算法、点击算法和发包算法是百度快速排名的…...

国产FPGA开发板选择

FPGA开发板是学习和开发FPGA的重要工具&#xff0c;选择合适的开发板对学习效果和开发效率至关重要。随着国产FPGA的发展&#xff0c;淘宝上的许多FPGA开发板店铺也开始进行国产FPGA的设计和销售&#xff0c;本文将对国产FPGA和相关店铺做个简单梳理&#xff0c;帮助有需要使用…...

DeepSeek+即梦 做AI视频

DeepSeek做AI视频 制作流程第一步&#xff1a;DeepSeek 生成视频脚本和分镜 第二步&#xff1a;生成分镜图片绘画提示词第三步&#xff1a;生成分镜图片第四步&#xff1a;使用可灵 AI 工具&#xff0c;将生成的图片转成视频。第五步&#xff1a;剪映成短视频 DeepSeek 真的强&…...

【R语言】聚类分析

聚类分析是一种常用的无监督学习方法&#xff0c;是将所观测的事物或者指标进行分类的一种统计分析方法&#xff0c;其目的是通过辨认在某些特征上相似的事物&#xff0c;并将它们分成各种类别。R语言提供了多种聚类分析的方法和包。 方法优点缺点适用场景K-means计算效率高需…...

LVS相关原理

一、LVS集群的体系结构 1.1 LVS简介 LVS 是 Linux Virtual Server 的简称&#xff0c;也就是 Linux 虚拟服务器 , 是一个由章文嵩博士发起的自由软件项目&#xff0c;它的官方站点是 www.linuxvirtualserver.org 。现在 LVS 已经是 Linux标准内核的一部分&#xff0c;在Linux2…...

linux--关于makefile

makefile文件 可以指定编译顺序&#xff0c;这样方便一个项目的多个文件要编译的挨个操作的麻烦。 makefile文件的命名&#xff1a;makefile 或者 Makefile 必须是这俩&#xff0c;系统才能识别 规则的书写语法如下&#xff1a; 一个makefile内可以有多个规则 目标:依赖a 依…...

从2025年起:数字化建站PHP 8.1应成为建站开发的基准线

在数字化浪潮席卷全球的今天,PHP语言仍然保持着Web开发领域的核心地位。根据W3Techs最新统计,PHP驱动着全球78.9%的已知服务端网站。当时间指向2025年,这个拥有28年历史的编程语言将迎来新的发展里程碑——PHP 8.1版本应成为网站开发的最低基准要求,这不仅是技术迭代的必然…...

根据deepseek模型微调训练自动驾驶模型及数据集的思路

以下是使用DeepSeek模型微调训练自动驾驶模型的详细步骤和代码示例。本流程假设你已有自动驾驶领域的数据集&#xff08;如驾驶指令、传感器数据等&#xff09;&#xff0c;并基于PyTorch框架实现。 Step 1: 环境准备 # 安装依赖库 pip install torch transformers datasets n…...