问答 Unity 如何直接获取深度缓冲

侑虎科技 · 2021年06月09日 · 1575 次阅读

1)Unity 如何直接获取深度缓冲
​2)Unity Editor 下 SpriteAtlas 加载的问题
3)无法将 GameObject 从 Project 窗口拖拽到 SceneView 窗口
4)UGUI 的事件响应问题
5)iOS 设置 Texture2D 的 mipMapBias 无效


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

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

Rendering

Q:查阅了一些资料,发现 Unity 获取深度纹理好像都要对每个物体再渲染一次,有什么办法能直接获取到深度缓冲省去这一轮渲染吗?或者直接复制深度缓冲。

A:可以,主要步骤如下:
1.将相机的颜色和深度 Buffer 通过 Camera.SetTargetBuffers 重新指向新的 RT 上(ColorBufferRT、DepthBufferRT);

2.通过 CommandBuffer 加一个 AfterForwardOpaque 的事件,将 ColorBufferRT、DepthBufferRT Blit 渲染到两张新的 RT 上(后面渲染可以直接使用);

3.通过 CommandBuffer 加一个 AfterEverything 的事件,BlitColorBufferRT 到 CameraTarget 上(保证屏幕正确)。

具体细节可参考:https://blog.csdn.net/linjf520/article/details/104964803

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


Texture

Q:使用的版本是 Unity 2018.3.6f1 下,Unity Editor 模式下编辑 Prefab,图片会加载到内存中。导致一开始运行游戏的时候会触发相关图集 SpriteAtlasManager.atlasRequested 的提前调用,导致图集加载错误。

上图是过早的图集加载,失败时检测到内存中加载的图片。有没有办法在运行游戏的时候清除编辑预制体时内存中的图片图集?或者类似的办法?

补充:在不运行游戏的情况下调用内存查看的接口,发现内存中仍然有很多图片被加载:

A:这个问题本质是,当引用到 Atlas 的 Sprite 加载时,如果内存中没有 Atlas,就会触发加载图集的 “请求”(atlasRequested)。Editor 下编辑 Prefab,会生成这个请求,在游戏运行的第一帧,这个请求函数会被调用,而这个请求是由 Native 层发出的([RequiredByNativeCode]),所以我们没有办法控制,跟卸载内存中的资源是没有关系的。


这个请求也只会在运行时的第一帧进行调用,所以,不要在第一帧注册 atlasRequested 事件,在第一帧之后,或者在需要加载相应 Prefab 时注册该函数,就可以避免在启动游戏时调用该函数。

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


Editor

Q:最近发现 Unity 在打开公司的项目中,无法实现 Project 窗口拖拽 GameObject 到 SceneView 窗口,但是新建一个干净的工程是可以拖拽过去的。猜测是不是因为某个工具或者插件引起的,但是插件和工具太多,逐个排查会比较浪费时间,想问问大佬们有没有遇见过类似的问题?使用的 Unity 版本是 2019.4。

正常的项目从 Project 窗口拖拽 GameObject 到 SceneView 窗口,图标是这样的:

出问题的是这样的:

目前已经注释掉外部工具或者插件的 SceneView.duringSceneGui 、DragAndDrop 相关代码,问题依然存在。

A:出现问题的原因是:我们重写了 GameObject 的 Editor,没有实现 OnSceneDrag 函数,不实现这个函数就会导致无法将物体从 ProjectWindow 拖拽到 SceneView。

感谢题主马三小伙儿@UWA问答社区提供了回答


UGUI

Q:UGUI RayCast 的无绘制点击在 PC 上没有问题,但是到安卓手机上就穿透了,没有点击响应的问题。之前用透明通道为 0 的 Image 就都没问题。

脚本如下:

A:可以把 Image 的半透明度设置为 0,勾选 Canvas Renderer 上的 Cull Transparent Mesh,这样就可以不进行绘制也能响应点击事件的。(另外,测试了了题主的代码,在小米 9 上没有出现问题。)

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


Texture

Q:使用 TextureMipmapStreaming,在 iOS 真机上,设置 Texture2D 的 mipMapBias 无效,这个 Texture 是从 Material 中拿到的 mainTexture,在 Editor 下反而生效(图片会变模糊和清晰)。

版本是 Unity2018.4.13,有人遇到同样的问题吗?相关设置见下图:

A:这个要开启 Texture.streamingTextureDiscardUnusedMips = true,不然在内存预算足够的情况下,是不会丢弃高精度的贴图的。

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

封面图来源:Multipass Translucency
https://lab.uwa4d.com/lab/5b560e9ed7f10a201fd7f44f


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

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

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