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

HDR贴图的概念与特性

HDR(高动态范围)贴图是Unity URP中用于存储超出标准0-1范围光照信息的特殊纹理格式。与普通LDR(低动态范围)贴图相比,HDR贴图能够存储更广范围的亮度值,通常使用16位或32位浮点精度而非8位整数精度。

HDR贴图主要分为两类:

  • HDR环境贴图‌:用于天空盒和环境光照,通常采用.hdr或.exr格式
  • HDR光照贴图‌:用于烘焙光照信息,存储间接光照数据

HDR贴图解决的问题

亮度范围限制‌:

  • 传统LDR贴图只能表示0-1范围的亮度值,无法准确表现真实世界的光照强度(如阳光直射可能达到100,000尼特)。

细节丢失‌:

  • LDR在高亮区域会产生过曝,丢失细节;在暗部则会产生噪点和色带。

光照计算精度‌:

  • HDR贴图提供更高精度的光照数据,使后期处理(如Bloom、色调映射)效果更自然。

URP中HDR贴图的具体使用

导入HDR环境贴图

csharp
// 通过代码加载HDR贴图
public class HDRLoader : MonoBehaviour {
public Texture2D hdrTexture; void Start() {
// 设置HDR贴图为天空盒
RenderSettings.skybox.SetTexture("_MainTex", hdrTexture);
}
}

配置HDR天空盒

  • 下载HDR贴图(推荐HDRI Hub等资源网站)
  • 导入Unity项目,确保纹理导入设置中"Texture Shape"设为Cube
  • 创建材质,选择Shader > Skybox > Cubemap
  • 将HDR贴图拖入材质
  • 在Lighting窗口中将材质指定为天空盒

烘焙HDR光照贴图

  • 确保场景物体:

    • 具有Mesh Renderer组件
    • 标记为Contribute GI
    • 启用了Generate Lightmap UVs
  • 在Lighting窗口调整Lightmap Resolution和Scale In Lightmap参数
  • 关闭自动烘焙,手动执行烘焙以获得最佳效果

HDR贴图的高级应用

Light Cookies‌:

  • 使用HDR贴图作为2D遮罩或立方体贴图,控制光源形状和衰减
  • HDR贴图作为Light Cookies可以精确控制光源的形状和衰减特性,相比普通LDR贴图能够表现更广范围的亮度值,特别适合模拟高亮度光源效果如聚光灯、霓虹灯等。URP中支持两种形式的Cookies:
    • 2D平面贴图‌:主要用于聚光灯(Spot Light)
    • 立方体贴图‌:主要用于点光源(Point Light)

2D HDR Cookie实现过程

  • 准备HDR贴图

    csharp
    // 创建HDR纹理
    Texture2D hdrCookie = new Texture2D(512, 512, TextureFormat.RGBAHalf, true);
    hdrCookie.wrapMode = TextureWrapMode.Clamp;
    hdrCookie.filterMode = FilterMode.Bilinear;
  • 应用到聚光灯

    csharp
    public class SpotLightCookieSetter : MonoBehaviour {
    public Texture2D hdrCookieTexture;
    public Light spotLight; void Start() {
    if(spotLight.type == LightType.Spot) {
    spotLight.cookie = hdrCookieTexture;
    spotLight.cookieSize = 10f;// 控制Cookie影响范围
    }
    }
    }
  • 材质设置

    在URP中需要确保材质使用支持HDR的Shader,如Universal Render Pipeline/Lit。

立方体HDR Cookie实现过程

  • 创建HDR立方体贴图
csharp
// 通过代码生成HDR立方体贴图
public Cubemap CreateHDRCubemap(int size) {
Cubemap hdrCubemap = new Cubemap(size, TextureFormat.RGBAHalf, true);
// 填充各面数据...return hdrCubemap;
}
  • 应用到点光源
csharp
public class PointLightCookieSetter : MonoBehaviour {
public Cubemap hdrCubemap;
public Light pointLight; void Start() {
if(pointLight.type == LightType.Point) {
pointLight.cookie = hdrCubemap;
}
}
}
  • 完整示例:HDR Cookie光照场景

    • HDRCookieDemo.cs

      using UnityEngine;
      using UnityEngine.Rendering.Universal; public class HDRCookieDemo : MonoBehaviour {
      public Texture2D spotCookie;
      public Cubemap pointCookie;
      public Light spotLight;
      public Light pointLight; void Start() {
      // 设置聚光灯Cookie
      spotLight.type = LightType.Spot;
      spotLight.cookie = spotCookie;
      spotLight.cookieSize = 8f; // 设置点光源Cookie
      pointLight.type = LightType.Point;
      pointLight.cookie = pointCookie; // 确保使用HDR
      spotLight.useColorTemperature = true;
      pointLight.useColorTemperature = true;
      }
      }

关键参数调整

  • 亮度控制‌:HDR Cookie的亮度值可以超过1.0,实现超亮光源效果
  • 衰减调节‌:通过Cookie的边缘渐变控制光源衰减
  • 色彩范围‌:HDR支持更广的色域表现

性能优化建议

  • 合理控制HDR Cookie分辨率(通常512x512足够)
  • 对远处光源使用较低分辨率Cookie
  • 考虑使用压缩的HDR格式(如BC6H)减少内存占用
  • 动态加载和卸载HDR Cookie资源

反射探针‌:

  • 生成HDR立方体贴图用于高质量反射

  • HDR反射探针通过捕获场景环境生成高动态范围立方体贴图,为物体提供更真实的反射效果。相比传统LDR反射贴图,HDR立方体贴图能够存储更广范围的亮度值(0-65504),保留亮部和暗部细节,特别适合表现金属、玻璃等高反射材质。

  • 创建并配置反射探针

    csharp
    // 创建反射探针并设置HDR属性
    GameObject probeObj = new GameObject("HDR_ReflectionProbe");
    ReflectionProbe probe = probeObj.AddComponent<ReflectionProbe>();
    probe.mode = ReflectionProbeMode.Realtime;
    probe.hdr = true;// 启用HDR
    probe.resolution = 512;// 分辨率
    probe.shadowDistance = 50f;// 阴影距离
    probe.cullingMask = LayerMask.GetMask("Default");// 渲染层
    probe.boxProjection = true;// 启用盒投影
  • 烘焙HDR立方体贴图

    csharp
    // 手动触发烘焙
    IEnumerator BakeHDRProbe(ReflectionProbe probe) {
    probe.RenderProbe();
    while(probe.IsFinishedRendering(probe.GetInstanceID()) == false) {
    yield return null;
    }
    Debug.Log("HDR Cubemap烘焙完成");
    }
  • 在Shader中采样HDR反射贴图

    glsl
    // URP Shader中采样HDR反射探针
    half3 SampleHDRReflection(float3 worldPos, float3 worldNormal) {
    float3 reflectDir = reflect(-_WorldSpaceCameraPos.xyz, worldNormal);
    half4 encodedCubemap = SAMPLE_TEXTURECUBE(unity_SpecCube0, samplerunity_SpecCube0, reflectDir);
    half3 decodedColor = DecodeHDREnvironment(encodedCubemap, unity_SpecCube0_HDR);
    return decodedColor;
    }

完整示例

  • HDRReflectionDemo.cs

    using UnityEngine;
    using UnityEngine.Rendering.Universal; public class HDRReflectionDemo : MonoBehaviour {
    public Material reflectiveMaterial;
    public Light directionalLight; void Start() {
    // 1. 创建HDR反射探针
    var probeObj = new GameObject("HDR_Probe");
    var probe = probeObj.AddComponent<ReflectionProbe>();
    probe.size = new Vector3(20, 20, 20);
    probe.hdr = true;
    probe.resolution = 1024; // 2. 设置反射材质参数
    reflectiveMaterial.SetFloat("_Metallic", 1.0f);
    reflectiveMaterial.SetFloat("_Smoothness", 0.95f); // 3. 动态更新反射探针
    StartCoroutine(UpdateProbe(probe));
    } IEnumerator UpdateProbe(ReflectionProbe probe) {
    while(true) {
    probe.RenderProbe();
    while(!probe.IsFinishedRendering(probe.GetInstanceID())) {
    yield return null;
    }
    yield return new WaitForSeconds(1f); // 每秒更新一次
    }
    }
    }

关键参数优化建议

  • 分辨率选择‌:根据目标平台性能选择256-2048分辨率,移动端建议512
  • 更新频率‌:实时探针可选择"Via Scripting"模式按需更新
  • 盒投影‌:室内场景务必启用Box Projection实现距离相关反射
  • 混合距离‌:多个探针间设置Blend Distance实现平滑过渡
  • HDR解码‌:确保Shader中正确使用DecodeHDREnvironment函数处理HDR数据

性能优化

  • 对静态物体使用Baked模式探针,动态物体使用Realtime模式
  • 通过Importance属性控制多个探针的混合权重
  • 使用Time Slicing分散探针更新负载
  • 合理设置Culling Mask避免渲染不必要对象
  • 移动平台可降低HDR精度至R11G11B10格式

全局光照‌:

  • HDR贴图提供更精确的间接光照计算基础

  • 准备HDR环境贴图

    首先需要获取HDR环境贴图(.hdr或.exr格式),推荐从HDRI Hub等资源网站下载高质量的HDR天空盒贴图。导入Unity后需将纹理类型设置为"Cube"并启用HDR选项:

    csharp
    // 通过代码验证HDR贴图设置
    void CheckHDREnvironment(Texture2D hdrTexture) {
    if(hdrTexture.format != TextureFormat.RGBAHalf) {
    Debug.LogError("请使用HDR格式贴图(RGBAHalf)");
    }
    }
  • 配置HDR全局光照

    • 在URP渲染管线中设置HDR环境光:
    csharp
    public class HDRGlobalIllumination : MonoBehaviour {
    public Cubemap hdrCubemap;
    public Material skyboxMaterial; void Start() {
    // 设置HDR天空盒
    RenderSettings.skybox = skyboxMaterial;
    skyboxMaterial.SetTexture("_Tex", hdrCubemap); // 启用HDR全局光照
    RenderSettings.ambientMode = AmbientMode.Skybox;
    DynamicGI.UpdateEnvironment();
    }
    }
  • 烘焙HDR光照贴图

    • 确保场景静态物体:

      • 具有Mesh Renderer组件
      • 标记为Contribute GI
      • 启用了Generate Lightmap UVs
    • 在Lighting窗口设置:

      csharp
      Lightmapping.lightingSettings.lightmapResolution = 40;// 每单位分辨率
      Lightmapping.lightingSettings.lightmapper = Lightmapper.ProgressiveGPU;
      Lightmapping.lightingSettings.filteringMode = LightmapFiltering.Advanced;
    • 执行烘焙:

      csharp
      Lightmapping.BakeAsync();// 异步烘焙避免卡顿

材质Shader适配

  • 在URP Lit Shader中增强HDR间接光采样:

    glsl
    // 在URP Shader中增加HDR间接光处理
    half3 SampleHDRIndirectLight(float3 worldPos, float3 normal) {
    half3 indirectDiffuse = SampleSH9(normal); // 球谐光照
    half4 encodedCubemap = SAMPLE_TEXTURECUBE_LOD(unity_SpecCube0, samplerunity_SpecCube0, reflect(-worldPos, normal), 0);
    half3 decodedColor = DecodeHDREnvironment(encodedCubemap, unity_SpecCube0_HDR);
    return indirectDiffuse * 0.5 + decodedColor * 0.5; // 混合光照
    }

实时更新策略

  • 对于动态物体,结合光照探针和反射探针:

    csharp
    public class DynamicHDRGI : MonoBehaviour {
    public ReflectionProbe hdrProbe;
    public LightProbeGroup lightProbes; void Update() {
    // 每2秒更新一次探针
    if(Time.frameCount % 120 == 0) {
    hdrProbe.RenderProbe();
    LightProbes.Tetrahedralize();
    }
    }
    }

性能优化

  • 静态物体使用烘焙光照贴图,动态物体使用HDR光照探针
  • 根据距离分级使用不同分辨率的HDR贴图(近处1024,远处256)
  • 使用BC6H压缩格式减少HDR贴图内存占用
  • 通过脚本控制探针更新频率避免性能峰值

性能优化建议

  • 合理控制HDR贴图分辨率,平衡质量与性能
  • 移动平台考虑使用压缩的HDR格式(如ASTC HDR)
  • 对远处或小物体使用较低分辨率的HDR光照贴图
  • 动态加载和卸载HDR贴图以管理内存

HDR贴图是URP实现高质量渲染的重要工具,正确使用可以显著提升场景的真实感和视觉冲击力


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

(欢迎点赞留言探讨,更多人加入进来能更加完善这个探索的过程,)

【光照】UnityURP中的[HDR贴图]的更多相关文章

  1. 如何在 Creator3D 中切换模型贴图,超级简单!

    效果预览 前两天有伙伴在 QQ 上询问,如何在 Creator 3D 中切换模型贴图.Shawn 之前也没尝试过,不过根据之前 Cocos Creator 的经验以及这几天对 Creator 3D 的 ...

  2. android中广告轮播图总结

    功能点:无限轮播.指示点跟随.点击响应.实现思路: 1.指示点跟随,指示点通过代码动态添加,数量由图片数量决定. 在viewpager的页面改变监听中,设置点的状态选择器enable,当前页时,set ...

  3. QT模态对话框用法(在UI文件中设置Widget背景图,这个图是一个带阴影边框的图片——酷)

    QT弹出模态对话框做法: 1.新建UI文件时,一定要选择基类是QDialog的,我的选择是:Dialog without Buttons(),如下图: 2.然后在使用的时候: MyDialog dlg ...

  4. 一步步教你读懂NET中IL(附带图)

    一步步教你读懂NET中IL(附带图) 接触NET也有1年左右的时间了,NET的内部实现对我产生了很大的吸引力,在msdn上找到一篇关于NET的IL代码的图解说明,写的挺不错的.个人觉得:能对这些底部的 ...

  5. angularjs中使用轮播图指令swiper

    我们在angualrjs移动开发中遇到轮播图的功能 安装 swiper  npm install --save swiper   或者 bower install --save swiper 引入文件 ...

  6. VMware workstation 虚拟机中安装乌班图及其兼容性问题

    之前我在虚拟机中安装乌班图,是先安装好虚拟机,然后将预先下载好的乌班图镜像文件导入安装,这样安装起来还是有些繁琐的,中间要设置好多东西.今天领导给我拷了个虚拟机,还有乌班图的安装文件,是这样的. 对于 ...

  7. Android中使用SVG矢量图(一)

    SVG矢量图介绍 首先要解释下什么是矢量图像,什么是位图图像? 1.矢量图像:SVG (Scalable Vector Graphics, 可伸缩矢量图形) 是W3C 推出的一种开放标准的文本式矢量图 ...

  8. idea 中如何生成类图

    前言:记录一下 idea 中如何生成类图,毕竟类图在开发或看源码时用得特别多. 推荐博客:https://blog.csdn.net/zhangle1hao/article/details/78804 ...

  9. 虚拟机中CentOS 7 x64图形化界面的安装

    VMware的初始设置如下: 图1 待虚拟机读取完iso,出现此界面 图2 我们主要是安装图形化界面的系统,所以在软件选择栏下如图选择: 图3 设置root密码,创建用户,等候安装完成: 图4 安装完 ...

  10. js轮播图和bootstrap中的轮播图

    js中的轮播图案例: <!DOCTYPE html><html lang="en"> <head> <meta charset=" ...

随机推荐

  1. 使用RestCloud ETL轻松解决WebService数据同步

    当前许多企业的业务系统甚至是SAAS系统只能提供WebService接口,如SAP.Workday等. 如何才能将众多的WebService接口同步到本地或数据中心呢? 传统的做法是通过编写代码实现, ...

  2. MacOS-“System Information”这个App用做USB设备的检测与设备文件的确定

    "System Information"这个Apple自带的GUI小App是检测USB硬件的; 如图所示: 而Linux上是 lsusb 与 lspci 这类command lin ...

  3. B站学爬虫 梨视频ajax双重抓包

    梨视频ajax双重抓包 B站学爬虫记录 页面抓包 这个页面下拉到底会刷出24个新视频,这是ajax随机加载的. 下拉到底抓到数据 查看数据包,请求为http://www.pearvideo.com/p ...

  4. win10系统出现C盘Desktop不可用的问题

    有电脑基地的用户在使用windows10专业版系统的时候,出现电脑开机后突然提示"Desktop不可用",怎么回事呢?其实,出现Desktop不可用,应该是注册表被修改造成的.接下 ...

  5. CF1027D. Come a Little Closer (multiset使用)

    D. Come a Little Closer codeforces原题链接:https://codeforces.com/contest/2114/problem/D Output For each ...

  6. 以标准为舟,驶向能源管理新未来 —— 解读 ISO 50003

    一.ISO 50003 标准的背景与意义​ 在全球能源危机与气候变化的双重挑战下,能源管理已从企业的 "可选项" 转变为 "必答题".据国际能源署(IEA)数据 ...

  7. 精选 5 款 .NET 开源、功能强大的工作流系统,告别重复造轮子!

    前言 最近有不少小伙伴在DotNetGuide技术社区微信交流群里问:.NET 有哪些好用的工作流系统或者引擎推荐的?今天大姚给大家推荐 5 款 .NET 开源.功能强大的工作流系统,告别重复造轮子! ...

  8. [题解]P9432 [NAPC-#1] rStage5 - Hard Conveyors

    P9432 [NAPC-#1] rStage5 - Hard Conveyors 题意简述 给定一个\(N\)个节点的树形结构,其中有\(k\)个关键节点. 接下来有\(q\)次询问,每次询问给定\( ...

  9. git 基础操作,公私钥认证/ssh公私钥登录

    一.登录公私钥和git公私钥 1.服务器使用公钥,本地使用私钥: 2.ssh公钥登录服务器,与git公钥认证是同一套系统,不同的linux用户: 3.例如以root用户登入服务器,  cd ~/.ss ...

  10. QT AES加密

    一. 使用库:https://github.com/bricke/Qt-AES 二.代码举例 #include <QCryptographicHash> void MainWindow:: ...