【URP】Unity中Mipmap是如何实现的?

【从UnityURP开始探索游戏渲染】专栏-直达

MipMap是Unity中用于优化纹理渲染的多级渐远纹理技术,其核心原理是通过预生成一系列分辨率递减的纹理金字塔(从原始尺寸逐级减半至1×1像素),根据物体与摄像机的距离动态选择合适层级的纹理进行采样。在URP(Universal Render Pipeline)中,该技术通过减少远处物体的纹理细节来提升渲染效率,同时避免因纹理缩小导致的摩尔纹和锯齿现象。

原理详解

纹理金字塔构建‌:

  • 原始纹理经过滤波处理生成多级缩略图,例如256×256的纹理会生成128×128、64×64等层级,每级分辨率递减50%。

动态层级选择‌:

  • GPU根据像素在屏幕空间中的覆盖面积自动计算合适的Mip层级(公式为level = log2(max(ddx,ddy)),其中ddx/ddy为纹理坐标导数)。

过滤技术配合‌:

  • 双线性过滤‌:在单一Mip层级内插值。
  • 三线性过滤‌:在相邻两个Mip层级间插值,消除层级切换的突兀感。

构建 纹理金字塔

在Unity URP中,Mipmap纹理金字塔的构建是通过GPU逐级下采样实现的,其核心流程分为硬件自动生成和计算着色器手动生成两种方式。

硬件自动生成原理

  • 基础纹理处理‌:原始纹理(如2048×2048)经过双线性/三线性滤波处理,生成分辨率逐级减半的子纹理(1024×1024、512×512等),直至1×1像素。
  • 层级关系计算‌:GPU根据屏幕像素覆盖率自动选择Mip层级,公式为:$lod=log2(max(\frac{\partial u}{\partial x},\frac{\partial v}{\partial y}))$其中偏导数通过纹理坐标微分计算。

计算着色器手动生成示例(Hi-Z技术)

  • 通过Compute Shader构建深度纹理的金字塔:
    • HiZFeature.cs

      /* by 01022.hk - online tools website : 01022.hk/zh/websocket.html */
      using UnityEngine;
      using UnityEngine.Rendering;
      using UnityEngine.Rendering.Universal;
      
      public class HiZFeature : ScriptableRendererFeature {
          class HiZPass : ScriptableRenderPass {
              ComputeShader _hizShader;
              RenderTexture _hizPyramid;
      
              public override void Execute(ScriptableRenderContext context, ref RenderingData data) {
                  CommandBuffer cmd = CommandBufferPool.Get();
                  // 从深度纹理生成Mipmap金字塔
                  int width = _hizPyramid.width;
                  int height = _hizPyramid.height;
                  for (int mip = 0; width >= 8 || height >= 8; mip++) {
                      cmd.SetComputeTextureParam(_hizShader, 0, "_HiZTexture", _hizPyramid, mip);
                      cmd.DispatchCompute(_hizShader, 0, width/8, height/8, 1);
                      width >>= 1; height >>= 1;
                  }
                  context.ExecuteCommandBuffer(cmd);
                  CommandBufferPool.Release(cmd);
              }
          }
      }
      
    • HiZ.compute

      /* by 01022.hk - online tools website : 01022.hk/zh/websocket.html */
      #pragma kernel CSMain_HiZ
      Texture2D<float> _DepthTexture;
      RWTexture2D<float> _HiZTexture;
      
      [numthreads(8, 8, 1)]
      void CSMain_HiZ(uint3 id : SV_DispatchThreadID) {
          // 8x8区域取最大深度值作为下采样结果
          float maxDepth = 0;
          for (int x = 0; x < 8; x++) {
              for (int y = 0; y < 8; y++) {
                  maxDepth = max(maxDepth, _DepthTexture[id.xy * 8 + uint2(x,y)]);
              }
          }
          _HiZTexture[id.xy] = maxDepth;
      }
      

关键步骤解析

  • 层级生成逻辑‌:每级Mipmap通过对上一级4个像素取平均值(颜色纹理)或最大值(深度纹理)生成,例如256×256纹理生成128×128层级时,每个新像素由原纹理2×2区域计算得出。
  • 过滤模式影响‌:
    • 双线性过滤‌:在单层Mip内插值4个相邻纹素。
    • 三线性过滤‌:在相邻两层Mip间进行二次插值,消除层级切换突变。

应用场景对比

生成方式适用场景性能开销
硬件自动生成常规颜色纹理
计算着色器生成深度纹理/特殊效果(如Hi-Z)中高

通过调整RenderTexture.useMipMap属性和GenerateMipMaps标志位可控制生成行为。手动生成更适合需要自定义下采样规则的场景,如遮挡剔除优化.

实现动态层级选择

在Unity URP中,Mipmap的动态层级选择是通过GPU硬件自动计算纹理坐标的导数(ddx/ddy)实现的.

动态选择原理

  • 导数计算‌$lod=log2(max(∥\frac{\partial u}{\partial x}∥,∥\frac{\partial v}{\partial y}∥))$

    GPU通过片元着色器中的纹理坐标偏导数(ddx(uv)ddy(uv))确定屏幕像素覆盖的纹理区域大小。当物体距离摄像机越远,UV坐标变化率越大,导数值越高。

    示例:若屏幕像素覆盖4×4纹素区域,则Mip层级计算公式为:

    此时计算结果为2(因4=2²),选择Mip Level 2的纹理。

  • 层级插值

    启用三线性过滤时,GPU会在计算出的层级(如2.3级)相邻两层(Level 2和Level 3)之间进行插值,消除突变感。

  • LOD偏移控制

    URP通过Texture2D.mipMapBias参数手动调整层级偏移,正值使纹理更模糊(强制使用更高层级),负值保留细节(偏向低级)。

实现示例

以下Shader代码演示手动控制Mip层级的两种方式:

hlsl
// 方式1:通过tex2Dlod硬编码层级
fixed4 frag(v2f i) : SV_Target {
    float4 uv = float4(i.uv, 0, _ManualLod); // _ManualLod为自定义层级
    return tex2Dlod(_MainTex, uv);
}

// 方式2:根据距离动态计算层级
float3 worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;
float dist = distance(_WorldSpaceCameraPos, worldPos);
float lod = log2(dist * _LodScale); // _LodScale控制距离敏感度
fixed4 col = tex2Dlod(_MainTex, float4(i.uv, 0, lod));

层级选择优化

  • Hi-Z技术

    对深度纹理构建Mip金字塔时,每层级存储最大深度值(而非颜色平均值),加速遮挡剔除。

    流程

    • 生成深度纹理Mipmap时,通过Compute Shader对4×4区域取最大值下采样。
    • 渲染时根据层级深度快速判断可见性。
  • ShaderGraph节点

    URP的Calculate Level Of Detail节点提供两种模式:

    • Clamped‌:限制在纹理最大层级内,避免越界。
    • Unclamped‌:允许超出现有层级,需配合边界处理。

性能与质量平衡

  • 过模糊问题‌:通过QualitySettings.masterTextureLimit全局限制最高层级。
  • 锐化需求‌:禁用Mipmap或使用Unlit Shader避免自动插值。

典型应用场景包括地形渲染(远山使用高Mip层级)和动态LOD系统(根据物体重要性调整mipMapBias

解决的问题

性能优化‌:

  • 减少显存带宽占用,远处物体使用低分辨率纹理降低GPU负载。

视觉质量‌:

  • 消除远景的像素闪烁(Texture Aliasing)和锯齿,提升平滑度。

缓存命中率‌:

  • 低分辨率纹理占用更少缓存空间,提高采样效率。

使用场景与限制

  • 适用场景‌:
    • 3D开放世界地形(如远山、建筑)。
    • 动态缩放的物体(如角色模型在远距离时)。
  • 不适用场景‌:
    • 2D像素游戏(需保持锐利像素风格)。
    • UI元素(通常无需动态缩放)。
  • 限制‌:
    • 内存开销增加33%(存储多级纹理)。
    • 可能引起远处纹理过度模糊(需调整Mip Bias参数)。

具体示例

  • Shader实现‌:

    在URP Shader中,可通过tex2Dlod函数手动指定Mip层级(float4参数的w分量控制层级)。例如:

    hlsl
    fixed4 frag(v2f i) : SV_Target {
        return tex2Dlod(_MainTex, float4(i.uv, 0, _MipLevel));
    }
    

    调整_MipLevel可观察不同层级的模糊效果.

  • Unity编辑器演示‌:

    • 导入纹理后勾选Generate Mip Maps,观察Inspector面板中的Mipmap预览滑块(0-10级)。
    • 对比开启/关闭Mipmap的相同纹理,远处物体在开启时会自然模糊,关闭则出现像素噪点。

通过权衡内存与性能,Mipmap在URP中成为优化大规模场景渲染的关键技术之一


【从UnityURP开始探索游戏渲染】专栏-直达
(欢迎点赞留言探讨,更多人加入进来能更加完善这个探索的过程,🙏)

AI 代码审查Review工具 是一个旨在自动化代码审查流程的工具。它通过集成版本控制系统(如 GitHub 和 GitLab)的 Webhook,利用大型语言模型(LLM)对代码变更进行分析,并将审查意见反馈到相应的 Pull Request 或 Merge Request 中。此外,它还支持将审查结果通知到企业微信等通讯工具。 一个基于 LLM 的自动化代码审查助手。通过 GitHub/GitLab Webhook 监听 PR/MR 变更,调用 AI 分析代码,并将审查意见自动评论到 PR/MR,同时支持多种通知渠道。 主要功能 多平台支持: 集成 GitHub 和 GitLab Webhook,监听 Pull Request / Merge Request 事件。 智能审查模式: 详细审查 (/github_webhook, /gitlab_webhook): AI 对每个变更文件进行分析,旨在找出具体问题。审查意见会以结构化的形式(例如,定位到特定代码行、问题分类、严重程度、分析和建议)逐条评论到 PR/MR。AI 模型会输出 JSON 格式的分析结果,系统再将其转换为多条独立的评论。 通用审查 (/github_webhook_general, /gitlab_webhook_general): AI 对每个变更文件进行整体性分析,并为每个文件生成一个 Markdown 格式的总结性评论。 自动化流程: 自动将 AI 审查意见(详细模式下为多条,通用模式下为每个文件一条)发布到 PR/MR。 在所有文件审查完毕后,自动在 PR/MR 中发布一条总结性评论。 即便 AI 未发现任何值得报告的问题,也会发布相应的友好提示和总结评论。 异步处理审查任务,快速响应 Webhook。 通过 Redis 防止对同一 Commit 的重复审查。 灵活配置: 通过环境变量设置基
【直流微电网】径向直流微电网的状态空间建模与线性化:一种耦合DC-DC变换器状态空间平均模型的方法 (Matlab代码实现)内容概要:本文介绍了径向直流微电网的状态空间建模与线性化方法,重点提出了一种基于耦合DC-DC变换器的状态空间平均模型的建模策略。该方法通过数学建模手段对直流微电网系统进行精确的状态空间描述,并对其进行线性化处理,以便于系统稳定性分析与控制器设计。文中结合Matlab代码实现,展示了建模与仿真过程,有助于研究人员理解和复现相关技术,推动直流微电网系统的动态性能研究与工程应用。; 适合人群:具备电力电子、电力系统或自动化等相关背景,熟悉Matlab/Simulink仿真工具,从事新能源、微电网或智能电网研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①掌握直流微电网的动态建模方法;②学习DC-DC变换器在耦合条件下的状态空间平均建模技巧;③实现系统的线性化分析并支持后续控制器设计(如电压稳定控制、功率分配等);④为科研论文撰写、项目仿真验证提供技术支持与代码参考。; 阅读建议:建议读者结合Matlab代码逐步实践建模流程,重点关注状态变量选取、平均化处理和线性化推导过程,同时可扩展应用于更复杂的直流微电网拓扑结构中,提升系统分析与设计能力。
内容概要:本文介绍了基于物PINN驱动的三维声波波动方程求解(Matlab代码实现)理信息神经网络(PINN)求解三维声波波动方程的Matlab代码实现方法,展示了如何利用PINN技术在无需大量标注数据的情况下,结合物理定律约束进行偏微分方程的数值求解。该方法将神经网络与物理方程深度融合,适用于复杂波动问题的建模与仿真,并提供了完整的Matlab实现方案,便于科研人员理解和复现。此外,文档还列举了多个相关科研方向和技术服务内容,涵盖智能优化算法、机器学习、信号处理、电力系统等多个领域,突出其在科研仿真中的广泛应用价值。; 适合人群:具备一定数学建模基础和Matlab编程能力的研究生、科研人员及工程技术人员,尤其适合从事计算物理、声学仿真、偏微分方程数值解等相关领域的研究人员; 使用场景及目标:①学习并掌握PINN在求解三维声波波动方程中的应用原理与实现方式;②拓展至其他物理系统的建模与仿真,如电磁场、热传导、流体力学等问题;③为科研项目提供可复用的代码框架和技术支持参考; 阅读建议:建议读者结合文中提供的网盘资源下载完整代码,按照目录顺序逐步学习,重点关注PINN网络结构设计、损失函数构建及物理边界条件的嵌入方法,同时可借鉴其他案例提升综合仿真能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值