多个相机分别实现各自屏幕后处理的问题

多个相机分别实现各自屏幕后处理的问题

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


Mono

Q:我把一些大计算量的东西放到了子线程中,现在想看下有没有GC Alloc,但是没找到像Profiler.BeginSample/Profiler.EndSample这样的方法,看不到子线程中的GC Alloc,只能看到时间开销。请问要怎么才能看到子线程中的GC Alloc呢?

A:目前新版本的GOT2.3版本已经支持了。
《多线程统计 | GOT Online新功能上线》

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


UGUI

Q:Mask组件的世界坐标传给了Shader,然后要把模型空间的Vertex转到世界空间进行对比。

把Mask的四个角的坐标通过GetWorldCorners这个接口获取到传给Shader,

然后将特效的Vertex转换到世界空间中作比较。但是效果看起来这个转换的值好像不太对,我的渲染模式是Overlay。

A:我把Render Mode改成Camera就行了,应该是在Overlay下GetWorldCorners获取到的值不正确。

感谢题主方星@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/5ff9606310a17c6c2b09d94e


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


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(需要梯子)

【三思Unity】深入浅出资源管理之:Asset Import Pipeline v2(上)

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

A2:就是在编辑器加速导入的功能,本身也不收费。加速幅度还比较大,对多个小文件导入提速比较明显,但是导入ASTC图片依然很慢,可能因为主要耗时是在图片转换这边。总的来说,切换到V2没遇到什么问题。

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

封面图来自网络


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

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