Vulkan 學習筆記12—深度緩沖

一、3D幾何體與深度問題
  1. Z坐標引入
    將2D幾何體擴展為3D時,需在Vertex結構體中添加glm::vec3 pos表示三維位置,并更新頂點輸入描述符格式為VK_FORMAT_R32G32B32_SFLOAT。頂點著色器需接收3D坐標并通過模型-視圖-投影矩陣轉換為裁剪坐標。

  2. 深度沖突問題
    當多個3D幾何體未按深度排序時,后繪制的片段會覆蓋先繪制的片段(如兩個正方形因索引順序導致顯示錯亂)。解決方案包括:

    • 按從后到前順序排序繪制調用(適用于透明對象)
    • 使用深度測試和深度緩沖(更常用的方案)
二、深度緩沖實現
  1. 深度圖像與視圖創建

    • 深度附件基于圖像,需手動創建圖像、分配內存和視圖。
    • 支持格式:
      • VK_FORMAT_D32_SFLOAT(32位浮點深度)
      • VK_FORMAT_D32_SFLOAT_S8_UINT(32位浮點深度+8位模板分量)
      • VK_FORMAT_D24_UNORM_S8_UINT(24位深度+8位模板分量)
        (模板分量用于 模板測試:與深度測試結合使用的附加測試。)
    • 通過findSupportedFormat函數查詢設備支持的深度格式,優先選擇包含深度模板附件功能的格式。
    VkFormat findSupportedFormat(const std::vector<VkFormat>& candidates, VkImageTiling tiling, VkFormatFeatureFlags features) {for (VkFormat format : candidates) {VkFormatProperties props;vkGetPhysicalDeviceFormatProperties(physicalDevice, format, &props);if (tiling == VK_IMAGE_TILING_LINEAR && (props.linearTilingFeatures & features) == features) {return format;} else if (tiling == VK_IMAGE_TILING_OPTIMAL && (props.optimalTilingFeatures & features) == features) {return format;}}throw std::runtime_error("沒找到支持的格式!");}
    
  2. 圖像布局轉換

    • 深度圖像需從VK_IMAGE_LAYOUT_UNDEFINED轉換為VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL
    • 轉換時需處理模板分量(若存在),并設置正確的訪問掩碼和管線階段。
三、渲染通道與幀緩沖區配置
  1. 渲染通道修改

    • 添加深度附件描述:設置loadOpVK_ATTACHMENT_LOAD_OP_CLEARfinalLayout為深度附件最優布局。
    • 子通道引用深度附件,通過pDepthStencilAttachment字段綁定。
    • 子通道依賴關系需包含深度測試相關的管線階段(如VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT)。
  2. 幀緩沖區更新

    • 每個幀緩沖區需包含顏色附件和深度附件視圖,確保深度圖像與交換鏈圖像分辨率一致。
四、深度測試狀態配置
  1. 深度模板狀態結構體

    • depthTestEnable:啟用深度測試,比較新片段與深度緩沖的深度值。
    • depthWriteEnable:允許通過測試的片段更新深度緩沖。
    • depthCompareOp:設置比較操作(如VK_COMPARE_OP_LESS,表示深度值更小的片段更近)。
  2. 清除值設置

    • 深度緩沖初始清除值設為1.0(代表最遠深度),通過VkClearValue數組同時指定顏色和深度清除值。
五、窗口大小調整處理
  1. 資源重建邏輯
    • recreateSwapChain函數中,窗口大小變化時重新創建深度資源(圖像、視圖、幀緩沖區)。
    • 清理舊資源時需釋放深度圖像內存和視圖。
六、關鍵代碼要點
  • GLM投影矩陣配置:使用GLM_FORCE_DEPTH_ZERO_TO_ONE宏確保生成Vulkan兼容的0.0-1.0深度范圍。
  • 模板分量處理:若格式包含模板分量(如D24_UNORM_S8_UINT),布局轉換和渲染通道需同時處理深度和模板方面。
  • 管線階段依賴:深度測試發生在VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT,深度寫入在VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT

通過上述步驟,可在Vulkan中實現正確的深度緩沖機制,解決3D幾何體的渲染順序問題,確保場景深度關系準確。

七、主要代碼更新
  • VkContext 新增成員
struct VkContext {...VkImage depthImage;VkDeviceMemory depthImageMemory;VkImageView depthImageView;
}
  • 新增深度資源創建函數
void createDepthResources(VkContext* vkcontext) {VkFormat depthFormat = findDepthFormat(vkcontext->physicalDevice);createImage(vkcontext->physicalDevice,vkcontext->device,vkcontext->swapChainExtent.width,vkcontext->swapChainExtent.height,depthFormat,VK_IMAGE_TILING_OPTIMAL,VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,vkcontext->depthImage,vkcontext->depthImageMemory);vkcontext->depthImageView =createImageView(vkcontext->depthImage, depthFormat, VK_IMAGE_ASPECT_DEPTH_BIT, vkcontext->device);}

在 vkInit 函數中調用

// 創建命令池
{...
}// 創建深度資源
createDepthResources(vkcontext);// 創建幀緩沖
...

在重建交換鏈函數中調用

 void recreateSwapChain(VkContext* vkcontext) {int width = 0, height = 0;glfwGetFramebufferSize(vkcontext->window, &width, &height);while (width == 0 || height == 0) {glfwGetFramebufferSize(vkcontext->window, &width, &height);glfwWaitEvents();}vkDeviceWaitIdle(vkcontext->device);cleanupSwapChain(vkcontext);createSwapChain(vkcontext);createImageViews(vkcontext);createDepthResources(vkcontext); // 創建深度資源createFramebuffers(vkcontext);}

重新構建項目運行效果:
在這里插入圖片描述

當前代碼分支:10_depth_buffer

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/87783.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/87783.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/87783.shtml

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

相關文章

AWS EC2使用SSM會話管理器連接

&#x1f9e9; 前提條件 已創建并運行中的 Amazon EC2 實例&#xff08;Amazon Linux 2023&#xff09; 擁有管理員權限的 AWS 賬戶 已連接到實例&#xff08;例如通過 EC2 Instance Connect&#xff09; 第一步&#xff1a;手動安裝 SSM Agent Amazon Linux 2023 默認未安…

Llama 4 模型卡及提示格式介紹

以下是Llama 4支持的特殊標記和標簽的完整列表: 通用標記 <|begin_of_text|>:指定提示符的開始。 <|end_of_text|>:模型將停止生成更多標記。此標記僅由預訓練的模型生成。 <|header_start|>…<|header_end|>:這些標記包含特定消息的角色。可能的…

flutter bloc 使用詳細解析

源碼地址 flutter_bloc 是基于 BLoC&#xff08;Business Logic Component&#xff09;模式的 Flutter 狀態管理庫&#xff0c;它封裝了 bloc package&#xff0c;幫助我們更清晰地組織業務邏輯與 UI 的分離。核心思想是 事件驅動 和 狀態響應。 &#x1f9e0; 原理簡介 1. 核…

c++ 語言在無人機應用開發中的應用

C 語言在無人機應用開發中扮演著核心角色&#xff0c;特別是在對性能、實時性、資源利用效率和底層硬件控制有嚴格要求的領域。以下是其主要應用領域&#xff1a; 飛控系統 (Flight Control System - FCS) 核心功能&#xff1a; 這是無人機的大腦。C 用于實現核心的導航、制導與…

Uniapp本地存儲(uni.setStorage)全面解析與實踐指南

在移動應用開發中&#xff0c;本地存儲是不可或缺的核心功能之一。作為跨平臺開發框架&#xff0c;Uniapp提供了一套完善的本地存儲解決方案&#xff0c;使開發者能夠輕松實現數據的持久化存儲。本文將深入探討Uniapp本地存儲的方方面面&#xff0c;從基礎使用到高級技巧&#…

n8n教程:5分鐘部署+自動生AI日報并寫入飛書多維表格

哈嘍&#xff0c;大家好&#x1f44f; 我是阿星&#xff01; 最近n8n太火了。什么是n8n&#xff1f;有點像扣子和dify的綜合體。 簡單來說就是替你打工的「自動化工作流」 我們今天就從部署&#x1f449;搭建第一個工作流。用它實現自動抓取新聞并分類。 教程有點長&#x…

禾納 AET3152AP 電源MOS IC完全替代TDM3307 替代TDM2307泰德電子料 國產芯片

禾納半導體的電源管理芯片AET3152AP不含鹵素和銻&#xff0c;符合Rohs標準&#xff0c;應用在交換機切換&#xff0c;便攜式/臺式機中的電源管理等&#xff0c;可pin to pin替代TDM3307或TDM2307. AET3152AP 封裝為PDFN3030 &#xff0c;最小包裝數為5000pcs AET3152AP工作溫…

專題:2025信創產業新發展+AI趨勢數字化研究報告|附30+份報告PDF匯總下載

原文鏈接&#xff1a;https://tecdat.cn/?p42711 本報告匯總解讀聚焦信創產業核心發展脈絡&#xff0c;以數據驅動視角剖析技術演進與市場變革。信創產業作為國家數字安全與技術自主可控的核心載體&#xff0c;正經歷從“可用”到“好用”的關鍵躍遷。 本報告洞察基于《億歐智…

電子電氣架構 --- 分區電子電氣架構如何支持軟件定義汽車

我是穿拖鞋的漢子,魔都中堅持長期主義的汽車電子工程師。 老規矩,分享一段喜歡的文字,避免自己成為高知識低文化的工程師: 做到欲望極簡,了解自己的真實欲望,不受外在潮流的影響,不盲從,不跟風。把自己的精力全部用在自己。一是去掉多余,凡事找規律,基礎是誠信;二是…

【簡單】344.反轉字符串

題目描述 編寫一個函數&#xff0c;其作用是將輸入的字符串反轉過來。輸入字符串以字符數組 s 的形式給出。 不要給另外的數組分配額外的空間&#xff0c;你必須原地修改輸入數組、使用 O(1) 的額外空間解決這一問題。 示例 1&#xff1a; 輸入&#xff1a;s ["h&quo…

CVE-2025-24813源碼分析與漏洞復現(Tomcat 路徑等效漏洞與反序列化RCE)

漏洞概述 漏洞名稱&#xff1a;Tomcat 路徑等效漏洞反序列化遠程代碼執行&#xff08;RCE&#xff09; CVE 編號&#xff1a;CVE-2025-24813 CVSS 評分&#xff1a;9.8 影響版本&#xff1a; 9.0.0.M1 ≤ Tomcat ≤ 9.0.9810.1.0-M1 ≤ Tomcat ≤ 10.1.3411.0.0-M1 ≤ Tomcat…

深入解析:如何實時獲取Socket接收緩沖區的數據量

在網絡編程中&#xff0c;精確掌握接收緩沖區的數據狀態是優化性能的關鍵。本文將揭秘如何跨平臺獲取socket接收緩沖區的可讀數據量&#xff0c;并分析實際應用中的注意事項。 一、核心API&#xff1a;操作系統級數據探針 1. Windows平臺方案 #include <winsock2.h>// …

Edge卸載應用

Edge安裝應用后&#xff0c;出現在開始菜單&#xff0c;不能卸載。

Cursor Rules 的核心定位與作用

Cursor Rules 是 AI 編程工具 Cursor IDE 中的核心功能&#xff0c;用于約束 AI 生成代碼的行為&#xff0c;確保其符合項目規范、編碼風格或特定技術需求。它本質上是一套持久化、可復用的指令集&#xff0c;會動態插入到 AI 模型的上下文提示中&#xff0c;指導其生成代碼的邏…

多線程爬蟲優化:快速爬取并寫入CSV

在數據驅動的時代&#xff0c;爬蟲技術已成為獲取網絡數據的重要手段。然而&#xff0c;隨著數據量的不斷增加&#xff0c;單線程爬蟲的效率逐漸難以滿足需求。多線程爬蟲通過并行處理&#xff0c;能夠顯著提升爬取速度&#xff0c;同時將數據快速寫入CSV文件&#xff0c;為后續…

Deepseek+墨刀,1min快速生成流程圖!

想要了解快速了解產品邏輯&#xff0c;可以用ds墨刀快速生成流程圖~ deepseek鏈接&#xff1a;https://www.deepseek.com/ 墨刀在線&#xff1a;https://modao.cc/brand 如何操作呢&#xff1f; 1.打開deepseek&#xff0c;輸入以下咒語&#xff0c;讓AI用Mermaid語法繪制流…

LangChain4j流式調用、消息注解與會話記憶

我們先用AiService工具類把調用ai大語言模型的代碼寫出來。因為AiService工具類中整合有記憶、Rag知識庫、tools工具等&#xff0c;我們直接配置調用即可。 我用的是qwen-plus模型。 引入依賴&#xff1a; <dependency><groupId>dev.langchain4j</groupId>…

NtfsWriteLog函數分析之OpenAttributeTableDump

第一部分&#xff1a; NtfsWriteLog( IrpContext, Vcb->MftScb, //注意&#xff1a;Vcb->MftScb NULL, OpenAttributeTableDump, …

DCM4CHEE ARCHIVE LIGHT 源代碼解析(2)-STOWRS

系列文章目錄 DCM4CHEE ARCHIVE LIGHT 源代碼解析(1)-前言DCM4CHEE ARCHIVE LIGHT 源代碼解析(2)-STOWRS文章目錄 系列文章目錄概述一、背景資料1、RESTful服務2、傳輸存儲規范3、服務連接策略4、響應消息狀態二、業務分析1、對象關系2、項目結構3、業務流程三、代碼解析1、w…

Java中間件簡介:構建現代軟件的“隱形橋梁”

Java中間件簡介&#xff1a;構建現代軟件的“隱形橋梁” 在軟件開發的世界里&#xff0c;中間件&#xff08;Middleware&#xff09;是一個既熟悉又神秘的存在。它不像數據庫那樣直接存儲數據&#xff0c;也不像前端那樣與用戶交互&#xff0c;但它卻是現代軟件架構中不可或缺…