1)多个相机分别实现各自屏幕后处理的问题
2)怎么查看子线程中的GC Alloc
3)Mesh组件的世界坐标
4)绘制的Mesh丢失了Unity自带的Keywords
5)AssetDatabase V2和V1的核心区别
这是第235篇UWA技术知识分享的推送。今天我们继续为大家精选了若干和开发、优化相关的问题,建议阅读时间10分钟,认真读完必有收获。
UWA 问答社区:answer.uwa4d.com
UWA QQ群2:793972859(原群已满员)
Rendering
Q:游戏中有多个相机,每个相机有自己的后处理效果。但是发现Depth越大的相机OnRenderImage传过来的图像越小于这个Depth所有相机的叠加图像,这样就没法实现各自的后处理效果,有什么方法可以解决吗?
A:经过测试,给Camera赋值RenderTarget,那这个相机上的OnRenderImage就只会对这个RT起作用。使用这种方式,对不同的Camera加不同的OnRenderImage。最后需要一个额外的相机将这些RT合在一起,在这个额外的相机里面,可以渲染一个Canvas,里面用多个RawImage来将之前的RT叠在一起。
下图中,球和天空盒是场景相机渲染的,相机渲染到RT1,文本是UI相机渲染的,相机渲染到RT2。
第一个相机OnRenderImage里面颜色反一下,第二个相机的OnRenderImage里面变成灰度图。从下图可以看到这两个效果是相互独立的。
最后用CombineCamera画一个Canvas,里面有2个RawImage,RawImage里面的Texture分别使用那两个RT就可以了,如下图:
感谢Xuan@UWA问答社区提供了回答
Mono
Q:我把一些大计算量的东西放到了子线程中,现在想看下有没有GC Alloc,但是没找到像Profiler.BeginSample/Profiler.EndSample这样的方法,看不到子线程中的GC Alloc,只能看到时间开销。请问要怎么才能看到子线程中的GC Alloc呢?
A:目前新版本的GOT2.3版本已经支持了。
《多线程统计 | GOT Online新功能上线》
感谢Xuan@UWA问答社区提供了回答
UGUI
Q:Mask组件的世界坐标传给了Shader,然后要把模型空间的Vertex转到世界空间进行对比。
把Mask的四个角的坐标通过GetWorldCorners这个接口获取到传给Shader,
然后将特效的Vertex转换到世界空间中作比较。但是效果看起来这个转换的值好像不太对,我的渲染模式是Overlay。
A:我把Render Mode改成Camera就行了,应该是在Overlay下GetWorldCorners获取到的值不正确。
感谢题主方星@UWA问答社区提供了回答
Rendering
Q:使用CommandBuffer.DrawRenderer绘制的Mesh会丢失Unity自带的Keywords,导致ShadeSH9计算的结果不对。(版本:Unity 2019.2.0f1)
正常渲染:
CommandBuffer.DrawRenderer:
A1:光照处理阶段,CommandBuffer的内容还未产生,所以也就不会有球谐和屏幕空间阴影的内容了。
感谢李星@UWA问答社区提供了回答
A2:测试后发现,可以使用EnableKeyword来强行开启Keyword。但是会遇到环境光渲染不出来的问题。
正常的渲染如下:
环境光渲染不出来,如下:
虽然Keywords是完整的,但是环境光还是没渲染出来,原因是SH的系数出问题了,具体解决方案可以参考:
https://github.com/keijiro/LightProbeUtility使用如下的代码可以让这个Cube和普通的渲染方式产生相同的渲染结果,但是需要使用CommandBuffer.DrawMesh的方式。
public class TestCommand : MonoBehaviour { public MeshRenderer rend; public Mesh mesh; CommandBuffer cb; MaterialPropertyBlock block; Material mat; void Start() { block = new MaterialPropertyBlock(); LightProbeUtility.SetSHCoefficients(rend.transform.position, block);//来自git中的脚本 cb = new CommandBuffer(); cb.name = "DrawCube"; mat = new Material(rend.sharedMaterial); mat.EnableKeyword("SHADOWS_SCREEN"); mat.EnableKeyword("LIGHTPROBE_SH"); cb.DrawMesh(mesh, rend.localToWorldMatrix, mat, 0, 0, block); Camera.main.AddCommandBuffer(CameraEvent.AfterSkybox, cb); } }
感谢Xuan@UWA问答社区提供了回答
Editor
Q:AssetDatabaseV2和V1的核心区别是什么?切换到V2对项目有哪些好处?
A1:做个搬运工:《Asset Pipeline Version 2(Asset Database v2)内部细节》
《The new Asset Import Pipeline: Solid foundation for speeding up asset imports》
AssetDatabase.Refresh() refresher - Unite Copenhagen(需要梯子)
Speed up your asset imports for big projects - Unite Copenhagen(需要梯子)
感谢黄程@UWA问答社区提供了回答
A2:就是在编辑器加速导入的功能,本身也不收费。加速幅度还比较大,对多个小文件导入提速比较明显,但是导入ASTC图片依然很慢,可能因为主要耗时是在图片转换这边。总的来说,切换到V2没遇到什么问题。
感谢邹彬@UWA问答社区提供了回答
封面图来自网络
今天的分享就到这里。当然,生有涯而知无涯。在漫漫的开发周期中,您看到的这些问题也许都只是冰山一角,我们早已在UWA问答网站上准备了更多的技术话题等你一起来探索和分享。欢迎热爱进步的你加入,也许你的方法恰能解别人的燃眉之急;而他山之“石”,也能攻你之“玉”。
官网:www.uwa4d.com
官方技术博客:blog.uwa4d.com
官方问答社区:answer.uwa4d.com
UWA学堂:edu.uwa4d.com
官方技术QQ群:793972859(原群已满员)