1、对UV进行多次采样,每次都对U或V进行稍微的偏转,然后再做一个叠加
Shader "Custom/s_mohu" {
Properties{
_MainTex("MainTex", 2D) = ""{}
_F("F",range(1,30)) = 10
_A("A",range(0,0.1)) = 0.01
_R("R",range(0,1)) = 0
}
SubShader{
pass {
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "unitycg.cginc"
float tiling_x;
float tiling_y;
float offset_x;
float offset_y;
sampler2D _MainTex;
//unity总是会帮我们传递这样一个值
float4 _MainTex_ST;
float _F;
float _A;
float _R;
struct v2f {
float4 pos:POSITION;
float2 uv:TEXCOORD0;
};
v2f vert(appdata_base v) {
v2f o;
o.pos = mul(UNITY_MATRIX_MVP,v.vertex);
o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
return o;
}
fixed4 frag(v2f IN) :COLOR{
float offset_uv = 0.01;
float2 uv = IN.uv;
fixed4 color = tex2D(_MainTex, uv);
//采样后稍微偏移
uv = IN.uv.x + offset_uv;
//采样叠加
color.rgb += tex2D(_MainTex,uv);
uv = IN.uv.x - offset_uv;
color.rgb += tex2D(_MainTex, uv);
uv = IN.uv.y + offset_uv;
//采样叠加
color.rgb += tex2D(_MainTex, uv);
uv = IN.uv.y - offset_uv;
color.rgb += tex2D(_MainTex, uv);
//叠加后颜色加深,所以除以总的叠加次数
color.rgb /= 5;
return color;
}
ENDCG
}
}
}
多次采样后的结果:
2、通过导数的形式进行模糊
Shader "Custom/s_mohu" {
Properties{
_MainTex("MainTex", 2D) = ""{}
_F("F",range(1,30)) = 10
_A("A",range(0,0.1)) = 0.01
_R("R",range(0,1)) = 0
}
SubShader{
pass {
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "unitycg.cginc"
#pragma target 3.0
float tiling_x;
float tiling_y;
float offset_x;
float offset_y;
sampler2D _MainTex;
//unity总是会帮我们传递这样一个值
float4 _MainTex_ST;
float _F;
float _A;
float _R;
struct v2f {
float4 pos:POSITION;
float2 uv:TEXCOORD0;
};
v2f vert(appdata_base v) {
v2f o;
o.pos = mul(UNITY_MATRIX_MVP,v.vertex);
o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
return o;
}
fixed4 frag(v2f IN) :COLOR{
fixed4 color = tex2D(_MainTex,IN.uv,float2(0.01,0.01),float2(0.01,0.01));
return color;
}
ENDCG
}
}
}
3、使用ddx ddy导数进行偏导
Shader "Custom/s_mohu" {
Properties{
_MainTex("MainTex", 2D) = ""{}
_F("F",range(1,30)) = 10
_A("A",range(0,0.1)) = 0.01
_R("R",range(0,1)) = 0
}
SubShader{
pass {
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "unitycg.cginc"
#pragma target 3.0
float tiling_x;
float tiling_y;
float offset_x;
float offset_y;
sampler2D _MainTex;
//unity总是会帮我们传递这样一个值
float4 _MainTex_ST;
float _F;
float _A;
float _R;
struct v2f {
float4 pos:POSITION;
float2 uv:TEXCOORD0;
};
v2f vert(appdata_base v) {
v2f o;
o.pos = mul(UNITY_MATRIX_MVP,v.vertex);
o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
return o;
}
fixed4 frag(v2f IN) :COLOR{
float dx = ddx(IN.uv.x)*10;
float2 dsdx = float2(dx,dx);
float dy = ddx(IN.uv.y) * 10;
float2 dsdy = float2(dy, dy);
//ddx /ddy
fixed4 color = tex2D(_MainTex,IN.uv,dsdx,dsdy);
return color;
}
ENDCG
}
}
}
4、当转到正面的时候很清楚,转到其它面的时候很模糊
Shader "Custom/s_mohu" {
Properties{
_MainTex("MainTex", 2D) = ""{}
_F("F",range(1,30)) = 10
_A("A",range(0,0.1)) = 0.01
_R("R",range(0,1)) = 0
}
SubShader{
pass {
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "unitycg.cginc"
#pragma target 3.0
float tiling_x;
float tiling_y;
float offset_x;
float offset_y;
sampler2D _MainTex;
//unity总是会帮我们传递这样一个值
float4 _MainTex_ST;
float _F;
float _A;
float _R;
struct v2f {
float4 pos:POSITION;
float2 uv:TEXCOORD0;
float z : TEXCOORD1;
};
v2f vert(appdata_base v) {
v2f o;
o.pos = mul(UNITY_MATRIX_MVP,v.vertex);
o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
o.z = mul(_Object2World,v.vertex).z;
return o;
}
fixed4 frag(v2f IN) :COLOR{
float2 dsdx=ddx(IN.z)*10;
float2 dsdy = ddy(IN.z)*10;
fixed4 color = tex2D(_MainTex,IN.uv,dsdx,dsdy);
return color;
}
ENDCG
}
}
}
正面:清晰
稍微旋转:模糊