Unity SRP 管线【第七讲:URP LOD实现以及Reflections反射探针】

目录

  • 一、URP LOD 组件
    • 1、LOD Group的使用
    • 2、LOD切换原理
      • Cross Fade(淡入淡出)模式
        • Animated Cross-Fading
        • 如果未设置Clip,并且Fade Transition Width不为0
        • LOD物体烘培
      • SpeedTree 模式
  • 二、反射探针
    • 1. 获取反射探针数据
    • 2. 环境光照明 IBL
    • 3. 反射探针(Reflection Probes)
      • 解码探针
    • 4. Box Projection 盒体投影

在这里插入图片描述
中文版:https://edu.uwa4d.com/lesson-detail/282/1314/0?isPreview=0
英文原版:https://catlikecoding.com/unity/tutorials/custom-srp/lod-and-reflections/

一、URP LOD 组件

在这里插入图片描述

1、LOD Group的使用

1. 首先该组件需要将子类模型置于该组件物体子节点下
在这里插入图片描述
2. 可在单个LOD中设置其level的模型,并可设置它的距离范围,即可在不同距离下显示不同的模型
在这里插入图片描述

若模型变化时间不符合预期,有如下几种方式调节:

  1. 重新继续Bound,Unity会根据三种LOD模型计算该模型的包围盒,从而在计算物体占屏幕
    在这里插入图片描述2. Project Settings > Quality > Level of Detail > LOD Bias, 该变量增大物体的评估高度,从而导致LOD切换时占比与实践物体占比不同。将 LOD Bias设为1,可以使组件阈值与实际大小同步。
    在这里插入图片描述
  2. LOD过渡类型:
    在这里插入图片描述
    • Cross Fade(淡入淡出),Fade Transition Width可调节过渡区域占比
      在这里插入图片描述

2、LOD切换原理

Cross Fade(淡入淡出)模式

当启用Cross Fade(淡入淡出)模式,相邻两个LOD对象会同时渲染出来,着色器将以某种方式进行混合。Unity通常使用屏幕抖动或者混合来实现Cross Fade。

在URP通用管线中,LOD现只用于SpeedTree7XXX.shader,即大面积树木的渲染,其余Shader并未使用,但并不代表不可以自定义。

我们可以通过UnityPerDraw下的变量float4 unity_LODFade; 取得LOD信息

CBUFFER_START(UnityPerDraw)float4 unity_LODFade; // x is the fade value ranging within [0,1]. // y is x quantized into 16 levels
CBUFFER_END
  • x分量存储过渡因子(逐渐远离消失的LOD对象,x分量从1变换到0;渐入的LOD对象,x分量从0变换到 -1
  • y分量存储了相同的因子,只不过被量化为16步

即,若渐出LOD的x值为0.4,则渐入LOD的值为 -0.6

我们可以通过一个Noise图来决定使用哪一级LOD的选择。

通过如下内置函数,即可快速得到一个Noise图
float dither = InterleavedGradientNoise(positionCS.xy, 0);

使用屏幕抖动实现LOD混合

void ShadowCasterPassFragment (Varyings input) {UNITY_SETUP_INSTANCE_ID(input);ClipLOD(input.positionCS.xy, unity_LODFade.x);}void ClipLOD (float2 positionCS, float fade) {#if defined(LOD_FADE_CROSSFADE)float dither = InterleavedGradientNoise(positionCS.xy, 0);clip(fade + (fade < 0.0 ? dither : -dither));#endif
}
Animated Cross-Fading

启用Animated Cross-Fading后,不再通过距离去设置渐入渐出的比例,当物体组比例超过LOD阈值就通过动画快速交叉渐变。

默认的动画持续时间为半秒,可以通过设置static LODGroup.crossFadeAnimationDuration来更改所有组的动画持续时间。然而,在unity2022中,当不在播放模式下,转换速度更快。

如果未设置Clip,并且Fade Transition Width不为0

则,当距离处于交叉切换之间,会使两个物体同时被渲染出来。
在这里插入图片描述
因此,如果未实现LOD交叉切换算法,请不要使用CrossFade选项。

LOD物体烘培

LOD0会被用于光照映射(Lightmapping)。其他LOD级别也会得到烘焙照明(Baked Light),但场景的其余部分只考虑LOD 0。你也可以决定只烘焙一些级别,让其他级别依靠光探针。

SpeedTree 模式

这种模式是专门针对SpeedTree树的,它使用自己的LOD系统来折叠树,并在3D模型和广告牌表示之间进行转换。
在这里插入图片描述

二、反射探针

1. 获取反射探针数据

  1. 如果未定义LightMap(烘培光照),则会使用球谐函数作为基础环境光颜色。此球谐函数即为环境球的球谐采样结果。
  2. 若想使用IBL作为镜面反射,需要添加反射探针标志。
perObjectData |= PerObjectData.ReflectionProbes;

2. 环境光照明 IBL

在Unity中,IBL环境光照贴图保存在UnityInput.hlsl

// Unity specific
TEXTURECUBE(unity_SpecCube0);
SAMPLER(samplerunity_SpecCube0);
TEXTURECUBE(unity_SpecCube1);
SAMPLER(samplerunity_SpecCube1);

在GlobalIllumination.hlsl中,使用函数

half3 CalculateIrradianceFromReflectionProbes(half3 reflectVector, float3 positionWS, half perceptualRoughness)

即可得到环境光照。函数中使用

half4 encodedIrradiance = half4(SAMPLE_TEXTURECUBE_LOD(unity_SpecCube0, samplerunity_SpecCube0, reflectVector, mip));

得到CubeMap Mipmap插值采样结果,并根据是否使用HDR解码。

#if defined(UNITY_USE_NATIVE_HDR)irradiance += weightProbe0 * encodedIrradiance.rbg;
#elseirradiance += weightProbe0 * DecodeHDREnvironment(encodedIrradiance, unity_SpecCube0_HDR);
#endif // UNITY_USE_NATIVE_HDR

SAMPLE_TEXTURECUBE_LOD函数根据使用的API不同,实现各不相同
在这里插入图片描述

IBL在URP Shader中,通过如下函数得到包括环境光照在内的所有全局光照。

lightingData.giColor = GlobalIllumination(brdfData, brdfDataClearCoat, surfaceData.clearCoatMask,inputData.bakedGI, aoFactor.indirectAmbientOcclusion, inputData.positionWS,inputData.normalWS, inputData.viewDirectionWS);
half3 reflectVector = reflect(-viewDirectionWS, normalWS);
half NoV = saturate(dot(normalWS, viewDirectionWS));
half fresnelTerm = Pow4(1.0 - NoV);half3 indirectDiffuse = bakedGI;
half3 indirectSpecular = GlossyEnvironmentReflection(reflectVector, positionWS, brdfData.perceptualRoughness, 1.0h);half3 color = EnvironmentBRDF(brdfData, indirectDiffuse, indirectSpecular, fresnelTerm);
  • bakedGI值为LightMap烘培光照数据,或者是环境球谐的采样结果。
  • 通过GlossyEnvironmentReflection计算基于环境的镜面反射光照
  • 最后通过EnvironmentBRDF函数获取混合结果(漫反射颜色 * 漫反射系数 + 镜面反射颜色 * 镜面反射系数)。
half3 EnvironmentBRDF(BRDFData brdfData, half3 indirectDiffuse, half3 indirectSpecular, half fresnelTerm)
{half3 c = indirectDiffuse * brdfData.diffuse;c += indirectSpecular * EnvironmentBRDFSpecular(brdfData, fresnelTerm);return c;
}

3. 反射探针(Reflection Probes)

在场景中未使用反射探针时,场景中具有反射(包括镜面反射Specular和金属反射Metallic)的物体会使用天空贴图(包括天空面 Sky Plane / 天空盒 Sky Box / 天空球 Sky Dome)的信息来制作反射效果。

默认的 environment cube map 只包含天空盒。为了反射场景中的其他东西,我们必须通过GameObject / Light / reflection probe为其添加反射探针。这些探测器在它们的位置处看向场景,将场景渲染为立方体贴图。因此,只有在靠近探测器的表面上,反射才会显得或多或少正确。因此,通常需要在一个场景中放置多个探头。它们具有Importance和Box Size属性,可用于控制每个探针影响的区域。
在这里插入图片描述

探测器的Type默认设置为Baked,这意味着它只渲染一次,CubeMap在构建时渲染。你也可以将其设置为实时,这将使地图与动态场景保持同步。它像任何其他相机一样被渲染,使用我们的RP,对立方体地图的六个面分别渲染一次。所以实时反射探测器很昂贵。

每个对象只使用一个环境探针,但场景中可以有多个探针。因此,你可能不得不 split 对象以获得 acceptable(理想的) 的反射。例如,理想情况下,用于构建结构的立方体应该分成单独的内部和外部部分,这样每个部分都可以使用不同的反射探头。此外,这意味着GPU batching 会被反射探针破坏。不幸的是,网格球根本不能使用反射探针,所以渲染出来的总是天空盒。
在这里插入图片描述

MeshRenderer组件有一个Anchor Override(直接将带有Probe的物体拖上去就好),可以用来微调它们使用的探针,而不必担心盒子的大小和位置。还有一个Reflection Probes,默认设置为Blend Probes。我们的想法是,Unity允许在最好的两个反射探针之间进行混合。然而,这种模式与SRP批处理程序不兼容,所以Unity的其他rp不支持它,我们也不支持。如果你很好奇,我在2018年SRP教程的反射教程中解释了如何混合探针,但我希望这个功能在遗留管道被删除后消失。
在这里插入图片描述
我们将在将来研究其他反射技术。所以仅有的两个功能模式是Off,它总是使用天空盒子,和Simple,它选择最重要的探测器。其他的功能和Simple完全一样。

除此之外,反射探针还可以选择启用box projection mode。这将改变如何确定反射以更好地匹配其有限的影响区域,但SRP批处理程序也不支持这一点,因此我们也不支持它。

:物体在选择反射探针时,确定物体是否在探针包围盒内,如果在,则加入列表;再根据所有影响物体的反射探针的权重,只保留权重最大的一批(若有2个权重为5,3个权重为3,则只保留权重为5的探针),再根据交叉体积权重计算保留的反射探针的系数。
特别的,当大包围盒反射探针完全覆盖小包围盒反射探针,且物体处于小包围盒反射探针内,则默认最小包围盒探针为最重要探针。

解码探针

最后,我们必须确保正确地解释来自CubeMap的数据。它可以是HDR或LDR,其强度也可以调节。这些设置是通过unity_SpecCube0_HDR矢量提供的,它在UnityPerDraw缓冲区中的unity_ProbesOcclusion之后。

// Reflection Probe 0 block feature
// HDR environment map decode instructions
real4 unity_SpecCube0_HDR;
real4 unity_SpecCube1_HDR;

解码函数:

float3 SampleEnvironment (Surface surfaceWS, BRDF brdf) {return DecodeHDREnvironment(environment, unity_SpecCube0_HDR);
}

4. Box Projection 盒体投影

引自:技术美术杂谈 反射探针(Reflection Probe)

在未开启盒体投影时,反射贴图的图像通常是通过从无限远处投射的。

开启盒体投影允许我们使用探针包围盒尺寸Probe Size 、探针包围盒偏移 Probe Offset 以及镜头与反射物体的距离作为参数,控制反射探针所生成的反射贴图的尺寸和效果。

通常情况下,Unity默认开启反射探针的盒体投影支持。如果想自定义不同画面质量是否支持盒体投影效果,可以在编辑面板 Edit →项目设置 Project Settings →图像设置 Graphics →画面分级设置 Tier Settings 中取消勾选使用默认设置 Use Defaults ,并进行自定义设置。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/661479.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

部署前后端分离项目详细教程

部署前后端分离项目详细教程 1、准备工作 首先你需要一台服务器&#xff0c;然后在服务器上安装好你所需要的环境&#xff0c;我这里用的宝塔界面来安装环境。 如果有人不知道怎么安装宝塔界面&#xff0c;可参考这篇文章&#xff0c;如果不知道怎么买服务器&#xff0c;可以参…

菜鸡后端的前端学习记录-2

前言 记录一下看视频学习前端的的一些笔记&#xff0c;以前对Html、Js、CSS有一定的基础&#xff08;都认得&#xff0c;没用过&#xff09;&#xff0c;现在不想从头再来了&#xff0c;学学Vue框架&#xff0c;不定时更新&#xff0c;指不定什么时候就鸽了。。。。 忘了记一下…

前端工程化基础(四):Git代码版本控制工具详解

Git版本控制工具详解 认识版本控制&#xff08;版本控制&#xff09; 是维护 工程蓝图的标准做法&#xff0c;能追踪工程蓝图从诞生一直到定案的过程版本控制也是 一种软件工程技巧&#xff0c;借此能在软件开发的过程中&#xff0c;确保不同的人所编辑的同一程序都能得到同步…

tcp/ip模型中,帧是第几层的数据单元?

在网络通信的世界中&#xff0c;TCP/IP模型以其高效和可靠性而著称。这个模型是现代互联网通信的基石&#xff0c;它定义了数据在网络中如何被传输和接收。其中&#xff0c;一个核心的概念是数据单元的层级&#xff0c;特别是“帧”在这个模型中的位置。今天&#xff0c;我们就…

有趣的css - 简约的动态关注按钮

页面效果 此效果主要使用 css 伪选择器配合 css content 属性&#xff0c;以及 transition(过渡)属性来实现一个简约的动态按钮效果。 此效果可适用于关注按钮、详情按钮等&#xff0c;增强用户交互体验。 核心代码部分&#xff0c;简要说明了写法思路&#xff0c;看 css 部分的…

一文详解docker swarm

文章目录 1、简介1.1、涉及到哪些概念&#xff1f;1.2、需要注意什么&#xff1f; 2、集群管理2.1、创建集群2.2、将节点加入集群2.3、查看集群状态。2.4、将节点从集群中移除2.5、更新集群2.6、锁定/解锁集群 3、节点管理4、服务部署4.1、准备4.2、服务管理4.2.1、常用命令4.2…

[C++]继承(续)

一、基类和派生类对象赋值转换 在public继承时&#xff0c;父类和子类是一个“is - a”的关系。 子类对象赋值给父类对象/父类指针/父类引用&#xff0c;我们认为是天然的&#xff0c;中间不产生临时对象&#xff0c;也叫作父子类赋值兼容规则&#xff08;切割/切片&#xff…

idea查看日志的辅助插件 --- Grep Console (高亮、取消高亮)

&#x1f680; 分享一款很有用的插件&#xff1a;Grep Console &#x1f680; 我们在查看日志的时候可能会有遗漏&#xff0c;使用这款插件可以让特定的关键词高亮&#xff0c;可以达到不遗漏的效果&#xff01; 如果你是一个开发者或者对日志文件分析感兴趣&#xff0c;不要…

记录一次使用ant design 中 ConfigProvider来修改样式导致样式改变的问题(Tabs嵌套Tabs)

一 说明 继之前的一篇文章&#xff1a;antd5 Tabs 标签头的文本颜色和背景颜色修改 后&#xff0c;发现在被修改后的Tab中继续嵌套Tabs组件&#xff0c;这个新的Tabs组件样式跟外层Tabs样式也是一致的&#xff0c;如下图所示&#xff1a; 二 原因 在修改外层tabs样式时&…

又涨又跌 近期现货黄金价格波动怎么看?

踏入2024年一月的下旬&#xff0c;现货黄金价格可以说没了之前火热的状态&#xff0c;盘面上是又涨又跌。面对这样的行情&#xff0c;很多投资者不知道如何看了。下面我们就来讨论一下怎么把握近期的行情。 先区分走势类型。在现货黄金市场中有两种主要的走势类型&#xff0c;一…

【SpringCloud】使用OpenFeign进行微服务化改造

目录 一、需求与背景二、OpenFeign 远程调用技术原理三、项目代码演示3.1 引入依赖3.2 实现OpenFeign注解修饰接口3.3 指定 OpenFeign 远程调用接口的扫描路径 四、OpenFeign 在日志中打印Request和Response五、OpenFeign 客户端超时配置六、使用 OpenFeign 实现服务降级6.1 实…

《区块链简易速速上手小册》第10章:区块链的未来与趋势(2024 最新版)

文章目录 10.1 区块链的未来展望10.1.1 基础知识10.1.2 主要案例&#xff1a;区块链在金融领域的发展10.1.3 拓展案例 1&#xff1a;区块链在供应链管理中的应用10.1.4 拓展案例 2&#xff1a;区块链在身份管理和隐私保护中的应用 10.2 新兴技术与区块链的融合10.2.1 基础知识1…

智能家居的网关新形态:Aqara 方舟智慧中枢 M3 体验

如果说在刚刚结束的 2023 年有哪些备受期待的智能家居产品&#xff0c;Aqara 方舟智慧中枢 M3 一定榜上有名&#xff0c;我的多位朋友也曾在装修过程中多次向我询问是否有这款产品的相关资讯&#xff1b;谁能想到自从在 2022 年 11 月首次亮相之后&#xff0c;这款产品一直等了…

vulhub靶机activemq环境下的CVE-2015-5254(ActiveMQ 反序列化漏洞)

影响范围 Apache ActiveMQ 5.x ~ Apache ActiveMQ 5.13.0 远程攻击者可以制作一个特殊的序列化 Java 消息服务 (JMS) ObjectMessage 对象&#xff0c;利用该漏洞执行任意代码。 漏洞搭建 没有特殊要求&#xff0c;请看 (3条消息) vulhub搭建方法_himobrinehacken的博客-CSD…

iOS图像处理----探索图片解压缩到渲染的全过程以及屏幕卡顿

一&#xff1a;图像成像过程 ①、将需要显示的图像&#xff0c;由CPU和GPU通过总线连接起来&#xff0c;在CPU中输出的位图经总线在合适的时机上传给GPU &#xff0c;GPU拿到位图做相应位图的图层渲染、纹理合成。 ②、将渲染后的结果&#xff0c;存储到帧缓存区&#xff0c;帧…

【脑电信号处理与特征提取】P7-贾会宾:基于EEG/MEG信号的大尺度脑功能网络分析

基于EEG/MEG信号的大尺度脑功能网络分析 Q: 什么是基于EEG/MEG信号的大尺度脑功能网络分析&#xff1f; A: 基于脑电图&#xff08;EEG&#xff09;或脑磁图&#xff08;MEG&#xff09;信号的大尺度脑功能网络分析是一种研究大脑活动的方法&#xff0c;旨在探索脑区之间的功能…

【JavaSE篇】——继承

目录 &#x1f393;继承 ✅为什么需要继承 ✅继承概念 ✅继承的语法 ✅父类成员访问 &#x1f6a9;子类中访问父类的成员变量 1. 子类和父类不存在同名成员变量的情况 2. 子类和父类成员变量同名 &#x1f6a9;子类中访问父类的成员方法 1. 成员方法名字不同 2. 成员…

SAM:基于 prompt 的通用图像分割模型

Paper: Kirillov A, Mintun E, Ravi N, et al. Segment anything[J]. arXiv preprint arXiv:2304.02643, 2023. Introduction: https://segment-anything.com/ Code: https://github.com/facebookresearch/segment-anything SAM 是 Meta AI 开发的一款基于 prompt 的通用视觉大…

100%涨点!2024最新卷积块创新方案盘点(附模块和代码)

在写论文时&#xff0c;设计高效、创新的卷积块可以显著提升模型的性能&#xff0c;保障工作的有效性和先进性。另外&#xff0c;合理利用卷积块还可以帮助我们提升实验结果、拓展研究的视野和应用场景&#xff0c;增加论文的创新点。因此&#xff0c;对于论文er来说&#xff0…

BSV区块链将凭借Teranode的创新在2024年大放异彩

​​发表时间&#xff1a;2024年1月15日 2024年1月15日&#xff0c;瑞士楚格 – BSV区块链协会研发团队今日官宣了Teranode的突破性功能&#xff0c;这些功能将显著提升BSV区块链网络的效率和速度。在不久的将来&#xff0c;BSV区块链的交易处理能力将达到每秒100万笔交易。 T…