Texture Streaming Mipmap使用疑问

Texture Streaming Mipmap使用疑问

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

UWA 问答社区:answer.uwa4d.com
UWA QQ群2:793972859(原群已满员)


本期目录:

  • Texture Streaming Mipmap使用疑问
  • UE4材质里如何获取到平行光方向
  • 带Submesh的SkinnedMeshRenderer用BakeMesh的问题
  • PPS v2后处理优化
  • 动态加载阴影的烘焙信息不生效

Texture Streaming

Q:项目升级到了2018.4,预计今年上线。

1、看到Unity新增了StreamingMipmap流,想问下loadedMipmapLevel是否是当前贴图正在使用的Mipmap level,官方解释是Which mipmap level is currently loaded by the streaming system.试了一下,对着一个物体走近走远,这个值都是固定,如果不是,请问怎样得到当前贴图的Mipmap level呢?

2、2018.4请问是否可以使用Job System,官方说这是试验,可能引起崩溃,不知道有没有大佬线上项目开启了这个或者StreamingMipmap?

A:这个值在真机上是准确的,只是在引擎端会出现一些加载Bug。我们也在测试过程中发现了这个问题,当时重新建立项目、重新导入后才在真机上显示正确的。

我们在UWA DAY 2019上详细说明了我们在测试Texture Streaming所遇到的一些问题和大量的Streaming逻辑解释,后续题主有兴趣可以观看:Unity引擎加载模块和内存管理的量化分析及优化方法,可以节省你大量不必要的测试和摸索时间,以及消除你崩溃到想砸键盘、扔电脑的心情。(相信我,当时我们研究这个功能时,心情就是这样的!)

关于你第二问题,这个很难回答,目前还没有在已经上线的项目中看到使用。这里有一篇文章,建议题主和正在使用TextureStremingJob的团队查看:TextureStreamingJob 崩溃分析一则

该回答由UWA提供,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/5d0b7d73f465ea0d54c5ef9b


Rendering

Q:Unity里可以通过_WorldSpaceLightPos0来得到平行光方向,这其实是Unity觉得这个uniform很常用,自动帮我们传入了。

我在Unreal的材质节点里找了很久,没有找到类似Light Vector表示平行光方向的节点。还是说Unreal中只能通过Blueprint自己从外部传入了。我知道Blueprint + Material Parameter Collections可以满足我的要求,就像 SetGlobalVector 一样。

所以想问问能不能从材质节点直接获取到平行光方向,省得从外部自己传入了。

A:方法不是没有,如图所示,建立一个custom节点,然后在参数里输入如图代码即可,做成Material Function就可以到处复用。


但是个人并不推荐,很显然这是一个很hack的方法。这个方法依赖底层Shader实现,不保证每个版本都能用(4.22测试)。

究其原因,是因为Unreal假定材质编辑器提供的主要节点,都是可以通用于所有光照流程的(forward shading/defer shading),而获取Light Direction这种设定显然不符合支持超多光源的Deferred Shading管线,所以官方本身是不会提供节点的。

因此顺带一提,这个做法只有在Forward Shading可以使用。不像Unity,自己编写的Shader,Epic官方不怎么管兼容性,这个版本可以用,下个版本引擎Shader改了,能不能用就不保证了(不过这段代码应该可以适配相当数量的版本)。

所以题主说的方案,才是官方鼓励的。
代码:

#ifdef EyeAdaptationStruct
#if MATERIALBLENDING_ANY_TRANSLUCENT
return TranslucentBasePass.Shared.Forward.DirectionalLightDirection;
#else
return OpaqueBasePass.Shared.Forward.DirectionalLightDirection;
#endif
#else
return 0;
#endif

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


Shader

Q:带子网格的SkinnedMeshRenderer在使用BakeMesh制作残影的时候,发现只会Bake出子网格中的第一个网格。这个角色身上是有四个子网格的,大家有遇到过类似问题的吗?(Unity版本:2017.4.18f1)

A:原来的实现方式是这种,直接用Graphics画出来一个Mesh,这种在结果看来是不支持子网格。

Graphics.DrawMesh(ghostMesh.mesh, ghostMesh.position, ghostMesh.rotation, ghostMesh.material, 0, Camera.main);

后修改成了这种,实例化一个GameObject,然后挂上对应子网格个数的材质,就可以正常显示了。

public void InstanceGhost() {
    if (mesh.subMeshCount > 0) {
        ghostGo = new GameObject("ghostGo");
        SkinnedMeshRenderer smr = ghostGo.AddComponent<SkinnedMeshRenderer>();
        smr.sharedMesh = mesh;
        Material[] mats = new Material[smr.sharedMesh.subMeshCount];

        for (int i = 0; i < mesh.subMeshCount; i++) {
            mats[i] = material;
        }

        smr.materials = mats;

        ghostGo.transform.parent = GetGhostRoot();
        
        ghostGo.transform.position = position;
        ghostGo.transform.rotation = rotation;
    }
}

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


Rendering

Q:请问大佬们,您们现在的后处理优化,都是从哪几点入手的,能否分享一下?

A1:Unity PostProcess在代码上的优化空间有限,可以根据项目的使用在代码上去掉一些细节效果。我们之前的项目在代码上的优化不多,主要还是解决Bug。

在使用上可以对后期效果进行规划,在后期效果中最重要的是Bloom和ColoeGrading,其中Bloom的性能开销较大,因此可以在高配画质下开启,中配画质下只使用ColorGraiding,让画面有一致性。在低配下可以关闭后期处理。然后其他的也有很多对画面有提升的效果,比如景深、SSAO、抗锯齿、Chromatic Aberration、Vignette等可以根据情况来设计开启和关闭,默认情况下关闭。
感谢文雅@UWA问答社区提供了回答

A2:如果你用的是PostProcess Stack V2,可以看下这里:
https://www.bilibili.com/video/av53641372/?share_medium=web

中间有一段说了各种效果对性能影响大的选项。

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


Lightmap

Q:目前有个需求,就是需要把烘焙信息与场景分离开。也就是说我的预制体需要再任意场景都显示阴影。

在网上找了资料发现,只需把预制体的光照数据lightmapIndex和lightmapScaleOffset记录下来,并且让光照贴图加载设置到lightmapsetting就行了。

但是我在测试的过程发现:这边设置成功了;

这边也设置了,但是就是不生效。整个预制体还是黑的。

如果我把这个设置为任意一个默认的Data。然后还是按照之前的操作就生效了,这是为什么?

A:你需要在打开场景或者实例化Prefab后,再手动赋值一遍才会生效。

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


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

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

封面图来源于网络