其他分享
首页 > 其他分享> > AlphaTest烘焙的阴影不正确

AlphaTest烘焙的阴影不正确

作者:互联网

1)AlphaTest烘焙的阴影不正确
​2)RawImage和Image的选择
3)Unity版本升级后Shaowmap异常
4)同一个Shader多次回调OnProcessShader


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

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

Rendering

Q:近期美术反馈场景中的树烘焙的时候阴影不正常,简单看了下,树用的是AlphaTest做的渲染,测试了一下确实有问题。

 

我记得Unity 4.x版本是没有问题的,目前的引擎版本是Unity 2018.4.35,去Unity官网查了下,说是Unity的Bug?有的人建议在Shader名字里添加Transparent,还有人建议“RenderType”改成“TransparentCutout”,两种我都试过了,还是不好用。

A:自答:美术出贴图的时候使用了一张不带Alpha通道的主贴图和一张控制Alpha的贴图,Unity在烘焙的时候是以主贴图MainTex的Alpha数值为依据进行处理的,所以需要在烘焙的时候主贴图带有a通道,这样处理以后阴影就正常了,烘焙完以后可以把主贴图压缩回不带a的贴图格式。

处理前:

 

处理后:

 

感谢题主Lim@UWA问答社区提供了回答


UGUI

Q:UI RawImage组件使用图片的Texture Type设置是Sprite,导致AssetBundle打包时造成冗余。产生原因已知:一张纹理被同时当成Sprite和Texture使用,Sprite那份就会把对应的Texture打包进来造成冗余。

相关问答:https://answer.uwa4d.com/question/5d939f0ea27d4e20a003aec9

解决方案:RawImage使用的都是大图,Image组件不会用到,现在有两种方案:
1. 继续使用RawImage,把散图的Texture Type都设置为Default;
2. 去掉游戏内的RawImage,都改为Image,Texture Type都设置为Sprite。

第一个方案,因为按以往项目经验,都是这样做的。而且,觉得散图不应该设置成Sprite类型, 怕有什么问题。
第二个方案,统一使用Image,以后使用就不用区分图片来自图集还是散图了,使用会更方便点。

请问大家还有什么建议吗?

A:一般RawImage是用在UI上显示RenderTexture,其它的一般是用Image。就算是散图,也用Image,即图片设置成Sprite2D类型,方便管理。

该回答由UWA提供


RenderTexture

Q:不同版本打出来的安卓包,在相同手机上真机连接到Unity查看Shadowmap内存。

具体信息:
2018.2.16f1:Shadowmap 8M 2048x2048 Format:D16
2018.4.32f1:Shadowmap 24M 2048x2048 Format:D16
2018.4.36f1:Shadowmap 24M 2048x2048 Format:D16

 

 

 

这是Unity的Bug还是什么情况导致的?

A1:应该是Unity的Bug,一个类似的问题:https://issuetracker.unity3d.com/issues/shadowmap-memory-size-is-reported-inconsistently-by-the-profiler-in-different-unity-versions

报告中提到2017.4.36f1, 2018.4.1f1没有复现。附一个同样的问答:https://answer.uwa4d.com/question/5d525dacc494b506d26739ae

 

感谢羽飞@UWA问答社区提供了回答

A2:打包到真机上测试并且连接Profiler,查看Shadowmap大小。使用RenderDoc截取画面,查看Shadowmap大小。比较这两个Shadowmap的大小是否相同。

测试Unity版本:2020.3.16f1和2019.4.29f1
测试真机:小米8,OPPO A72和荣耀 Play 4T
测试步骤:新建场景,添加胶囊体和平面,设置阴影
测试结果:

 

测试结果表明2019和2020最新的LTS版本应该已经修复了Shadowmap在Profiler中的大小显示错误的问题。

感谢宗卉轩@UWA问答社区提供了回答


Shader

Q:Unity 2018.4.36f1在打安卓包时,发现OnProcessShader回调方法,同一个Shader会被回调多次。

A:简单地理解,OnProcessShader并不是一个“Shader资源”调用一次,而是一个 “shader snippet”调用一次。官网上的说法:Implement this interface to receive a callback before a shader snippet is compiled。

从这个函数的参数也可以看得出来,函数的一次调用,对应的是一个Shader的一个ShaderSnippetData。

OnProcessShader( Shader shader, ShaderSnippetData snippet, IList<ShaderCompilerData> data ) 

 

如果要理解清楚,这个问题本质就是概念的定义与理解问题了。而对于 “snippet” 的定义,Unity官网的定义其实也有点矛盾,官方文档的说法与OnProcessShader函数用的概念是不一致的。

比如官方文档表示:An HLSL snippet must contain at least a vertex program and a fragment program. 也就是说:一个snippet至少包含一个Vertex Program和一个Fragment Program。
https://docs.unity3d.com/Manual/SL-PragmaDirectives.html

而OnProcessShader函数的介绍文档中表示:Shader snippet:The HLSL input code with dependencies for a single shader stage. 也就是说:一个snippet对应的就是一stage(Vertex、Fragment等等)。
https://blog.unity.com/technology/stripping-scriptable-shader-variants

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

20210816
更多精彩问题等你回答~

1.Vulkan API的性能及兼容性
2.Unity TMP字体方案如何选择
3.如何实现AAB包的增量更新

封面图来源于网络


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

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

标签:Shadowmap,AlphaTest,Shader,阴影,snippet,Unity,烘焙,UWA,com
来源: https://www.cnblogs.com/uwatech/p/15156153.html