欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Unity shader实现高斯模糊效果

程序员文章站 2023-11-17 14:47:58
本文实例为大家分享了unity shader实现高斯模糊效果的具体代码,供大家参考,具体内容如下 正常图: 高斯模糊效果图: shader代码:...

本文实例为大家分享了unity shader实现高斯模糊效果的具体代码,供大家参考,具体内容如下

正常图:

Unity shader实现高斯模糊效果

高斯模糊效果图:

Unity shader实现高斯模糊效果

shader代码:

shader "custom/gaosi*"
{
 properties
 {
 _maintex ("texture", 2d) = "white" {}
 _blursize("blur size",float)=1.0
 }
 subshader
 {
 ztest always
 cull off
 zwrite off

 cginclude//这个可以使其他pass块都可以使用,而不用在两个pass里都写,减少了写的次数
 sampler2d _maintex;
 half4 _maintex_texelsize;
 float _blursize;
 struct v2f{
  float4 pos:sv_position;
  half2 uv[5]:texcoord0;
 };
 fixed4 fragblur(v2f i):sv_target{
  float weight[3]={
  0.4026,
  0.2442,
  0.0545
  };

  fixed3 sum = tex2d(_maintex,i.uv[0]).rgb * weight[0];

  for(int it = 1; it < 3; it++){
  sum += tex2d(_maintex,i.uv[it]).rgb * weight[it];
  sum += tex2d(_maintex,i.uv[2 * it]).rgb * weight[it];
  }

  return fixed4(sum,1.0);
 }
 endcg

 pass{
  name "gaussian_blur_vertical"//这个pass的唯一名字,可以在其他地方调用,usepass + 名字
  cgprogram

  #pragma vertex vertlurvertical
  #pragma fragment fragblur
  #include "unitycg.cginc"
  
  v2f vertlurvertical(appdata_img v){
  v2f o;
  o.pos = unityobjecttoclippos(v.vertex);
  half2 uv = v.texcoord;
  o.uv[0]=uv;
  o.uv[1]=uv + float2(0.0,_maintex_texelsize.y * 1.0) * _blursize;
  o.uv[2]=uv - float2(0.0,_maintex_texelsize.y * 1.0) * _blursize;
  o.uv[3]=uv + float2(0.0,_maintex_texelsize.y * 2.0) * _blursize;
  o.uv[4]=uv - float2(0.0,_maintex_texelsize.y * 2.0) * _blursize;

  return o;
  }
  endcg
 }

 pass{
  name "gaussian_blur_horizontal"
  cgprogram
  #pragma vertex vertlurhorizontal
  #pragma fragment fragblur
  #include "unitycg.cginc"

  v2f vertlurhorizontal(appdata_img v){
  v2f o;
  o.pos = unityobjecttoclippos(v.vertex);
  half2 uv = v.texcoord;
  o.uv[0]=uv;
  o.uv[1]=uv + float2(0.0,_maintex_texelsize.x * 1.0) * _blursize;
  o.uv[2]=uv - float2(0.0,_maintex_texelsize.x * 1.0) * _blursize;
  o.uv[3]=uv + float2(0.0,_maintex_texelsize.x * 2.0) * _blursize;
  o.uv[4]=uv - float2(0.0,_maintex_texelsize.x * 2.0) * _blursize;

  return o;
  }
  endcg
 }
 }
}

调节_blursize即可看到效果

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。