问答 URP 下与 Built-in 的 Light Color 不一致

侑虎科技 · 2021年03月15日 · 23 次阅读

1)URP 下与 Built-in 的 Light Color 不一致
​2)开启 MSAA 的 RenderTarget 会对没开启 MSAA 的 RenderTarget 造成影响
3)角色 Mesh 合并的优点与缺点
4)NGUI 渲染层级的原理
5)Unity 上 App 图标安装到设备上图标模糊,设置上的注意点


这是第 234 篇 UWA 技术知识分享的推送。今天我们继续为大家精选了若干和开发、优化相关的问题,建议阅读时间 10 分钟,认真读完必有收获。

UWA 问答社区:answer.uwa4d.com
UWA QQ 群 2:793972859(原群已满员)

Rendering

Q:发现 Light 的 Intensity 在不为 1 的情况下,光照的颜色在 URP 下滑 Built-in 管线下不一致。附件里有 2 个工程,使用 Unity 2019.4.11f1,分别是 URP 和 Built-in 管线的(都是线性空间)。(附件可戳原问答下载)

再现方法:
1. 打开 2 边工程的 Scene1,这个场景的方向光 Intensity 值设置为 1。观察 2 个工程里球的光照颜色,是一致的,通过 FrameDebugger 也可以确认这一点。

2. 打开 2 边工程的 Scene2,这个场景的方向光 Intensity 值设置为 0.65。观察 2 个工程里球的光照颜色,Built-in 管线的更暗,通过 FrameDebugger 也可以看到 Built-in 管线的工程光照颜色数值小一点。

URP 颜色:

Built-in 颜色:

URP FrameDebugger:

Built-in FrameDebugger:

A:用楼主 Demo 里面的 Light 的颜色做了一下计算,在 Light 设置项里面,Light Color 为(0,202,255),202.0/255 = 0.792。

SRP:
Green 通道:
Mathf.GammaToLinearSpace(0.792) * 0.65=0.5906189 * 0.65= 0.383902285

Blue 通道:
Mathf.GammaToLinearSpace(1) * 0.65=1 * 0.65=0.65

Built-in:
Green 通道:
Mathf.GammaToLinearSpace(0.792*0.65)=0.2280943

Blue 通道:
Mathf.GammaToLinearSpace(0.65)=0.3800563

应该是下面两段数值的计算区别:
GammaToLinearSpace(m_ColorFilter * m_Intensity);
GammaToLinearSpace(m_ColorFilter) * m_Intensity;

查询发现是由于 GraphicsSettings.lightsUseLinearIntensity 这个数值不一样导致的。在 SRP 里面这个数值是 True,在 Built-in 里面是 False。

感谢 Xuan@UWA 问答社区提供了回答

Rendering

Q:在同一帧中,我有用于渲染的 RenderTarget 开启了 MSAA,和用于热扭曲效果的扭曲 Buff,是一张没有开启 MSAA 的 RenderTarget,在后处理中这张扭曲 Buff 会用来偏移 UV,以实现扭曲效果。在 PC 上和 iOS 上一切正常,但是在 Android 真机上出现异常。在高通 GPU 上,这张扭曲 Buff 会导致屏幕出现网格状的现象,在 Mali GPU 上会出现各种细碎的小黑方块,应该是一个未知原因导致扭曲 Buff 上的数据被处理成我不期望的状态。

如果我把其他的 RenderTarget 的 MSAA 关闭,这种现象就会消失,也就说开启 MSAA 的 RenderTarget 会对没开启 MSAA 的 RenderTarget 造成影响,且仅仅是在 Android 真机上出现,不同的 GPU 表现还不一样。有遇到类似问题的吗?求解。

A:该问题已经解决了。我所遇到的问题的最终情况,不是开启 MSAA 的 RenderTarget 会对没开启 MSAA 的 RenderTarget 造成影响。在开启 MSAA 后,主相机的 RenderTexture(MSAA)绑定到 Shader 上,会有类似如下操作:

texture(_Main_Tex, UV + Offset)

不知道是 Unity 的 Bug 还是其他原因,导致在 Android 真机上,绑定到 Shader 上的 RenderTexture 一定不是经过有效 ResolveAA 的版本,所以在如上操作的时候就出现异常表现,类似细碎方块或者网格等等现象,如果 Offset 是 0,不会有异常表现,这些应该和 Mobile GPU 上的 TBR 有关系。

那么我需要在 Android 真机上传入一张经过有效 ResolveAA 的 RenderTexture 即可。经过验证,使用如下方式可以解决:

RenderTexture.Blit(Rt_msaa, Rt_no_msaa);

这样我就得到一张经过有效 ResolveAA 的 Rt。

感谢题主 yangkang@UWA 问答社区提供了回答

Rendering

Q:为了让身体各部件合并,所有部件都要开启 Readable/Writable 属性,合并也创建新的 Mesh 来合并,多个部件合并成一个 Mesh 有什么好处吗?

游戏类型是 MMOARPG,比如可以换头发、脸、衣服等,资源量很大,如果不合并,走挂点的方式与合并成一个 Mesh 会怎么样呢?

A:第一个问题的好处应该就是方便合批,坏处除了你说的几点,还有贴图的合并,这些点都会造成内存的额外开销。是否应用还是应该看具体的项目类型。

第二个问题其实就是内存换 Draw Call,看你们项目这两块哪一部分是瓶颈了。另外还需要注意材质,如果各部位材质差别很大也是无法合批的。

感谢范君@UWA问答社区提供了回答

NGUI

Q:Unity Shader 判断层级关系的唯一标准是否是深度测试?我看 NGUI 的 Shader 并没有 ZTest 配置并且关闭了深度写入,那应该是根据渲染的先后顺序来控制层级?也就是说 sortOrder sortLayerName renderQ camera depth 都只是 Unity 在控制不同组件进入渲染流水线的顺序吗?

A:深度测试在传统的渲染管线里,是发生在 Fragment Shader 之后(不考虑 Early Z 等优化技术),用来剔除那些被遮挡的像素。本身和 Draw Call 提交的顺序没有关系。

Unity 引擎中,有很多参数能决定渲染顺序,也就是 Draw Call 提交顺序。

首先最高优先级的是 Camera,引擎中的渲染是由 Camera 发起的,在 Built-in 管线中,主要依靠 Camera 的 Depth 来决定哪个 Camera 看到的物体先渲染。最常见的结构,比如 Depth=0 的相机画场景,另一个 Depth=1 的相机画 UI。但是,现在 URP 里的相机的 Camera Stack 也是类似的结构,用来控制 Camera 的渲染先后顺序。

然后是 RenderQueue,这个用来决定物体的渲染顺序。例如,内置的 Opaque 和 Transparent 等等,具体可以看 Unity 的文档,这个值就是越小的物体越先画。同一个 RenderQueue 里,不同类型的物体渲染顺序也是有一定规则。比如,引擎默认的排序规则下 Opaque 的物体一般是从前往后渲染,而 Transparent 的物体为了保证渲染的正确性,是需要从后往前渲染的。

SortingLayer 和 OrderInLayer 之类的主要用在 UGUI Canvas 上,能影响 UI 的渲染顺序。

另外,问题中有提到 UI 的 Shader 中没有配置 ZTest,关闭 ZWrite,这也是正常的,具体开什么关什么,是要根据渲染的物体的类型决定的。因为 UI 排序一般由 UI 系统内部的一些参数决定,是和深度无关的。常规的一些透明物体也是会关闭 ZWrite,只保留 ZTest 的。

感谢范君@UWA问答社区提供了回答

Editor

Q:Unity 上 App 图标安装到设备上图标模糊,设置上有什么特别注意的吗?

A1:请题主查下 Unity 的 Import Settings,这个是对打在包里的图标文件也有作用的,可以将这些图标的 Import Settings 中的压缩去掉。

感谢芭妮妮@UWA问答社区提供了回答

A2:补充一下,也需要注意本身图标的设置。我们因为是导出工程,所以使用的图标资源其实是跟安卓版本一致有多个分辨率版本。

感谢 ZeaLotSean@UWA 问答社区提供了回答

图片来源于网络


今天的分享就到这里。当然,生有涯而知无涯。在漫漫的开发周期中,您看到的这些问题也许都只是冰山一角,我们早已在 UWA 问答网站上准备了更多的技术话题等你一起来探索和分享。欢迎热爱进步的你加入,也许你的方法恰能解别人的燃眉之急;而他山之 “石”,也能攻你之 “玉”。

官网:www.uwa4d.com
官方技术博客:blog.uwa4d.com
官方问答社区:answer.uwa4d.com
UWA 学堂:edu.uwa4d.com
官方技术 QQ 群:793972859(原群已满员)

暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册