Unity中如何通过Shader编写实现高效高斯模糊效果?

2026-04-30 12:322阅读0评论SEO基础
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计565个文字,预计阅读时间需要3分钟。

Unity中如何通过Shader编写实现高效高斯模糊效果?

本文分享了Unity Shader实现高斯模糊效果的代码示例,供大家参考学习。以下是具体内容:

+ 正常图像:![正常图像](image/normal.png)

+ 高斯模糊效果图像:![高斯模糊效果图像](image/gaussian_blur.png)

+ Shader代码:ShaderShader Custom/GaoSiMoHu{ Properties { _MainTex (Texture, 2D)=white {} } SubShader { Tags { RenderType=Opaque } LOD 100

Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag

#include UnityCG.cginc

struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; };

struct v2f { float2 uv : TEXCOORD0; float4 vertex : SV_POSITION; };

sampler2D _MainTex; float4 _MainTex_ST;

v2f vert (appdata v) { v2f o; o.vertex=UnityObjectToClipPos(v.vertex); o.uv=TRANSFORM_TEX(v.uv, _MainTex); return o; }

fixed4 frag (v2f i) : SV_Target { // 高斯模糊算法 // ... return tex2D(_MainTex, i.uv); } ENDCG } } FallBack Diffuse}

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

正常图:

高斯模糊效果图:

Unity中如何通过Shader编写实现高效高斯模糊效果?

shader代码:

Shader "Custom/GaoSiMoHu" { 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即可看到效果

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

本文共计565个文字,预计阅读时间需要3分钟。

Unity中如何通过Shader编写实现高效高斯模糊效果?

本文分享了Unity Shader实现高斯模糊效果的代码示例,供大家参考学习。以下是具体内容:

+ 正常图像:![正常图像](image/normal.png)

+ 高斯模糊效果图像:![高斯模糊效果图像](image/gaussian_blur.png)

+ Shader代码:ShaderShader Custom/GaoSiMoHu{ Properties { _MainTex (Texture, 2D)=white {} } SubShader { Tags { RenderType=Opaque } LOD 100

Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag

#include UnityCG.cginc

struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; };

struct v2f { float2 uv : TEXCOORD0; float4 vertex : SV_POSITION; };

sampler2D _MainTex; float4 _MainTex_ST;

v2f vert (appdata v) { v2f o; o.vertex=UnityObjectToClipPos(v.vertex); o.uv=TRANSFORM_TEX(v.uv, _MainTex); return o; }

fixed4 frag (v2f i) : SV_Target { // 高斯模糊算法 // ... return tex2D(_MainTex, i.uv); } ENDCG } } FallBack Diffuse}

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

正常图:

高斯模糊效果图:

Unity中如何通过Shader编写实现高效高斯模糊效果?

shader代码:

Shader "Custom/GaoSiMoHu" { 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即可看到效果

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