6

使用后处理Alpha通道丢失的问题

 2 years ago
source link: https://blog.uwa4d.com/archives/TechSharing_275.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)使用后处理Alpha通道丢失的问题
​2)ParticleSystem的Trail Material为空时运行会自动创建一个默认材质
3)C#使用中文进行枚举时, 是否会产生性能相关的问题
4)C#脚本存在未引用的命名空间,打包报错提示命名空间不存在UnityEditor


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

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

Rendering

Q:我们项目有一个模型相机投射到RT上,然后放在RawImage上,现在这个相机需要开启后处理Post Processing。只针对角色添加的Tone Mapping和Bloom效果,问题是开启后,RawImage背景变黑了,把UI背景图遮住了,应该是需要让持有RT的RawImage做混合,网上看了一堆混合的公式,都无法完成混合,背景混合对了,模型混合就不对,整个模型被混合的发黑。请问有相关的解决方案吗?

应该是开启Post Processing后模型相机的SolidColor的Alpha值就无效了。把相机的背景色也加到了RenderTexture里。

A1:解决方法:UberPost: //return half4(color, 1.0); return half4(color, SAMPLE_TEXTURE2D_X(_SourceTex, sampler_LinearClamp, uv).a);

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

A2:我在非URP项目试了一下,也存在上述的SolidColor的透明通道会无效的问题。从下图FrameDebugger中,可以看到:Copystd.shader的输入是一张Alpha不全为1的图(除了模型处的a为1,其它背景处a都为0),但是输出图的Alpha全部为1,通过查询源码,确定不是Shader的问题,而是输出的targetRT(_TargetPool0)的格式(B10G11R11)决定了它不包含Alpha信息,所以输出图永远不会有透明通道的信息。

1.png

我的解决方法很简单,就是用自己写的Shader。效果如下,其中红棕色是UIImage背景,胶囊体是目标模型。总结一点就是,一个后处理Shader只要在确保原有功能的基础上仍能保持原图的Alpha信息不变,理论上就是可以的。

2.png

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


Rendering

Q:Particle的Trail Material为空时运行会自动创建一个默认材质,请问有什么方法解决?

A1:可以排查下有没有类似操作,有Material的get操作就会变成实例化的材质球。

3.png

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

A2:在2020.3.16版本没有发现这个问题,不知道用的是什么Unity版本?在2020.3.16版本不勾选Trails模块,就不会有Trail Material。

4.png

5.png

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


Scripting

Q:项目使用C#语言开发,战斗模块使用了大量的中文枚举,不知道是否会产生什么风险问题,查阅了部分资料也没有结果。

public enum TTT
{
  我 = 0,
  是 = 1,
  程 = 2,
  序 = 3,
  员 = 4,
}

A1:雨松之前提过一个方案加属性来实现可以编辑器上显示中文,代码中仍然用英文,网上能搜到。

感谢Knight-132872@UWA问答社区提供了回答

A2:可参考:《Unity3D研究院之多语言用中文做KEY(七十五)》

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


Scripting

Q:【打包】C#脚本存在未引用的命名空间,打包报错了提示命名空间不存在UnityEditor。引用到Editor命名空间的脚本(即使未使用),也未放到Editor文件夹下时,会引发打包报错问题。

6.png

A1:UnityEditor这个库只能在Editor下运行,是打包不出去的。我看你也没有引用到,直接删除即可。

感谢萧小俊@UWA问答社区提供了回答

A2:如果是Editor上专用的建议放到Editor文件夹里,如果运行时也需要可以加UNITY_EDITOR宏来隔绝。

感谢Knight-132872@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/618c82e5d8413e18eb0d29e2

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

封面图来源于:Awesome Unity Shader
关于炫酷的Unity3D Shader。
https://lab.uwa4d.com/lab/5b563be1d7f10a201fd8beeb


今天的分享就到这里。当然,生有涯而知无涯。在漫漫的开发周期中,您看到的这些问题也许都只是冰山一角,我们早已在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