Vulkan 學習筆記15—Mipmap 與多重采樣

一、Mipmap 生成總結

一、Mipmap 基礎概念
  • 定義:Mipmap 是圖像預先計算的縮小版本,每個層級寬高為前一層的一半,用作細節級別(LOD)。
  • 作用
    • 遠離相機的對象使用較小層級采樣,提升渲染速度。
    • 避免莫爾條紋等偽影。
  • 存儲方式:在 Vulkan 中存儲于 VkImage 的不同 mip 級別,級別 0 為原始圖像,后續層級構成 mip 鏈。
二、圖像創建與 mip 級別計算
  1. 計算 mip 級別數

    mipLevels = static_cast<uint32_t>(std::floor(std::log2(std::max(texWidth, texHeight)))) + 1;
    
    • 原理:通過最大維度的對數計算可被 2 整除的次數,加 1 包含原始圖像。
  2. 修改關鍵函數

    • createImage:添加 mipLevels 參數,設置 imageInfo.mipLevels
    • createImageView:設置 viewInfo.subresourceRange.levelCountmipLevels
    • transitionImageLayout:設置 barrier.subresourceRange.levelCountmipLevels
  3. 函數調用更新示例

    // 紋理圖像創建(含 mipLevels)
    createImage(texWidth, texHeight, mipLevels, VK_FORMAT_R8G8B8A8_SRGB, ...);
    // 紋理圖像視圖創建
    textureImageView = createImageView(textureImage, ..., mipLevels);
    
三、Mipmap 生成流程
  1. 準備工作

    • 為紋理圖像添加 VK_IMAGE_USAGE_TRANSFER_SRC_BIT 使用標志。
    • 確保圖像布局為 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL
  2. 核心函數 generateMipmaps

    • 循環處理每個 mip 級別(從 1 開始)
      1. 轉換源層級布局:將 i-1 層級轉為 VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL
      2. 設置 blit 操作
        VkImageBlit blit{};
        blit.srcSubresource.mipLevel = i - 1;  // 源層級
        blit.dstSubresource.mipLevel = i;      // 目標層級
        blit.dstOffsets[1] = {mipWidth/2, mipHeight/2, 1};  // 目標尺寸減半
        
      3. 執行 blit 命令:使用 vkCmdBlitImage 復制并縮放數據,過濾方式為 VK_FILTER_LINEAR
      4. 轉換源層級為渲染可用:轉為 VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL
    • 處理最后一個層級:單獨轉換為渲染布局。
  3. 關鍵代碼邏輯

    for (uint32_t i = 1; i < mipLevels; i++) {// 布局轉換與 blit 操作...if (mipWidth > 1) mipWidth /= 2;if (mipHeight > 1) mipHeight /= 2;
    }
    
四、線性濾波支持檢查
  1. 硬件支持驗證

    VkFormatProperties formatProperties;
    vkGetPhysicalDeviceFormatProperties(physicalDevice, imageFormat, &formatProperties);
    if (!(formatProperties.optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT)) {throw std::runtime_error("不支持線性濾波!");
    }
    
  2. 備選方案

    • 搜索支持線性濾波的格式。
    • 使用 stb_image_resize 等庫在軟件中生成 mipmap。
五、采樣器配置
  1. 關鍵參數

    • mipmapMode
      • VK_SAMPLER_MIPMAP_MODE_NEAREST:直接選擇層級采樣。
      • VK_SAMPLER_MIPMAP_MODE_LINEAR:混合相鄰層級采樣。
    • minLod/maxLod:控制采樣的 lod 范圍,VK_LOD_CLAMP_NONE 表示使用所有層級。
    • mipLodBias:偏移 lod 值,調整采樣層級。
  2. 典型配置示例

    VkSamplerCreateInfo samplerInfo{};
    samplerInfo.mipmapMode = VK_SAMPLER_MIPMAP_MODE_LINEAR;
    samplerInfo.minLod = 0.0f;
    samplerInfo.maxLod = VK_LOD_CLAMP_NONE;
    samplerInfo.mipLodBias = 0.0f;
    
六、效果與實踐建議
  • 視覺效果:消除莫爾條紋,文字邊緣更平滑。
  • 性能優化:預先生成 mipmap 可避免運行時計算,通常存儲于紋理文件中。
  • 調試建議:修改 minLod 可強制使用特定層級,觀察不同 LOD 效果。
    • 設置samplerInfo.minLod = static_cast<float>(texture.mipLevels / 2);效果:
      在這里插入圖片描述
    • 設置samplerInfo.minLod = static_cast<float>(texture.mipLevels / 4);效果:
      在這里插入圖片描述
    • 默認samplerInfo.minLod = 0.0f;效果:
      在這里插入圖片描述

多重采樣抗鋸齒(MSAA)總結

一、MSAA基礎概念
  • 作用:解決幾何圖形邊緣鋸齒狀走樣問題,通過每個像素使用多個采樣點計算最終顏色。
  • 原理:普通渲染使用單個采樣點,MSAA使用多個采樣點(如2/4/8倍),采樣數越多效果越好但性能開銷越大。
  • 核心流程:在屏幕外多重采樣緩沖中渲染,再解析到常規幀緩沖。
二、獲取硬件支持的采樣計數
  1. 實現函數
    VkSampleCountFlagBits getMaxUsableSampleCount() {VkPhysicalDeviceProperties props;vkGetPhysicalDeviceProperties(physicalDevice, &props);// 取顏色和深度采樣計數的交集VkSampleCountFlags counts = props.limits.framebufferColorSampleCounts & props.limits.framebufferDepthSampleCounts;// 按優先級返回最高支持的采樣數if (counts & VK_SAMPLE_COUNT_64_BIT) return VK_SAMPLE_COUNT_64_BIT;// 依次檢查32/16/8/4/2/1位采樣return VK_SAMPLE_COUNT_1_BIT;
    }
    
  2. 應用場景:在物理設備選擇時調用,設置類成員msaaSamples
三、渲染目標設置
  1. 創建多重采樣顏色緩沖
    void createColorResources() {VkFormat format = swapChainImageFormat;// 關鍵參數:采樣數msaaSamples,禁用mipmap(1級)createImage(swapChainExtent.width, swapChainExtent.height, 1, msaaSamples, format, VK_IMAGE_TILING_OPTIMAL, VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT,VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, colorImage, colorImageMemory);colorImageView = createImageView(colorImage, format, VK_IMAGE_ASPECT_COLOR_BIT, 1);
    }
    
  2. 深度緩沖同步修改
    void createDepthResources() {// 同步更新深度緩沖的采樣數createImage(swapChainExtent.width, swapChainExtent.height, 1, msaaSamples, ...);
    }
    
  3. 資源清理與重建
    • cleanupSwapChain中釋放colorImage相關資源。
    • recreateSwapChain中重新創建顏色和深度資源。
四、渲染通道與附件配置
  1. 修改顏色/深度附件
    colorAttachment.samples = msaaSamples;
    colorAttachment.finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; // 不再直接呈現
    depthAttachment.samples = msaaSamples;
    
  2. 添加解析附件
    VkAttachmentDescription colorAttachmentResolve{};
    colorAttachmentResolve.format = swapChainImageFormat;
    colorAttachmentResolve.samples = VK_SAMPLE_COUNT_1_BIT; // 解析到單采樣常規圖像
    colorAttachmentResolve.finalLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR; // 用于呈現
    
  3. 子通道與依賴關系
    VkAttachmentReference colorAttachmentResolveRef{2, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
    subpass.pResolveAttachments = &colorAttachmentResolveRef; // 啟用解析操作
    // 更新依賴關系以確保寫入完成
    dependency.srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
    
  4. 幀緩沖與管線配置
    // 幀緩沖附件包含多重采樣顏色、深度和解析目標
    std::array<VkImageView, 3> attachments = {colorImageView, depthImageView, swapChainImageViews[i]};
    // 管線啟用多重采樣
    multisampling.rasterizationSamples = msaaSamples;
    
五、質量優化:采樣著色(Sample Shading)
  1. 作用:解決紋理內部著色混疊,補充MSAA僅平滑邊緣的不足。
  2. 實現步驟
    • 設備功能啟用:
      deviceFeatures.sampleRateShading = VK_TRUE;
      
    • 管線配置:
      multisampling.sampleShadingEnable = VK_TRUE;
      multisampling.minSampleShading = 0.2f; // 采樣著色閾值,越接近1越平滑
      
六、關鍵注意事項
  • 性能權衡:高采樣數(如64x)對性能影響顯著,建議根據設備能力動態調整。
  • 解析必要性:多重采樣圖像無法直接呈現,必須通過解析附件轉換為單采樣圖像。
  • 兼容性檢查:部分舊設備可能不支持高采樣數,需做好降級處理。
  • 視覺效果:MSAA主要改善幾何邊緣平滑度,紋理混疊需結合采樣著色或紋理過濾處理。
效果
  • MSAA = VK_SAMPLE_COUNT_1_BIT
    在這里插入圖片描述

  • MSAA = getMaxUsableSampleCount()
    在這里插入圖片描述
    當前代碼分支:13_mipmap_msaa

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

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

相關文章

HarmonyOS隱私保護全攻略:從入門到精通

&#x1f4f1; HarmonyOS隱私保護全攻略&#xff1a;從入門到精通 &#x1f6e1;? 大家好呀&#xff01;今天咱們來聊聊移動互聯網時代最讓人頭疼的問題之一 —— 隱私保護&#xff01;隨著HarmonyOS生態越來越豐富&#xff0c;這個問題也變得格外重要啦&#xff01;? &…

《使用IDEA插件部署Spring Boot項目到Docker》

準備工作 確保已安裝Docker并已啟動/本地也需要安裝Docker IDEA中已安裝Docker插件&#xff08;通常已預裝&#xff09; 項目是基于Spring Boot的Maven或Gradle項目 1. 配置Docker連接 打開IDEA設置(File > Settings)導航到Build, Execution, Deployment > Docker點擊…

植物神經小知識

在消化系統方面&#xff0c;患者可能長期飽受胃痛、胃脹、食欲不振、惡心嘔吐、腹瀉或便秘交替的折磨。吃任何食物都味同嚼蠟&#xff0c;體重也會在短時間內大幅波動。在心血管系統&#xff0c;持續性的心悸、胸悶、胸痛讓人仿佛時刻處于 “心臟病發作” 的恐懼之中&#xff0…

mysql replace into學習

drop table rm_ic.test_replace; create table rm_ic.test_replace(id int(11) auto_increment primary key,name varchar(100) ,uid varchar(100) comment 身份證 unique key ) ; insert into rm_ic.test_replace values(1,張三,111),(2,李四,222),(3,王五,333),(4,趙六,444);…

ProtoBuf:通訊錄4.0實現 序列化能?對?驗證

&#x1f308; 個人主頁&#xff1a;Zfox_ &#x1f525; 系列專欄&#xff1a;ProtoBuf &#x1f525; ProtoBuf&#xff1a;通訊錄4.0實現 Protobuf還常?于通訊協議、服務端數據交換場景。那么在這個?例中&#xff0c;我們將實現?個?絡版本的通訊錄&#xff0c;模擬實現…

界面控件DevExpress WPF v24.2新版亮點:電子表格組件全新升級

DevExpress WPF擁有120個控件和庫&#xff0c;將幫助您交付滿足甚至超出企業需求的高性能業務應用程序。通過DevExpress WPF能創建有著強大互動功能的XAML基礎應用程序&#xff0c;這些應用程序專注于當代客戶的需求和構建未來新一代支持觸摸的解決方案。 DevExpress WPF控件近…

EcoVadis提升評估得分的策略,EcoVadis常見挑戰與解決方案

EcoVadis評估概述 EcoVadis是全球領先的企業社會責任(CSR)評級平臺&#xff0c;為全球供應鏈提供可持續性評估服務。該評估體系通過對環境、勞工與人權、商業道德和可持續采購四大主題的全面評估&#xff0c;幫助企業衡量和改進其CSR表現。 評估核心內容 EcoVadis評估涵蓋以…

深入理解指針(五)

1. 回調函數是什么&#xff1f; 2. qsort使用舉例 3. qsort函數的模擬實現 1. 回調函數是什么&#xff1f; 回調函數就是?個通過函數指針調用的函數。 如果你把函數的指針&#xff08;地址&#xff09;作為參數傳遞給另?個函數&#xff0c;當這個指針被用來調用其所指向的…

Docker 日志

Docker 日志是排查容器故障、監控運行狀態的重要工具。下面從 日志查看命令、詳解字段、日志驅動、最佳實踐 四個方面給你詳細解析。 一、最常用日志命令 1. 查看容器日志&#xff08;默認 stdout、stderr&#xff09; docker logs <container_name|container_id>2. 實…

SAP生產環境修改程序

1. 關鍵的兩個標準函數 TRINT_CORR_INSERT TRINT_CORR_CHECK 2. 自定義SAP生產環境修改程序 *data:begin of itab occurs 0, * lines(150), * end of itab. DATA itab TYPE TABLE OF string. PARAMETERS:program LIKE rs38m-programm. READ REPORT program INT…

構建高性能網絡服務:從Reactor模式到現代服務器架構設計

在當今高并發、低延遲的應用場景下&#xff0c;如何設計高效穩定的網絡服務成為后端開發的核心挑戰。本文將深入探討網絡服務的演進路徑&#xff0c;結合Reactor模式、one thread one loop思想等關鍵技術&#xff0c;揭示高性能服務器架構的設計精髓。 一、網絡通信的核心問題與…

HarmonyOS 5 多端適配原理與BreakpointSystem工具類解析:附代碼

H 一、鴻蒙多端適配的核心概念 鴻蒙系統的多端適配通過響應式布局和媒體查詢實現&#xff0c;核心在于根據設備屏幕尺寸動態調整UI結構。其實現邏輯與Web響應式設計類似&#xff0c;但針對鴻蒙ArkUI框架進行了定制化封裝。 二、BreakpointSystem工具類&#xff1a;多端適配的…

Telerik生態整合:Kendo UI for Angular組件在WinForms應用中的深度嵌入(二)

Telerik DevCraft包含一個完整的產品棧來構建您下一個Web、移動和桌面應用程序。它使用HTML和每個.NET平臺的UI庫&#xff0c;加快開發速度。Telerik DevCraft提供完整的工具箱&#xff0c;用于構建現代和面向未來的業務應用程序&#xff0c;目前提供UI for ASP.NET MVC、Kendo…

紅帽全球副總裁曹衡康:開源AI開啟企業級應用新紀元

在生成式AI技術迅猛發展的今天&#xff0c;ChatGPT、DeepSeek、元寶等AI應用已不再僅僅是科技前沿的象征&#xff0c;而是切實地融入到了我們的工作與生活之中&#xff0c;為企業帶來了前所未有的變革機遇。對于企業而言&#xff0c;如何有效利用AI技術降本增效&#xff0c;已成…

異構計算解決方案(兼容不同硬件架構)

異構計算解決方案通過整合不同類型處理器&#xff08;如CPU、GPU、NPU、FPGA等&#xff09;&#xff0c;實現硬件資源的高效協同與兼容&#xff0c;滿足多樣化計算需求。其核心技術與實踐方案如下&#xff1a; 一、硬件架構設計 異構處理器組合? 主從協作模式?&#xff1a…

中科米堆汽車車門自動化三維檢測3D尺寸測量設備自動外觀檢測

汽車的每一個零部件的質量都關乎著整車的性能與安全。汽車車門作為車輛的重要組成部分&#xff0c;不僅承擔著保護車內人員安全的關鍵職責&#xff0c;其外觀質量與尺寸精度也直接影響著消費者的第一印象和駕駛體驗。 汽車車門制造涉及眾多復雜的工藝流程&#xff0c;從沖壓成…

Python 數據分析與可視化 Day 4 - Pandas 數據篩選與排序操作

&#x1f3af; 今日目標 掌握 Pandas 中 groupby() 的使用方式學會使用 agg() 方法進行多個聚合掌握 pivot_table() 構建透視表結合分組與排序進行更深入的分析 &#x1f9ee; 一、基本分組統計&#xff08;groupby&#xff09; ? 分組 單列聚合 df.groupby("性別&qu…

智能營銷系統對企業的應用價值

在當前快速迭代的商業環境中&#xff0c;企業與客戶的連接方式正經歷前所未有的深刻變革。傳統的市場策略在數據洪流和日益個性化的消費者需求面前&#xff0c;效能正逐步遞減。 企業決策者普遍面臨一個核心挑戰&#xff1a;如何在復雜多變的市場中&#xff0c;實現營銷資源的最…

docker鏡像中集成act工具

# 使用官方 Ubuntu 22.04 基礎鏡像 FROM ubuntu:22.04# 安裝系統依賴并清理緩存 RUN apt-get update && \apt-get install -y --no-install-recommends \curl \git \make \gcc \g \libssl-dev \pkg-config \&& \apt-get clean && \rm -rf /var/lib/apt…

Docker 與 Containerd 交互機制簡單剖析

#作者&#xff1a;鄧偉 文章目錄 一、背景&#xff1a;Docker 架構的演進之路1.1 從自研運行時到 OCI 標準化1.2 現行架構分層模型 二、核心交互組件解析2.1 通信協議&#xff1a;gRPC 雙向流的應用2.2 鏡像生命周期管理交互2.2.1 鏡像拉取流程&#xff08;以 docker pull 為例…