1)如何给带通明的Sprite生成深度图
2)SpriteAtlas中Include in Build的作用
3)multi_compile的Keyword是不是须要被动退出到SVC外面去
4)Shader里4个float和float4的差异
这是第282篇UWA技术常识分享的推送。明天咱们持续为大家精选了若干和开发、优化相干的问题,倡议浏览工夫10分钟,认真读完必有播种。
UWA 问答社区:answer.uwa4d.com
UWA QQ群2:793972859(原群已满员)
Rendering
Q:如下图:场景是用Sprite拼的,需要是应用ShadowMap给精灵增加实时暗影,做法是用一个摄像机对精灵进行拍摄以渲染Depth数据到Render Texture上生成ShadowMap,而后在地板Shader里对ShadowMap进行采样绘制出暗影。
教程链接:https://blog.csdn.net/l364244...
当初遇到的问题是:
拍摄精灵时Shader的RenderType只能是Opaque,不能应用Transparent和TransparentCutout,导致的问题是半透明边缘无奈失常投影,请帮忙看一下如何解决。
上图中,两头的胶囊失常暗影,左侧为投影成果(疏忽渲染不失常),右侧为原图,右下角是生成的ShadowMap。
A:能够参考一下这个教程:https://catlikecoding.com/uni...
感激羽飞@UWA问答社区提供了答复
AssetBundle
Q:SpriteAtlas中Include in Build的作用是什么?
A:专门做了一些测试,具体如下:
以下表白中Sprite对应的是Sprite类型的对象,Texture2D对应的是Texture2D的对象,这和Sprite对象是齐全不同的货色,sactx示意生成的图集纹理。
测试状况包含2个变量:
- SpriteAtlas对象是否被动打包AssetBundle
- SpriteAtlas对象上是否勾选Include in Build
第一种状况,SpriteAtlas打包AssetBundle:
那这里要思考的是SpriteAtlas援用的Sprite是否会独自打包,如果这些小Sprite不被动打包,是会被动进这个SpriteAtlas的AssetBundle外面的,如果其余的UI Prefab中,比方有个Image应用了一个小Sprite,那么这个小Sprite就冗余了。
这里勾不勾选Include in Build的区别在于:加载Image的时候,这个Image会不会主动显示,勾选了Include in Build,会主动显示图片,不勾选,则须要脚本增加回调来被动加载SpriteAtlas,并callback(spriteatlas)。
第二种状况,SpriteAtlas不退出AssetBundle打包:
- 不勾选Include in Build
假如小的Sprite打包AssetBundle,在这个AssetBundle外面不会有sactx,这个sactx的Texture2D的纹理变成“隐没”的状态,没有任何货色能够援用到这个sactx纹理,而且因为在工程外面有SpriteAtlas的存在,所以在小的Sprite的AssetBundle外面也不能让其自身对应的小的Texture2D纹理进AssetBundle包,所以图像就永远显示不进去了。勾选Include in Build
所有的小的Sprite所在的AssetBundle外面都会被动蕴含sactx的图,且会蕴含所有没有被动打包的小的Sprite。如Sprite1和Sprite2是SpriteAtlas外面的两个小的Sprite。Sprite1被动打包,Sprite2不被动打包,那么Sprite1的AssetBundle外面是会有Sprite1和Sprite2以及sactx纹理。
总结:
- 如果有Sprite退出了某个SpriteAtlas,那么任何真正应用到这个Sprite的资源都不会有对Sprite对应的小的Texture2D纹理的援用,而是对sactx图集纹理的援用。
- 如果SpriteAtlas不打包,必须勾选Include in Build,否则sactx纹理就“隐没”了,在勾选Include in Build的前提下,而且SpriteAtlas中的所有小的sprite必须打包到同一个AssetBundle外面,否则sactx会冗余。
- 如果SpriteAtlas打包了AssetBundle,sactx永远不会冗余了(这里的冗余是指打包AssetBundle造成的冗余)。SpriteAtlas外面的小的Sprite也最好打包AssetBundle,不然这些小的Sprite就会冗余。勾选或者不勾选Include in Build都不影响各种依赖关系,惟一的区别是是否会被动显示图片,勾选了就会被动显示图片,不勾选就须要脚本管制来显示图片。
感激Xuan@UWA问答社区提供了答复
AssetBundle
Q:multi_compile是不是须要被动退出到SVC外面去?
A:对于一个Shader资源来说,在我的项目进行打包构建时,multi_compile定义的关键字会把Shader中含有该关键字但理论未应用的变体也进行构建,而shader_feature定义的关键字则不会。
但当咱们我的项目中应用SVC收集变体时,并不是所有multi_compile定义的变体都须要被动退出到SVC中,只有咱们理论用到的须要收集。
进行试验如下:
试验构建场景,通过SVC收集变体、打成AssetBundle包。在场景中提前加载并Warmup,再实例化一个用到相干Shader中变体“FOG_EXP2”的预制体。(变体“FOG_EXP2”是multi_compile关键字定义的。)状况一:SVC中没有蕴含变体“FOG_EXP2”。此时会在实例化时触发Shader.CreateGPUProgram(相当于回到该SVC所援用的Shader中去加载了),不满足咱们收集变体并预热、从而升高游戏过程中Shader加载耗时的需要。
状况二:SVC中收集了变体“FOG_EXP2”。实例化时没有触发Shader.CreateGPUProgram,阐明该变体被失常Warmup了。
论断是,对于包体构建是没有区别的,SVC打包时会依赖对应的Shader,multi_compile定义的关键字天然都会参加构建;对于变体预热,只有是须要用到的变体,必须收集到SVC中并Warmup后,才不会在实例化渲染时触发Shader.CreateGPUProgram。
感激Faust@UWA问答社区提供了答复
Rendering
Q:明天看URP代码,发现URP里会把一些原本是float的数据平铺到4个float中,再用一些Mask之类的操作取出数据。
用float4与用4个float的区别是什么?看起来是有一些性能上的差异之类,URP里才会这样用。
A1:Float4能够利用SIMD指令减速。
感激时雨苍炎@UWA问答社区提供了答复
A2:ES3.0的vertex shader中的attribute,float会依照float4进行计算。
感激Tsai@UWA问答社区提供了答复
A3:应该是CBuffer的内存对齐float4更好组织数据,不容易呈现Bug。
HLSL CBuffer Packing规定能够参考:
https://docs.microsoft.com/en...
感激羽飞@UWA问答社区提供了答复
封面图来源于网络
明天的分享就到这里。当然,生有涯而知无涯。在漫漫的开发周期中,您看到的这些问题兴许都只是冰山一角,咱们早已在UWA问答网站上筹备了更多的技术话题等你一起来摸索和分享。欢送酷爱提高的你退出,兴许你的办法恰能解他人的当务之急;而他山之“石”,也能攻你之“玉”。
官网:www.uwa4d.com
官网技术博客:blog.uwa4d.com
官网问答社区:answer.uwa4d.com
UWA学堂:edu.uwa4d.com
官网技术QQ群:793972859(原群已满员)