7

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

 3 years ago
source link: https://blog.uwa4d.com/archives/TechSharing_235.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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。

1.png

第一个相机OnRenderImage里面颜色反一下,第二个相机的OnRenderImage里面变成灰度图。从下图可以看到这两个效果是相互独立的。

2.png

最后用CombineCamera画一个Canvas,里面有2个RawImage,RawImage里面的Texture分别使用那两个RT就可以了,如下图:

3.png

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


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

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

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


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

5.png

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

6.png

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

7.png

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)

正常渲染:

8.png

CommandBuffer.DrawRenderer:

9.png

A1:光照处理阶段,CommandBuffer的内容还未产生,所以也就不会有球谐和屏幕空间阴影的内容了。

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

A2:测试后发现,可以使用EnableKeyword来强行开启Keyword。但是会遇到环境光渲染不出来的问题。

正常的渲染如下:

10.png

环境光渲染不出来,如下:

11.png
12.png

虽然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(原群已满员)


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK