156 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			Plaintext
		
	
			
		
		
	
	
			156 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			Plaintext
		
	
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
 | 
						||
 | 
						||
// ---------------------------【泛光 Bloom】---------------------------
 | 
						||
Shader "lcl/screenEffect/Bloom"  
 | 
						||
{
 | 
						||
    // ---------------------------【属性】---------------------------
 | 
						||
    Properties
 | 
						||
    {
 | 
						||
        _MainTex ("Texture", 2D) = "white" {}
 | 
						||
    }
 | 
						||
    // ---------------------------【子着色器】---------------------------
 | 
						||
    SubShader
 | 
						||
    {
 | 
						||
        //后处理效果一般都是这几个状态  
 | 
						||
        ZTest Always  
 | 
						||
        Cull Off  
 | 
						||
        ZWrite Off  
 | 
						||
        Fog{ Mode Off } 
 | 
						||
 | 
						||
        CGINCLUDE
 | 
						||
        #include "UnityCG.cginc"
 | 
						||
        
 | 
						||
        sampler2D _MainTex;
 | 
						||
        half4 _MainTex_TexelSize;
 | 
						||
        sampler2D _BlurTex;
 | 
						||
        float4 _offsets;
 | 
						||
        float _LuminanceThreshold;
 | 
						||
        fixed4 _BloomColor;
 | 
						||
 | 
						||
        // ---------------------------【亮度提取 - start】---------------------------
 | 
						||
        struct v2fExtBright {
 | 
						||
            float4 pos : SV_POSITION; 
 | 
						||
            half2 uv : TEXCOORD0;
 | 
						||
        };
 | 
						||
        // 顶点着色器
 | 
						||
        v2fExtBright vertExtractBright(appdata_img v) {
 | 
						||
            v2fExtBright o;
 | 
						||
            
 | 
						||
            o.pos = UnityObjectToClipPos(v.vertex);
 | 
						||
            o.uv = v.texcoord;
 | 
						||
            
 | 
						||
            return o;
 | 
						||
        }
 | 
						||
        // 亮度提取
 | 
						||
        fixed luminance(fixed4 color) {
 | 
						||
            return  0.2125 * color.r + 0.7154 * color.g + 0.0721 * color.b; 
 | 
						||
        }
 | 
						||
        // 片元着色器
 | 
						||
        fixed4 fragExtractBright(v2fExtBright i) : SV_Target {
 | 
						||
            fixed4 color = tex2D(_MainTex, i.uv);
 | 
						||
            // clamp 约束到 0 - 1 区间
 | 
						||
            fixed val = clamp(luminance(color) - _LuminanceThreshold, 0.0, 1.0);
 | 
						||
            
 | 
						||
            return color * val;
 | 
						||
        }
 | 
						||
        // ---------------------------【亮度提取 - end】---------------------------
 | 
						||
 | 
						||
 | 
						||
        
 | 
						||
        // ---------------------------【高斯模糊 - start】---------------------------
 | 
						||
        struct v2fBlur  
 | 
						||
        {  
 | 
						||
            float4 pos : SV_POSITION;   //顶点位置  
 | 
						||
            float2 uv  : TEXCOORD0;     //纹理坐标  
 | 
						||
            float4 uv01 : TEXCOORD1;    //一个vector4存储两个纹理坐标  
 | 
						||
            float4 uv23 : TEXCOORD2;    //一个vector4存储两个纹理坐标  
 | 
						||
        };  
 | 
						||
 | 
						||
        //高斯模糊顶点着色器
 | 
						||
        v2fBlur vertBlur(appdata_img v)  
 | 
						||
        {  
 | 
						||
            v2fBlur o;  
 | 
						||
            o.pos = UnityObjectToClipPos(v.vertex);  
 | 
						||
            //uv坐标  
 | 
						||
            o.uv = v.texcoord.xy;  
 | 
						||
            
 | 
						||
            //计算一个偏移值,offset可能是(1,0,0,0)也可能是(0,1,0,0)这样就表示了横向或者竖向取像素周围的点  
 | 
						||
            _offsets *= _MainTex_TexelSize.xyxy;  
 | 
						||
            
 | 
						||
            //由于uv可以存储4个值,所以一个uv保存两个vector坐标,_offsets.xyxy * float4(1,1,-1,-1)可能表示(0,1,0-1),表示像素上下两个  
 | 
						||
            //坐标,也可能是(1,0,-1,0),表示像素左右两个像素点的坐标,下面*2.0,*3.0同理  
 | 
						||
            o.uv01 = v.texcoord.xyxy + _offsets.xyxy * float4(1, 1, -1, -1);  
 | 
						||
            o.uv23 = v.texcoord.xyxy + _offsets.xyxy * float4(1, 1, -1, -1) * 2.0;  
 | 
						||
            return o;  
 | 
						||
        }  
 | 
						||
        
 | 
						||
        //高斯模糊片段着色器
 | 
						||
        fixed4 fragBlur(v2fBlur i) : SV_Target  
 | 
						||
        {  
 | 
						||
            fixed4 color = fixed4(0,0,0,0);  
 | 
						||
            color += 0.4026 * tex2D(_MainTex, i.uv);  
 | 
						||
            color += 0.2442 * tex2D(_MainTex, i.uv01.xy);  
 | 
						||
            color += 0.2442 * tex2D(_MainTex, i.uv01.zw);  
 | 
						||
            color += 0.0545 * tex2D(_MainTex, i.uv23.xy);  
 | 
						||
            color += 0.0545 * tex2D(_MainTex, i.uv23.zw);  
 | 
						||
            return color;  
 | 
						||
        }
 | 
						||
        // ---------------------------【高斯模糊 - end】---------------------------
 | 
						||
 | 
						||
        // ---------------------------【Bloom(高斯模糊和原图叠加) - start】---------------------------
 | 
						||
        struct v2fBloom {
 | 
						||
            float4 pos : SV_POSITION; 
 | 
						||
            half2 uv : TEXCOORD0;
 | 
						||
        };
 | 
						||
        // 顶点着色器
 | 
						||
        v2fBloom vertBloom(appdata_img v) {
 | 
						||
            v2fBloom o;
 | 
						||
            
 | 
						||
            o.pos = UnityObjectToClipPos(v.vertex);
 | 
						||
            o.uv = v.texcoord;
 | 
						||
            
 | 
						||
            return o;
 | 
						||
        }
 | 
						||
     
 | 
						||
        // 片元着色器
 | 
						||
        fixed4 fragBloom(v2fBloom i) : SV_Target {
 | 
						||
            //对原图进行uv采样
 | 
						||
            fixed4 mainColor = tex2D(_MainTex, i.uv);
 | 
						||
            //对模糊处理后的图进行uv采样
 | 
						||
            fixed4 blurColor = tex2D(_BlurTex, i.uv);
 | 
						||
            //输出 = 原始图像,叠加bloom权值*bloom颜色*泛光颜色
 | 
						||
            fixed4 resColor = mainColor + 1 * blurColor * _BloomColor;
 | 
						||
 | 
						||
            return resColor;
 | 
						||
        } 
 | 
						||
        // ---------------------------【Bloom - end】---------------------------
 | 
						||
 | 
						||
        ENDCG
 | 
						||
 | 
						||
        // 亮度提取
 | 
						||
        Pass {  
 | 
						||
            CGPROGRAM  
 | 
						||
            #pragma vertex vertExtractBright  
 | 
						||
            #pragma fragment fragExtractBright  
 | 
						||
            ENDCG  
 | 
						||
        }
 | 
						||
 | 
						||
        //高斯模糊
 | 
						||
        Pass {
 | 
						||
            CGPROGRAM
 | 
						||
            #pragma vertex vertBlur  
 | 
						||
            #pragma fragment fragBlur
 | 
						||
            ENDCG  
 | 
						||
        }
 | 
						||
 | 
						||
        // Bloom
 | 
						||
        Pass {
 | 
						||
            CGPROGRAM
 | 
						||
            #pragma vertex vertBloom  
 | 
						||
            #pragma fragment fragBloom
 | 
						||
            ENDCG  
 | 
						||
        }
 | 
						||
 | 
						||
    }
 | 
						||
}
 |