本文主要是介绍[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信息就行了。
这篇关于[Unity] RenderTexture上不显示粒子的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!