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

【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.kler.cn/a/445795.html

相关文章:

  • CPU性能优化-基于源代码的CPU调优
  • 安装指南|OpenCSG Starship上架GitHub Marketplace
  • Hadoop实验:关于MapReduce词频统计的实验步骤
  • LSTM (Long Short-Term Memory)
  • MQTT客户端向服务端建立ssl连接报错
  • 期末复习-编译原理(手写笔记)
  • 脉冲计数 记录按下的次数
  • BGP的六种状态分别是什么?
  • ElementPlus Table 表格实现可编辑单元格
  • 高中数学刷题版:集合与函数概念-函数的概念[笔记总结-干货]
  • WatchAlert - 开源多数据源告警引擎
  • 10. 考勤信息
  • Vue.js前端框架教程1:Vue应用启动和Vue组件
  • C++ STL 中有哪些容器?它们的主要区别是什么?
  • CSS系列(19)-- 主题切换详解
  • Redis(2)常用命令
  • deepin 安装 habse
  • 【AI驱动的泛型数据结构:智能计算的核心】
  • Vscode运行GO文件
  • 【自用】通信内网部署rzgxxt项目_02,前端pipeCloud部署(使用 nginx 部署 + NSSM 控制非窗口运行)