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

广东企业网站模板定制绍兴模板建站代理

广东企业网站模板定制,绍兴模板建站代理,罗湖网站(建设深圳信科),搭配服装网站源码目录 Index Buffer 简介创建 IndexBuffer使用 IndexBuffer 绘制 Index Buffer 简介 绘制一个矩形可以通过绘制两个三角形来实现,如果不共享顶点,就需要 6 个顶点,共享顶点的话,只需要 4 个顶点就可以 可以想象对于更加复杂的三维…

目录

      • Index Buffer 简介
      • 创建 IndexBuffer
      • 使用 IndexBuffer 绘制

Index Buffer 简介

绘制一个矩形可以通过绘制两个三角形来实现,如果不共享顶点,就需要 6 个顶点,共享顶点的话,只需要 4 个顶点就可以
可以想象对于更加复杂的三维网格,通过共享顶点可以节约大量内存资源

indexBuffer

索引缓冲(IndexBuffer)是一个包含了指向顶点缓冲中顶点数据的索引数组的缓冲,使用索引缓冲,我们可以对顶点数据进行复用

创建 IndexBuffer

  1. 首先定义矩形的四个顶点
const std::vector<Vertex> vertices = {{{-0.5f, 0.5f}, {1.0f, 0.0f, 0.0f}}, // color R{{-0.5f, -0.5f}, {0.0f, 1.0f, 0.0f}}, // color G{{0.5f, 0.5f}, {0.0f, 0.0f, 1.0f}}, // color B{{0.5f, -0.5f }, {1.0f, 0.0f, 0.0f} } // color R
};

四个顶点定义两个三角形,这个两个三角形的绘制顺序如下,

// 这里按照顺时针的方式绘制
const std::vector<uint16_t> indices = {0, 1, 3, 0, 3, 2
};

index

可以使用 uint16_tuint32_t 变量类型作为索引的类型,这里是根据顶点的最大数量作为定义依据
方法还是将索引数据加载到一个VkBuffer来让 GPU 可以访问它,我们定义了两个类成员变量来存储索引缓冲对象

VkBuffer vertexBuffer;
VkDeviceMemory vertexBufferMemory;
VkBuffer indexBuffer;
VkDeviceMemory indexBufferMemory;
std::vector<uint16_t> drawIndices;

添加 createIndexBuffer 函数用于索引缓冲创建,它和内容和 createVertexBuffer 函数的内容几乎一样

void basicTriangleIndexBuffer::createIndexBuffer() {VkDeviceSize bufferSize = sizeof(drawIndices[0]) * drawIndices.size();VkBuffer stagingBuffer;VkDeviceMemory stagingBufferMemory;createBuffer(bufferSize, VK_BUFFER_USAGE_TRANSFER_SRC_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, stagingBuffer, stagingBufferMemory);void* data;vkMapMemory(device, stagingBufferMemory, 0, bufferSize, 0, &data);memcpy(data, drawIndices.data(), (size_t) bufferSize);vkUnmapMemory(device, stagingBufferMemory);createBuffer(bufferSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_INDEX_BUFFER_BIT, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, \indexBuffer, indexBufferMemory);copyBuffer(stagingBuffer, indexBuffer, bufferSize);vkDestroyBuffer(device, stagingBuffer, nullptr);vkFreeMemory(device, stagingBufferMemory, nullptr);
}

需要注意的是,有两处明显不同的地方:

  • bufferSize 的大小是根据顶点的数量计算出来的
  • indexBuffer 的用法标记为 VK_BUFFER_USAGE_INDEX_BUFFER_BIT

除此之外的处理和顶点缓冲的创建是相同的, 我们也需要创建一个暂存缓冲来存储 indices 数组中的索引数据,然后复制暂存缓冲中的索引数据到 GPU 能够快速访问的缓冲中

使用 IndexBuffer 绘制

首先我们需要将顶点缓冲区绑定到指令缓存对象上,和绑定顶点缓冲基本类似,不同之处是我们只能绑定一个索引缓冲对象

vkCmdBindIndexBuffer(commandBuffer, indexBuffer, 0, VK_INDEX_TYPE_UINT16);

索引缓冲通过调用 vkCmdBindIndexBuffer函数来进行绑定,vkCmdBindIndexBuffer 函数以索引缓冲对象,索引数据在索引缓冲中的偏移,以及索引数据的类型作为参数

仅仅绑定索引缓冲是不会起任何作用的,我们需要使用 vkCmdDrawIndexed 指令替换之前使用 vkCmdDraw 指令进行绘制操作

vkCmdDrawIndexed(commandBuffer, static_cast<uint32_t>(drawIndices.size()), 1, 0, 0, 0);
//替代
//vkCmdDraw(commandBuffer, static_cast<uint32_t>(vertices.size()), 1, 0, 0);

vkCmdDrawIndexed 函数使用和 vkCmdDraw 函数类似,前两个参数分别为指令缓冲区对象(commandbuffer)和指定索引的个数,第三个参数表示实例的个数,在这里我们没有使用实例渲染,所以将实例个数设置为 1
第四个参数偏移值用于指定 GPU 开始读取索引的位置,偏移值为 1 对应索引数据中的第二个索引
倒数第二个参数是检索顶点数据前加到顶点索引上的数值
最后一个参数用于第一个被渲染的实例的ID,在这里我们没有使用

最后显示效果如下:
index_draw
这里我们分别创建了 vertexBuffer indexBuffer,实际上可以更进一步,使用一个缓冲对象通过偏移值来存储多个不同的顶点缓冲和索引缓冲数据
也就是只创建一个 vkBuffer 类型,这样做之后,由于数据之间非常紧凑,可以更好地被缓存,对于没有同时进行的操作使用的内存块可以供多个对象复用

This is known as aliasing and some Vulkan functions have explicit flags to specify that you want to do this

http://www.dtcms.com/wzjs/787134.html

相关文章:

  • 北师大 网页制作与网站建设 考试列表网免费发布信息
  • 做我女朋友的套路网站响应式网站模仿
  • 安庆网站开发网页打不开怎么处理
  • 安徽网站建设调查报告江门网页设计
  • 西安高端网站建设首选定制衣服
  • 网站上点击图片局部放大如何做网站 建设意见
  • 零基础学做网站难吗网站代理 正规备案
  • 在公司做网站是什么职位静态网页模板制作工具
  • 广州seo网站建设部网站碎发零能耗住宅
  • 济南天桥区网站建设公司网站备案 登录名
  • 商务网站建设与维护 ppt食品贸易网站建设案例
  • 运营什么网站好系统的php网站建设
  • sns网站开发网页制作与设计第四版电子书
  • 长春网站排名方案wordpress迁移空间插件
  • 做网站php语言用什么工具关键词seo排名优化如何
  • 公司用wordpress建站用花钱如何免费引流推广
  • 深圳网站建设推广平台许昌网站设计制作
  • 平和县建设局网站wordpress迁移网站
  • 网站设计排名网站乐亭网站建设
  • 塑料袋销售做哪个网站推广好站酷设计官方网站
  • 网站空间买多大的房管局网上备案查询
  • 建设网站公开教学视频下载网站建设都需要哪些书
  • 云南建设监理协会官方网站福田祥菱m2怎么样
  • 建立网站接受投注是什么意思wordpress php5.3版本
  • 淘宝上开做网站的店铺营销网站建设yyeygtytty
  • 网站策划制作公司wordpress log in
  • 本机iis发布网站后台管理国家示范校建设网站
  • 用psd做的买书网站东莞房价2021最新价格走势
  • 做oa系统的网站惠州专业网站设计公司
  • 快站app制作教程网页微信登陆登录入口