【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.pswp.cn/web/63387.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/63387.shtml
英文地址,請注明出處:http://en.pswp.cn/web/63387.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

IDEA 打包普通JAVA項目為jar包

需求:普通java項目(有添加依賴的jar包),沒有用maven管理依賴和打包,要打成jar包,包可以用“java -jar 包名” 啟動程序。 講如何打包前,先記錄下普通項目的目錄結構和怎么添加依賴包 1.目錄結…

python的流程控制語句之制作空氣質量評估系統

👨?💻個人主頁:開發者-曼億點 👨?💻 hallo 歡迎 點贊👍 收藏? 留言📝 加關注?! 👨?💻 本文由 曼億點 原創 👨?💻 收錄于專欄&#xff1a…

Docker Compose 多應用部署 一鍵部署

介紹 Docker Compose通過一個單獨的docker-compose.yml模板文件(YAML格式)來定義一組相關聯的應用容器,幫助我們實現多個相互關聯的Docker容器的快速部署。 如:springbootmysqlnginx 如果一個個去部署他會非常的麻煩,這時候可以選擇Docker …

【數據結構——線性表】單鏈表的基本運算(頭歌實踐教學平臺習題)【合集】

目錄😋 任務描述 相關知識 測試說明 我的通關代碼: 測試結果: 任務描述 本關任務:編寫一個程序實現單鏈表的基本運算。 相關知識 為了完成本關任務,你需要掌握:初始化線性表、銷毀線性表、判定是否為空表、求線性…

git branch -r(--remotes )顯示你本地倉庫知道的所有 遠程分支 的列表

好的,git branch -r 這個命令用于列出遠程分支。讓我詳細解釋一下: 命令: git branch -rdgqdgqdeMac-mini ProductAuthentication % git branch -rorigin/main作用: 這個命令會顯示你本地倉庫知道的所有 遠程分支 的列表。它不…

【AI熱點】小型語言模型(SLM)的崛起:如何在AI時代中找到你的“左膀右臂”?

人工智能模型的演變 多年來,谷歌等科技巨頭和OpenAI等初創公司,一直在不遺余力地利用海量在線數據,打造更大、更昂貴的人工智能(AI)模型。這些大型語言模型(LLM)被廣泛應用于ChatGPT等聊天機器…

【昇騰】NPU ID:物理ID、邏輯ID、芯片映射關系

起因: https://www.hiascend.com/document/detail/zh/Atlas%20200I%20A2/23.0.0/re/npu/npusmi_013.html npu-smi info -l查詢所有NPU設備: [naienotebook-npu-bd130045-55bbffd786-lr6t8 DCNN]$ npu-smi info -lTotal Count : 1NPU…

Elasticsearch-DSL高級查詢操作

一、禁用元數據和過濾數據 1、禁用元數據_source GET product/_search {"_source": false, "query": {"match_all": {}} }查詢結果不顯示元數據 禁用之前: {"took" : 0,"timed_out" : false,"_shards" : {&quo…

基于Spring Boot的體育商品推薦系統

一、系統背景與目的 隨著電子商務的快速發展和人們健康意識的提高,體育商品市場呈現出蓬勃發展的態勢。然而,傳統的體育商品銷售方式存在商品種類繁多、用戶選擇困難、個性化需求無法滿足等問題。為了解決這些問題,基于Spring Boot的體育商品…

【Java Nio Netty】基于TCP的簡單Netty自定義協議實現(萬字,全篇例子)

基于TCP的簡單Netty自定義協議實現(萬字,全篇例子) 前言 有一陣子沒寫博客了,最近在學習Netty寫一個實時聊天軟件,一個高性能異步事件驅動的網絡應用框架,我們常用的SpringBoot一般基于Http協議&#xff0…

【2025最新計算機畢業設計】基于SSM校園歌手賽事管理系統【提供源碼+答辯PPT+文檔+項目部署】

作者簡介:?CSDN新星計劃導師、Java領域優質創作者、掘金/華為云/阿里云/InfoQ等平臺優質作者、專注于Java技術領域和學生畢業項目實戰,高校老師/講師/同行前輩交流。? 主要內容:🌟Java項目、Python項目、前端項目、PHP、ASP.NET、人工智能…

Visual Studio 使用 GitHub Copilot 協助調試

🎀🎀🎀【AI輔助編程系列】🎀🎀🎀 Visual Studio 使用 GitHub Copilot 與 IntelliCode 輔助編碼Visual Studio 安裝和管理 GitHub CopilotVisual Studio 使用 GitHub Copilot 擴展Visual Studio 使用 GitHu…

了解ARM的千兆以太網——RK3588

1. 簡介 本文并不重點講解調試內容,重點了解以太網在ARM設計中的框架以及在設備樹以及驅動的一個整體框架。了解作為一個驅動開發人員當拿到一款未開發過的ARM板卡應該怎么去把網卡配置使用起來。 2. 基礎知識介紹 在嵌入式ARM中實現以太網的解決方案通常有以下兩種…

Springboot家政服務管理系統

摘 要 科技進步的飛速發展引起人們日常生活的巨大變化,電子信息技術的飛速發展使得電子信息技術的各個領域的應用水平得到普及和應用。信息時代的到來已成為不可阻擋的時尚潮流,人類發展的歷史正進入一個新時代。在現實運用中,應用軟件的工作…

DC-9筆記

靶機信息 官網:DC: 9 ~ VulnHub 只有一個flag,官網上沒給其他提示 信息收集 nmap 192.168.66.2-254nmap 192.168.66.146 -A -p-開放了80端口,22端口是filtered的,被過濾? NMAP 六種端口狀態解讀_nmap filtered-CSDN博客 那來看看http服務吧 http(80) 頁腳是空白的,插件也…

STM32-筆記3-驅動蜂鳴器

1、復制03項目,重命名為04項目 打開04項目的Drivers/BSP/led文件夾,把led文件夾更改為beep文件夾,改文件夾內部的.c和.h文件更改為beep.c和beep.h文件,如下圖所示。 2、打開工程文件 出現彈窗,顯示找不到xx文件&#…

PHP開發日志 ━━ 基礎知識:四種不同的變量返回方式該如何調用

最近在給框架升級,其中涉及到古早的緩存系統升級,現在準備區分類型為混合、變量和普通文件,那么變量用什么形式存儲到緩存才能給后續開發帶來便利和通用性呢?于是就涉及到了本文的php基礎知識。 好吧,又是一個無用的知…

概率論得學習和整理30: 用EXCEL 描述泊松分布 poisson distribution

目錄 1 泊松分布的基本內容 1.1 泊松分布的關鍵點 1.1.1 屬于離散分布 1.1.2 泊松分布的特點:每個子區間內概率相等 , λ就是平均概率 1.2 核心參數 1.3 pmf公式 1.4 期望和方差 2 例1:用EXCEL計算泊松分布的概率 3 比較λ不同值時…

Java中的垃圾收集器

文章目錄 1. 理解不同類型的垃圾收集器1.1 Serial 收集器1.2 Parallel (吞吐量) 收集器1.3 CMS (Concurrent Mark-Sweep) 收集器1.4 G1 (Garbage First) 收集器1.5 ZGC 和 Shenandoah GC1.6 Epsilon GC1.7 ParNew 收集器1.8 Zing (Azul Systems) 2. 優化垃圾收集器的選擇和配置…

測試工程師八股文05|功能測試、業務測試

一、基礎概念 1、軟件測試分類 1??按照軟件產生的階段劃分 單元測試:針對程序源代碼進行測試【開發自測】集成測試:針對模塊之間功能交互進行測試系統測試:對整個系統(功能、非功能)進行全面測試驗收測試&#xff…