4

如何给带透明的Sprite生成深度图

 2 years ago
source link: https://blog.uwa4d.com/archives/TechSharing_282.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

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/l364244206/article/details/97042617

现在遇到的问题是:
拍摄精灵时Shader的RenderType只能是Opaque,不能使用Transparent和TransparentCutout,导致的问题是半透明边缘无法正常投影,请帮忙看一下如何处理。

1.png

上图中,中间的胶囊正常阴影,左侧为投影效果(忽略渲染不正常),右侧为原图,右下角是生成的ShadowMap。

A:可以参考一下这个教程:https://catlikecoding.com/unity/tutorials/rendering/part-12/

2.png

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


AssetBundle

Q:SpriteAtlas中Include in Build的作用是什么?

A:专门做了一些测试,具体如下:

以下表达中Sprite对应的是Sprite类型的对象,Texture2D对应的是Texture2D的对象,这和Sprite对象是完全不同的东西,sactx表示生成的图集纹理。

测试情况包括2个变量:

  1. SpriteAtlas对象是否主动打包AssetBundle
  2. 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打包:

  1. 不勾选Include in Build
    假设小的Sprite打包AssetBundle,在这个AssetBundle里面不会有sactx,这个sactx的Texture2D的纹理变成“消失”的状态,没有任何东西可以引用到这个sactx纹理,而且由于在工程里面有SpriteAtlas的存在,所以在小的Sprite的AssetBundle里面也不能让其本身对应的小的Texture2D纹理进AssetBundle包,所以图像就永远显示不出来了。
  2. 勾选Include in Build
    所有的小的Sprite所在的AssetBundle里面都会被动包含sactx的图,且会包含所有没有主动打包的小的Sprite。

    如Sprite1和Sprite2是SpriteAtlas里面的两个小的Sprite。Sprite1主动打包,Sprite2不主动打包,那么Sprite1的AssetBundle里面是会有Sprite1和Sprite2以及sactx纹理。
  1. 如果有Sprite加入了某个SpriteAtlas,那么任何真正使用到这个Sprite的资源都不会有对Sprite对应的小的Texture2D纹理的引用,而是对sactx图集纹理的引用。

  2. 如果SpriteAtlas不打包,必须勾选Include in Build,否则sactx纹理就“消失”了,在勾选Include in Build的前提下,而且SpriteAtlas中的所有小的sprite必须打包到同一个AssetBundle里面,否则sactx会冗余。

  3. 如果SpriteAtlas打包了AssetBundle,sactx永远不会冗余了(这里的冗余是指打包AssetBundle造成的冗余)。SpriteAtlas里面的小的Sprite也最好打包AssetBundle,不然这些小的Sprite就会冗余。勾选或者不勾选Include in Build都不影响各种依赖关系,唯一的区别是是否会主动显示图片,勾选了就会主动显示图片,不勾选就需要脚本控制来显示图片。

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


AssetBundle

Q:multi_compile是不是需要主动加入到SVC里面去?

A:对于一个Shader资源来说,在项目进行打包构建时,multi_compile定义的关键字会把Shader中含有该关键字但实际未使用的变体也进行构建,而shader_feature定义的关键字则不会。

但当我们项目中使用SVC收集变体时,并不是所有multi_compile定义的变体都需要主动加入到SVC中,只有我们实际用到的需要收集。

3.png

进行实验如下:
实验构建场景,通过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问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/61dbfafbd8413e18eb7bdfb4


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-us/windows/win32/direct3dhlsl/dx-graphics-hlsl-packing-rules

4.png

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

封面图来源于网络


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

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK