接着之前写bloom,关于alpha通道存储
不是半透物体可以改输出的alpha通道就可以存储alpha值
对于粒子特效来说本身输出就带alpha通道,所以要控制这个alpha通道必须加一个pass来控制
原理
第一个pass需要加ColorMask RGB(避免影响alpha存储)
第二个pass需要加ColorMask A(避免影响第一个pass输出颜色)
由于遇到点光源(顶点模式外)会影响整个屏幕的alpha通道,把整个屏幕alpha通道变白
所以屏幕alpha通道越小(显示越接近黑色)bloom效果以越黑越亮来处理
我这边用自带的Particles/Mobile/Additive这个shader作为例子,具体版本的shader去官网下载
注意第二个pass我用Blend SrcAlpha OneMinusSrcAlpha这个模式
因为默认情况下其他没有bloom效果的都是alpha通道为1(显示白色),这个
扫描二维码关注公众号,回复:
6047730 查看本文章
OneMinusSrcAlpha 1- SrcAlpha所以显示黑色alpha不能超过0.5,
// Unity built-in shader source. Copyright (c) 2016 Unity Technologies. MIT license (see license.txt)
// Simplified Additive Particle shader. Differences from regular Additive Particle one:
// - no Tint color
// - no Smooth particle support
// - no AlphaTest
// - no ColorMask
Shader "Effect/Particles/Mobile/Additive" {
Properties {
_MainTex ("Particle Texture", 2D) = "white" {}
_Intensity("Intensity", Range(0,0.9)) = 0
}
Category {
Tags { "Queue"="Transparent" "IgnoreProjector"="True" "PreviewType"="Plane" "RenderType" = "Effect" }
Cull Off Lighting Off ZWrite Off Fog { Mode Off }
BindChannels {
Bind "Color", color
Bind "Vertex", vertex
Bind "TexCoord", texcoord
}
SubShader {
Pass
{
Blend SrcAlpha One
ColorMask RGB
SetTexture [_MainTex] {
combine texture * primary
}
}
Pass
{
ColorMask A
Blend SrcAlpha OneMinusSrcAlpha
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma fragmentoption ARB_precision_hint_fastest
#include "UnityCG.cginc"
sampler2D _MainTex;
half4 _MainTex_ST;
float _Intensity;
struct v2f {
half4 pos : SV_POSITION;
half2 uv : TEXCOORD0;
fixed4 vertexColor : COLOR;
};
v2f vert(appdata_full v) {
v2f o;
o.pos = UnityObjectToClipPos(v.vertex);
o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
o.vertexColor = v.color;
return o;
}
float4 frag(v2f i) : COLOR
{
float4 color = tex2D(_MainTex, i.uv.xy);
color.w = clamp(color.w * step(0.01, color.r + color.g + color.b) * _Intensity, 0, 1);
color.w = color.w * 0.5;
return color;
}
ENDCG
}
}
}
}
最后看看最后输出的图
下面是调节_Intensity参数的效果图
其他shader自己扩展,给个思路就够了