Unity如何直接获取深度缓冲

Unity如何直接获取深度缓冲

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问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/60786cff6bb31032f979134b


Texture

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

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

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

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

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

感谢Prin@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/6074fe116bb31032f97912ec


Editor

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

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

出问题的是这样的:

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

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

感谢题主马三小伙儿@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/6077b3b66bb31032f9791324


UGUI

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

脚本如下:

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

感谢Xuan@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/6076c6ec6bb31032f979131f


Texture

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

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

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

感谢梅辰@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/5ecf88604d93790618e0ee23

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


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

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