内容简介:这是第165篇UWA技术知识分享的推送。今天我们继续为大家精选了若干和开发、优化相关的问题,建议阅读时间10分钟,认真读完必有收获。UWA 问答社区:answer.uwa4d.comUWA QQ群2:793972859(原群已满员)
这是第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 崩溃分析一则
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
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; } }
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中间有一段说了各种效果对性能影响大的选项。
Lightmap
Q:目前有个需求,就是需要把烘焙信息与场景分离开。也就是说我的预制体需要再任意场景都显示阴影。
在网上找了资料发现,只需把预制体的光照数据lightmapIndex和lightmapScaleOffset记录下来,并且让光照贴图加载设置到lightmapsetting就行了。
但是我在测试的过程发现:这边设置成功了;
这边也设置了,但是就是不生效。整个预制体还是黑的。
如果我把这个设置为任意一个默认的Data。然后还是按照之前的操作就生效了,这是为什么?
A:你需要在打开场景或者实例化Prefab后,再手动赋值一遍才会生效。
今天的分享就到这里。当然,生有涯而知无涯。在漫漫的开发周期中,您看到的这些问题也许都只是冰山一角,我们早已在UWA问答网站上准备了更多的技术话题等你一起来探索和分享。欢迎热爱进步的你加入,也许你的方法恰能解别人的燃眉之急;而他山之“石”,也能攻你之“玉”。
官网:www.uwa4d.com
官方技术博客:blog.uwa4d.com
官方问答社区:answer.uwa4d.com
UWA学堂:edu.uwa4d.com
官方技术QQ群:793972859(原群已满员)
封面图来源于网络
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 【Redis源码分析】一个对SDSHDR5是否使用的疑问
- Android 编译打包的那些疑问
- Android 编译打包的那些疑问
- 打造企业级pipeline服务的18个疑问
- 八问WebSocket协议:为你快速解答WebSocket热门疑问
- Spring中Bean的作用域与StepScope关系、疑问
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Essential C++中文版
李普曼 (Stanley B.Lippman) / 侯捷 / 电子工业出版社 / 2013-8-1 / CNY 65.00
本书以四个面向来表现C++的本质:procedural(面向过程的)、generic(泛型的)、object-based(基于对象的)、objectoriented(面向对象的)。全书围绕一系列逐渐繁复的程序问题,以及用以解决这些问题的语言特性来组织。循此方式,你将不只学到C++的功能和结构,也可学到它们的设计目的和基本原理。 本书适合那些已经开始从事软件设计,又抽不出太多时间学习新技术的程......一起来看看 《Essential C++中文版》 这本书的介绍吧!