zoukankan      html  css  js  c++  java
  • Unity Shader 图片模糊效果实现

    Unity Shader 图片模糊效果实现

    shader源码如下

    // Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
    
    Shader "Custom/GaussianBlur"
    {
    	Properties
    	{
    		_MainTex("Texture", 2D) = "white" {}
    		_StencilComp("Stencil Comparison", Float) = 8
    		_Stencil("Stencil ID", Float) = 0
    		_StencilOp("Stencil Operation", Float) = 0
    		_StencilWriteMask("Stencil Write Mask", Float) = 255
    		_StencilReadMask("Stencil Read Mask", Float) = 255
    
    		_ColorMask("Color Mask", Float) = 15
    
    		_BlurSize("Blur Size", Float) = 2  //调整模糊强度
    	}
    
    		CGINCLUDE
    
    #include "UnityCG.cginc"
    
    		sampler2D _MainTex;
    		uniform half4 _MainTex_TexelSize;
    		uniform float _BlurSize;
    
    		static const half weight[4] = { 0.0205, 0.0855, 0.232, 0.324 };
    		static const half4 coordOffset = half4(1.0h, 1.0h, -1.0h, -1.0h);
    
    		struct v2f_blurSGX
    		{
    			float4 pos:SV_POSITION;
    			half2 uv:TEXCOORD0;
    			half4 uvoff[3]:TEXCOORD1;
    		};
    
    		v2f_blurSGX vert_BlurHorizontal(appdata_img v)
    		{
    			v2f_blurSGX o;
    			o.pos = UnityObjectToClipPos(v.vertex);
    			o.uv = v.texcoord.xy;
    			half2 offs = _MainTex_TexelSize.xy*half2(1, 0)*_BlurSize;
    			o.uvoff[0] = v.texcoord.xyxy + offs.xyxy*coordOffset * 3;
    			o.uvoff[1] = v.texcoord.xyxy + offs.xyxy*coordOffset * 2;
    			o.uvoff[2] = v.texcoord.xyxy + offs.xyxy*coordOffset;
    
    			return o;
    		}
    
    		v2f_blurSGX vert_BlurVertical(appdata_img v)
    		{
    			v2f_blurSGX o;
    			o.pos = UnityObjectToClipPos(v.vertex);
    			o.uv = v.texcoord.xy;
    
    			half2 offs = _MainTex_TexelSize.xy*half2(0, 1)*_BlurSize;
    			o.uvoff[0] = v.texcoord.xyxy + offs.xyxy*coordOffset * 3;
    			o.uvoff[1] = v.texcoord.xyxy + offs.xyxy*coordOffset * 2;
    			o.uvoff[2] = v.texcoord.xyxy + offs.xyxy*coordOffset;
    
    			return o;
    		}
    
    		fixed4 frag_Blur(v2f_blurSGX i) :SV_Target
    		{
    
    			fixed4 c = tex2D(_MainTex,i.uv)*weight[3];
    			for (int idx = 0; idx < 3; idx++)
    			{
    				c += tex2D(_MainTex,i.uvoff[idx].xy)*weight[idx];
    				c += tex2D(_MainTex,i.uvoff[idx].zw)*weight[idx];
    			}
    
    			return c;
    		}
    
    			ENDCG
    
    			SubShader
    		{
    			// No culling or depth
    			Cull Off ZWrite Off
    			Stencil
    			{
    				Ref[_Stencil]
    				Comp[_StencilComp]
    				Pass[_StencilOp]
    				ReadMask[_StencilReadMask]
    				WriteMask[_StencilWriteMask]
    			}
    			Fog{ Mode Off }
    			Blend SrcAlpha OneMinusSrcAlpha
    			ColorMask[_ColorMask]
    
    				Pass
    			{
    				ZTest Always
    				CGPROGRAM
    				#pragma vertex vert_BlurHorizontal
    				#pragma fragment frag_Blur
    
    
    				ENDCG
    			}
    
    				Pass
    			{
    				ZTest Always
    				CGPROGRAM
    				#pragma vertex vert_BlurVertical
    				#pragma fragment frag_Blur
    
    
    				ENDCG
    			}
    		}
    }
    
  • 相关阅读:
    Nodejs初阶之express
    windows 下安装nodejs及其配置环境
    NodeJS、NPM安装配置与测试步骤(windows版本)
    nodejs npm常用命令
    系列文章--Node.js学习笔记系列
    系列文章--8天学通MongoDB
    python 特征选择 绘图 + mine
    TCP/IP 详解卷一
    CNN检测模型统计检出率
    leetcode 572. Subtree of Another Tree
  • 原文地址:https://www.cnblogs.com/grassgarden/p/9784519.html
Copyright © 2011-2022 走看看