[Unity] RenderTexture上不显示粒子

RenderTexture上不显示粒子

前两天看到群里有人发了一个问题,用一个相机将图像渲染到render texture上面,然后将这个rendertexture给UI中的Image显示出来,发现粒子效果没有出现。群里进行了讨论,也有大神把原因说了出来。

如下所示,粒子效果没有完整显示
这里写图片描述
这里写图片描述

可以看到代码中有如下语句

Tags{ "Queue" = "Transparent" "IgnoreProjector" = "True" "RenderType" = "Transparent" "PreviewType" = "Plane" }
Blend SrcAlpha OneMinusSrcAlpha
ColorMask RGB
Cull Off Lighting Off ZWrite Off

这里要了解一个叫做Premultiplied Alpha的概念。也就是预先将alpha计算进RGB的值中。比如原来是(r,g,b,a), 通过Premultiplied Alpha变为(ar,ag,ab,a)。Premultiplied Alpha的作用一个是减少后期计算,还有一个更重要的作用是进行Texture Filtering

这里写图片描述

GPU专用的纹理格式,比如 PVR、ETC 一般在生成纹理都是默认 Premultiplied Alpha 的,这些格式一般是GPU硬解码,引擎用CPU处理会很慢。

原因在于默认的粒子效果使用到的shader中使用了ColorMask RGB,所以只有RGB三个通道的值被存入了缓冲,而没有写入A通道的值, 所以我们得到的texture其实没有粒子的alpha信息,由於使用了ZWrite Off,所以也沒有粒子的深度信息,当我们把这张纹理拿出来显示的时候,由于某些粒子所在位置alpha值为0,所以通过alpha预存得到的RGBA值是(0, 0, 0, 0),所以最后也就看不到颜色了。

对用的解决办法是将shader中的ColorMask RGB改为ColorMask RGBA,写入粒子的alpha信息就行了。

猜你喜欢

转载自blog.csdn.net/rickshaozhiheng/article/details/76014602
今日推荐