unity 关于Particles shader的alpha通道存储(用于bloom效果)

接着之前写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(显示白色),这个

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自己扩展,给个思路就够了

猜你喜欢

转载自blog.csdn.net/SnoopyNa2Co3/article/details/89015939
今日推荐