【Vulkan入门】16-IndexBuffer

@TOC

先叨叨

上篇介绍了如何使用VertexBuffer传入顶点信息。两个多星期了我们一直在玩三个点,本篇介绍如何渲染更多的点。
在渲染前考虑一个问题,渲染一个三角形需要三个点,渲染两个相接的三角形需要几个点? 答案是6个点,不过其中有两个点是重复的,如下图的P1和P2就是重复的。
在这里插入图片描述

为了节约内存我们决定给Vulkan只传四个点。那么想让Vulkan画出两个三角形,就需要告诉Vulkan如何利用这四个点。方法就是给Vulkan一个索引序列。 如下:
VerteixBuffer:【P1, P2, P3, P4】
IndexBuffer:【1,2,3, 1,2,4】
这样Vulkan会根据IndexBuffer,从VertexBuffer中先取出P1、P2、P3画一个三角形,再从VertexBuffer中取出P1、P2、P4画一个三角形。

关键代码

git信息

  • repository: https://gitee.com/J8_series/easy-car-ui
  • tag:16-IndexBuffer
  • url: https://gitee.com/J8_series/easy-car-ui/tree/16-IndexBuffer

TestNode::TestNode()

在TestNode的构造函数中构建数据,4个点和6个索引

TestNode::TestNode()
{m_vertes = {{{-0.5f, -0.5f, 0.0f}, {1.0f, 0.0f, 0.0f}},{{0.5f, -0.5f, 0.0f}, {0.0f, 1.0f, 0.0f}},{{0.5f, 0.5f, 0.0f}, {0.0f, 0.0f, 1.0f}},{{-0.5f, 0.5f, 0.0f}, {1.0f, 1.0f, 1.0f}}};m_indices = {0, 1, 2, 2, 3, 0};
}

TestNode::CreateIndexBuffer()

其实原理与VertexBuffer一样,申请Buffer,为Buffer分配Memory,然后将数据拷贝的Memory,将Buffer绑定到CommandBuffer上。

void TestNode::CreateIndexBuffer()
{VkBuffer indexBuffer{};VkDeviceMemory indexMemory{};VkDeviceSize bufferSize = sizeof(m_indices[0]) * m_indices.size();CreateBuffer(bufferSize,VK_BUFFER_USAGE_TRANSFER_SRC_BIT,VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, indexBuffer,indexMemory);void* data {nullptr};vkMapMemory(m_device, indexMemory, 0, bufferSize, 0, &data);memcpy(data, m_indices.data(), (size_t) bufferSize);vkUnmapMemory(m_device, indexMemory);CreateBuffer(bufferSize,VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_INDEX_BUFFER_BIT,VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,m_deviceIndexBuffer,m_deviceIndexMemory);CopyBuffer(indexBuffer, m_deviceIndexBuffer, bufferSize);vkDestroyBuffer(m_device, indexBuffer, nullptr);vkFreeMemory(m_device, indexMemory, nullptr);
}

void VulkanRender::RecordCommandBuffer()

使用Index后,方式描画需要将之前vkCmdDraw方法,改为vkCmdDrawIndexed方法

void VulkanRender::RecordCommandBuffer()
{
...vkCmdDrawIndexed(m_commandBuffer, testNode.GetIndexSize(), 1, 0, 0, 0);
...
}

运行结果

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机工作流程

分析下面的计算机工作流程: 1.取数a至ACC:PC程序寄存器自增1,变成0(可以理解为PC初始从-1开始自增);接着PC把当前指令的地址给到MAR(地址寄存器);MAR拿到当前地址后&…

Restaurants WebAPI(二)——DTO/CQRS

文章目录 项目地址一、DTO1.1 创建Restaurant的Dto1.2 修改之前未使用Dto的接口1.2.1 修改GetRestaurantByIdUseCase1.2.2 修改IGetRestaurantByIdUseCase接口1.2.3 再次请求接口1.3 显示Dish List1.3.1创建DishDto1.3.2 在RestaurantDto里添加DishDto1.3.3 使用Include添加Dis…

202412月最新植物大战僵尸杂交版【V3.0.1】更新内容与下载

以下是对UI优化和新内容添加的摘要: UI优化摘要: 主界面重做:对游戏的主界面进行全面的设计更新,提升用户体验。商店重做:对游戏内的商店界面进行重新设计,以改善玩家的购物体验。选卡界面增加图鉴功能&a…

MCU驱动使用

一、时钟的配置: AG32 通常使用 HSE 外部晶体(范围:4M~16M)。 AG32 中不需要手动设置 PLL 时钟(时钟树由系统自动配置,无须用户关注)。用户只需在配置文件中给出外部晶振频率和系统主频即可。 …

服务器防火墙设置某个端口号只允许固定 ip地址访问

服务器防火墙设置某个端口号只允许固定 ip地址访问是运维常见的功能,今天我们分享一下: 一、Linux环境 1、firewall 方式 1)允许特定 IP 地址访问 23 端口 sudo firewall-cmd --zonepublic --add-rich-rulerule family"ipv4" s…

Hexo Next主题集成百度统计

个人博客地址:Hexo Next主题集成百度统计 | 一张假钞的真实世界。 首先,需要在百度统计控制台新增自己的站点。 点击“新增网站”按钮: 按照要求输入相关信息并保存,页面跳转至代码获取页面。从代码页面中拷贝网站的ID&#xff1…

8K+Red+Raw+ProRes422分享5个影视级视频素材网站

Hello,大家好,我是后期圈! 在视频创作中,电影级的视频素材能够为作品增添专业质感,让画面更具冲击力。无论是广告、电影短片,还是品牌宣传,高质量的视频素材都是不可或缺的资源。然而&#xff…

JumpServer开源堡垒机搭建及使用

目录 一,产品介绍 二,功能介绍 三,系统架构 3.1 应用架构 3.2 组件说明 3.3 逻辑架构 3.3 逻辑架构 四,linux单机部署及方式选择 4.1 操作系统要求(JumpServer-v3系列版本) 4.1.1 数据库 4.1.3创建数据库参考 4.2 在线安装 4.2.1 环境访问 4.3 基于docker容…

华为云计算HCIE笔记01

第一章 华为云Stack解决方案 2018年云栖大会马云提出的数据科学时代(Data technology),相较于传统信息时代,技术的变更主要集中在过去我们更加看重的是传输,也就是传统的网络建设,随着目前国家网络建设的完…

Redis的主从集群以及哨兵机制学习总结

Redis的主从集群以及哨兵机制 为什么要使用主从集群?部署主从集群主从集群怎么同步数据?数据同步的方式和时机实例查看主从数据同步原理增量同步潜在的问题主从集群的优化 主节点宕机怎么办?哨兵机制 为什么要使用主从集群? 我们…

【机器学习】机器学习的基本分类-强化学习(Reinforcement Learning, RL)

强化学习(Reinforcement Learning, RL)是一种基于试错的方法,旨在通过智能体与环境的交互,学习能够最大化累积奖励的策略。以下是强化学习的详细介绍。 强化学习的核心概念 智能体(Agent) 执行动作并与环境…

行政管理痛点解决方案:OA系统助力企业提效减负

作为企业行政管理的中枢,行政部门承担着企业运转的核心职责。从办公物资采购到会议室安排,从流程审批到企业文化建设,行政工作繁杂且细致。然而,在传统管理模式下,行政工作往往面临以下痛点: 流程繁琐&…

Flask内存马学习

文章目录 参考文章环境搭建before_request方法构造内存马after_request方法构造内存马errorhandler方式构造内存马add_url_rule方式构造内存马 参考文章 https://www.mewo.cc/archives/10/ https://www.cnblogs.com/gxngxngxn/p/18181936 前人栽树, 后人乘凉 大佬们太nb了, …

小红书关键词搜索采集 | AI改写 | 无水印下载 | 多维表格 | 采集同步飞书

小红书关键词搜索采集 | AI改写 | 无水印下载 | 多维表格 | 采集同步飞书 一、下载影刀: https://www.winrobot360.com/share/activity?inviteUserUuid595634970300317698 二、加入应用市场 https://www.yingdao.com/share/accede/?inviteKeyb2d3f22a-fd6c-4a…

(五)FT2232HL高速调试器之--三步实现STM32的VSCODE在线仿真工程搭建

对于单片机开发,rtthread studios 与 vscode,鱼与熊掌可以兼得否,其实是可以的,下面通过三个步骤,实现基于FT2232HL高速调试器的,stm32的VSCODE在线仿真工程的搭建。 1、软件下载与VSCODE插件安装配置 软…

【机器人】ATM 用于策略学习的任意点轨迹建模 RSS 2024 | 论文精读

文章提出了一种新的框架,名为Any-point Trajectory Modeling (ATM) ,称为任意点轨迹建模。 用于从视频中预测任意点的未来轨迹,从而在最少动作标签数据的情况下,学习稳健的视觉运动策略。 图中展示了三个案例,打开柜子…

linux----系统i/o

基本概念 在Linux系统中,I/O(Input/Output)即输入/输出,是操作系统与外部设备(如磁盘、终端、网络等)进行数据交互的机制。它涉及到从外部设备读取数据到内存(输入操作)&#xff0c…

Mac 开机 一闪框 mediasharingd

Mac 开机 一闪框一闪而过 mediasharingd ->系统偏好设置->共享->服务的复选框全部取消,保存。 重启解决。

纯前端实现更新检测

通过判断打包后的html文件中的js入口是否发生变化,进而实现前端的代码更新 为了使打包后的文件带有hash值,需要对vite打包进行配置 import { defineConfig } from vite; import vue from vitejs/plugin-vue; import { resolve } from path; import AutoI…

arcgisPro相接多个面要素转出为完整独立线要素

1、使用【面转线】工具,并取消勾选“识别和存储面邻域信息”,如下: 2、得到的线要素,如下: