打开

【厚积薄发】多个相机分别实现各自屏幕后处理的问题

subtitle
uwa4d 2021-01-18 18:33
打开网易新闻 查看更多图片

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

UWA 问答社区:answer.uwa4d.com

UWA QQ群2:793972859(原群已满员)

本期目录:

  • 多个相机分别实现各自屏幕后处理的问题
  • 怎么查看子线程中的GC Alloc
  • Mesh组件的世界坐标
  • 绘制的Mesh丢失了Unity自带的Keywords

  • AssetDatabase V2和V1的核心区别

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版本已经支持了。

感谢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:做个搬运工:

《资产导入新管线:加速资源导入的坚实基础》

https://blog.uwa4d.com/archives/USparkle_Addressable5.html

《Asset Pipeline Version 2(Asset Database v2)内部细节》

https://blog.csdn.net/u010019717/article/details/102540204

《The new Asset Import Pipeline: Solid foundation for speeding up asset imports》

http://dwz.date/dWpq

AssetDatabase.Refresh() refresher - Unite Copenhagen(需要梯子)

https://www.youtube.com/watch?v=S2P9n5U9xVw

Speed up your asset imports for big projects - Unite Copenhagen(需要梯子)

https://www.youtube.com/watch?v=VF-Qe-0zXlc&feature=emb_title&ab_channel=Unity

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

https://www.cnblogs.com/hearthstone/p/13358025.html

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

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

https://answer.uwa4d.com/question/5f8eaaf79424416784ef286f

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

官网:www.uwa4d.com

官方技术博客:blog.uwa4d.com

官方问答社区:answer.uwa4d.com

UWA学堂:edu.uwa4d.com

特别声明:本文为网易自媒体平台“网易号”作者上传并发布,仅代表该作者观点。网易仅提供信息发布平台。
帮TA点赞
大家都在看打开应用 查看全部
网易热搜每30分钟更新
打开应用 查看全部
打开