Vulkan 理解Vertex Input Description

news2025/1/10 21:21:29

此文为个人记录,感兴趣直接看https://zhuanlan.zhihu.com/p/450157594

在这里插入图片描述

首先,一个顶点的结构体

struct Vertex {
    glm::vec3 pos;
    glm::vec3 color;
}

CPU端给出顶点数据

const std::vector<Vertex> vertices = {
    {{0.0f, -0.5f}, {1.0f, 0.0f, 0.0f}},
    {{0.5f, 0.5f},  {0.0f, 1.0f, 0.0f}},
    {{-0.5f, 0.5f}, {0.0f, 0.0f, 1.0f}}
};

下一步是告诉Vulkan,一旦这个数据格式被上传到GPU内存,如何将其传递给顶点着色器。有两种类型的结构需要用来传达这一信息。

1. VertexInput BindingDescription

描述GPU如何读取上面那段输入数据(从0处开始,逐顶点读取数据)

VkVertexInputBindingDescription bindingDescription{};
bindingDescription.binding = 0; 							// 起始位置偏移量,我们是从头开始
bindingDescription.stride = sizeof(Vertex);					// 步长
bindingDescription.inputRate = VK_VERTEX_INPUT_RATE_VERTEX;	// 逐顶点/逐实例读取

2. VertexInput AttributeDescription

目前数据已经输入GPU中(本文省略vertexbuffer的创建过程),它只是躺在显存中的一堆数据,对于顶点着色器中的绑定点,如何解释那段数据,就需要 Attribute descriptions
有了下面的描述结构后,对输入的数据,shader就知道每24个字节为一个单元,前12个字节是属性1,后12个字节是属性2。

	std::array<VkVertexInputAttributeDescription, 2> attributeDescriptions{};
	// 属性1
	attributeDescriptions[0].binding = 0;
	attributeDescriptions[0].location = 0;
	attributeDescriptions[0].format = VK_FORMAT_R32G32B32_SFLOAT;
	attributeDescriptions[0].offset = offsetof(Vertex, pos);	//0
	//属性2
	attributeDescriptions[1].binding = 0;
	attributeDescriptions[1].location = 1;
	attributeDescriptions[1].format = VK_FORMAT_R32G32B32_SFLOAT;
	attributeDescriptions[1].offset = offsetof(Vertex, color);	//12

在shader中的使用

layout(location = 0) in vec3 inPosition;
layout(location = 1) in vec3 inColor;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/194107.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Allegro如何显示盲埋孔钻孔所在层面操作指导

Allegro如何显示盲埋孔钻孔所在层面操作指导 在用Allegro做PCB设计的时候,涉及盲埋孔设计的时候,需要实时看到盲埋孔是打在哪层到哪层,如下图 实时显示了盲埋孔是从哪层到哪层的,比如1-3,3-6等等 如何显示,具体操作如下 选择Setup选择design Parameters

[golang Web开发] 3.golang web开发:处理请求

简介 Go语音的net/http包提供了一系列用于表示HTTP报文的结构,可以使用它处理请求和发送响应,其中Request结构代表了客户端发送的请求报文,下面是Request讲解 type Request struct {// Method指定HTTP方法&#xff08;GET、POST、PUT等&#xff09;。对客户端&#xff0c;"…

linux系统加固

linux安全加固 linux系统安全包括用户安全、权限安全、文件安全 从那些方面进行加固 身份鉴别 访问控制 安全审计 资源控制 入侵防范 在linux当中一切皆文件 身份鉴别 /etc/login.defs 文件功能 查看密码策略 /etc/login.defs文件定义了与/etc/passwd和/etc/shadow配套的用户限…

VOIP创建

一、介绍VOIP的推送证书的创建方式和普通的证书的创建方式基本一致。二、步骤首先需要生成证书签名的请求文件CerSingingRequest&#xff0c;打开钥匙串应用&#xff0c;点击钥匙串访问->证书助理->从证书颁发机构请求输入电子邮件和名称后保存到本地3.在developer.apple…

服务器防火墙 配置端口号

作为前端的我头次做运维的事情。 现在服务器是的默认端口好像只有80&#xff0c;443&#xff0c;其余端口都需要我们配置 域ping 通了&#xff0c;以为服务配置好了可以撸起袖子加油干&#xff0c;但是 访问公司的服务 出错了400 访问公司的服务xxx.168.30.xxx:8081&#xff…

【字符串】leetcode344.反转字符串(C/C++/Java/Python/Js)

leetcode344.反转字符串1 题目2 思路3 代码3.1 C版本3.2 C版本3.3 Java版本3.4 Python版本3.5 JavaScript版本4 总结打基础的时候&#xff0c;不要太迷恋于库函数。 1 题目 题源链接 编写一个函数&#xff0c;其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给…

国内最新餐饮品牌全案设计十大排名(2023年榜单)

餐饮全案设计是餐饮店经营过程之前的重要一步&#xff0c;想要打造一家特色餐饮店并不是一件简单的事。一来要满足功能性需求的同时还具有一定的审美性&#xff1b;二来既要尽可能高地提升空间利用率让顾客消费体验愉悦和服务员工作效率高&#xff0c;能够展现餐厅的主题和文化…

分布式锁原理及Redis如何实现分布式锁

一淘模板给大家带来了关于redis的相关知识&#xff0c;其中主要介绍了关于分布式锁是什么&#xff1f;Redis又是怎么实现分布式锁的&#xff1f;需要满足什么条件&#xff1f;下面一起来看一下吧&#xff0c;希望对需要的朋友有帮助。 一、分布式锁基本原理 分布式锁&#xff…

PTA L1-027 出租(详解)

前言&#xff1a;本期是关于出租的详解&#xff0c;内容包括四大模块&#xff1a;题目&#xff0c;代码实现&#xff0c;大致思路&#xff0c;代码解读&#xff0c;今天你c了吗&#xff1f; 题目&#xff1a; 下面是新浪微博上曾经很火的一张图&#xff1a; 一时间网上一片求救…

【python学习笔记】:数据科学库操作(三)

接上一篇&#xff1a; 14、Pandas Pandas 是一个快速、强大、灵活且易于使用的开源数据分析和操作工具&#xff0c; Pandas 可以从各种文件格式比如 CSV、JSON、SQL、Microsoft Excel 导入数据&#xff0c;可以对各种数据进行运算操作&#xff0c;比如归并、再成形、选择&#…

SockJS-client简介

概述 SockJS是一个浏览器JavaScript库&#xff0c;提供了一个类似websocket的对象。SockJS为您提供了一个连贯的&#xff0c;跨浏览器的Javascript API&#xff0c;它在浏览器和web服务器之间创建了一个低延迟&#xff0c;全双工&#xff0c;跨域通信通道。 实际上&#xff0…

计算机网络入门(网络协议篇)

计算机网络分类虽然网络类型的划分标准各种各样&#xff0c;但是从地理范围划分是一种大家都认可的通用网络划分标准。按这种标准可以把各种网络类型划分为局域网、城域网、广域网三种。局域网一般来说只能是一个较小区域内&#xff0c;城域网是不同地区的网络互联&#xff0c;…

什么是进取心?如何提高进取心?

1、什么是进取心&#xff1f;进取心是一种心理状态&#xff0c;说的是积极上进&#xff0c;不断对自己提高要求&#xff0c;促使自己持续发展的心态。不论是学习还是工作&#xff0c;进取心都是我们获取成就的必备。从人的一生来说&#xff0c;进取心是我们探索人生最宝贵的修养…

ADB 开启 USB调试后,无法自动弹出调试授权窗口的解决方法

之前介绍了 Android Device Unauthorized 的解决方案&#xff0c;这次将分享 开启 USB调试后&#xff0c;无法自动弹出调试授权窗口的解决方法。即使选择在 “仅充电” 的情况下去调试&#xff0c;结果都一样。 在我自己的工程机 (荣耀系列的) 连上电脑后&#xff0c;USB 连接方…

《深入浅出计算机组成原理》学习笔记 Day18

冒险和预测&#xff08;二&#xff09;1. NOP 操作和指令对齐2. 操作数前推参考1. NOP 操作和指令对齐 MIPS 体系结构下的 R、I、J 三类指令&#xff1a; 五级流水线“取指令&#xff08;IF&#xff09;— 指令译码&#xff08;ID&#xff09;— 指令执行&#xff08;EX&…

linux_进程间通信 IPC

文章目录1、管道1.1、匿名管道1.2、有名管道2、信号3、共享内存3.1、共享内存接口3.1.1、生成 key 值3.1.2、创建共享内存3.1.3、创建共享内存映射3.1.4、解除共享内存映射3.1.5、修改共享内存属性3.2、例&#xff1a;共享内存4、信号量4.1、信号量的接口4.1.1、创建信号量4.1.…

第二章 RISC-V 指令集架构

前言 提醒&#xff1a;全文10千字&#xff0c;预计阅读时长15分钟&#xff1b;读者&#xff1a;对 RISC-V 架构感兴趣的小伙伴&#xff1b;目的&#xff1a;读者利用15~30 分钟对本文沉浸式阅读理解&#xff0c;能够掌握 RISC-V 架构 80% 的要点&#xff1b;关键词 &#xff1a…

Mysql 高级学习笔记

Mysql 高级学习笔记 文章目录Mysql 高级学习笔记一、Mysql 基础1. 聚合函数2. having3. sql 的执行顺序4. 约束5. 试图二、Mysql 高级1. MySQL中的SQL的执行流程2. 存储引擎介绍2. 索引3. 性能分析工具的使用4. 索引优化与查询优化5、关联查询优化6、事务及日志6、MVCC一、Mysq…

【C++】从0到1入门C++编程学习笔记 - 提高编程篇:STL常用容器(deque容器)

文章目录一、deque容器基本概念二、deque构造函数三、deque赋值操作四、deque 大小操作五、deque 插入和删除六、deque 数据存取七、deque 排序一、deque容器基本概念 功能&#xff1a; 双端数组&#xff0c;可以对头端进行插入删除操作 deque与vector区别&#xff1a; vec…