原创内容,转载请注明原文网址:http://homeqin.cn/a/wenzhangboke/jishutiandi/youxikaifa/2019/0325/425.html
径向模糊效果shader
	这效果在战神3中切换场景时见过, 山脊赛车3的运动含糊也有这种觉得.
	原理:
	    肯定一个中心点(如0.5, 0.5), 跟当前像素连一条线. 以当前像素为中心, 在线上的左近像素停止采样, 最后常州微信公众平台取一下均匀值.
	代码翻译成HLSL:
	复制代码
	// This texture should hold the image to blur.
	sampler2D Texture0;
	// some const, tweak for best look
	const float fSampleDist;
	const float fSampleStrength; 
	// some sample positions
	float samples[10] = 
	{
	   -0.08,
	   -0.05,
	   -0.03,
	   -0.02,
	   -0.01,
	   0.01,
	   0.02,
	   0.03,
	   0.05,
	   0.08
	};
	float4 ps_main( float2 texCoord  : TEXCOORD0 ) : COLOR
	{
	   // 0.5,0.5 is the center of the screen
	   // so substracting uv from it will result in
	   // a vector pointing to the middle of the screen
	   float2 dir = 0.5 - texCoord;
	   // calculate the distance to the center of the screen
	   float dist = length(dir);
	   // normalize the direction (reuse the distance)
	   dir /= dist;
	   // this is the original colour of this pixel
	   // using only this would result in a nonblurred version
	   float4 color = tex2D(Texture0, texCoord);
	   float4 sum = color;
	   // take 10 additional blur samples in the direction towards
	   // the center of the screen
	   for (int i = 0; i < 10; ++i)
	   {
	      sum += tex2D(Texture0, texCoord + dir * samples[i] * fSampleDist);
	   }
	   // we have taken eleven samples
	   sum /= 11.0;
	   // weighten the blur effect with the distance to the
	   // center of the screen ( further out is blurred more)
	   float t = saturate(dist * fSampleStrength);
	   //Blend the original color with the averaged pixels
	   return lerp(color, sum, t);
	}
	复制常州微信小程序开发代码
	 Unity shaderLab:
	复制代码
	//径向含糊后处置
	Shader "RadialBlur" {
	         Properties {
	                 _MainTex ("Base (RGB)", 2D) = "white" {}
	                 _fSampleDist("SampleDist", Float) = 1 //采样间隔
	                 _fSampleStrength("SampleStrength", Float) = 2.2 //采样力度
	         }
	         SubShader {
	                 Pass {               
	                         ZTest Always Cull Off ZWrite Off
	                         Fog { Mode off }  
	                         CGPROGRAM
	                         #pragma vertex vert
	                         #pragma fragment frag
	                         #include "UnityCG.cginc"
	                         struct appdata_t {
	                                 float4 vertex : POSITION;
	                                 float2 texcoord : TEXCOORD;
	                         };
	                         struct v2f {
	                                 float4 vertex : POSITION;
	                                 float2 texcoord : TEXCOORD;
	                         };
	                         float4 _MainTex_ST;
	                         v2f vert (appdata_t v)
	                         {
	                                 v2f o;
	                                 o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
	                                 o.texcoord = TRANSFORM_TEX(v.texcoord, _MainTex);
	                                 return o;
	                         }
	                         sampler2D _MainTex;
	                         float _fSampleDist;
	                         float _fSampleStrength;
	                         // some sample positions  
	                         static const float samples[6] =   
	                         {   
	                            -0.05,  
	                            -0.03,    
	                            -0.01,  
	                            0.01,    
	                            0.03,  
	                            0.05,  
	                         }; 
	                         half4 frag (v2f i) : SV_Target
	                         {
	                            //0.5,0.5屏幕中心
	                            float2 dir = float2(0.5, 0.5) - i.texcoord;//从采样中心到uv的方向向量
	                            float2 texcoord = i.texcoord;
	                               float dist = length(dir);  
	                            dir = normalize(dir); 
	                            float4 color = tex2D(_MainTex, texcoord);  
	                            float4 sum = color;
	                               //    6次采样
	                            for (int i = 0; i < 6; ++i)  
	                            {  
	                                   sum += tex2D(_MainTex, texcoord + dir * samples[i] * _fSampleDist);    
	                            }  
	                            //求均值
	                            sum /= 7.0f;  
	                            //越离采样中心近的中央,越不含糊
	                            float t = saturate(dist * _fSampleStrength);  
	                            //常州网站开发建设插值
	                            return lerp(color, sum, t);
	                         }
	                         ENDCG 
	                 }
	         } 
	         Fallback off
	 }
	复制代码
	两个参数, 动态调整的话能够产生山脊赛车3那种速度感(也算是第一人称运动含糊的简单完成吧).
上篇:上一篇:Unity3d Singleton与对象pool
下篇:下一篇:常州手游-UGUI异步加载场景进度条




