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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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 为例…