sampler2D _MainTex;
float4 _MainTex_TexelSize;
half3 BoxFilter(float2 uv)
{
half2 upL,upR,downL,downR;
upL =_MainTex_TexelSize.xy * half2(-1,1);
upR =_MainTex_TexelSize.xy * half2(1,1);
downL =_MainTex_TexelSize.xy * half2(-1,-1);
downR =_MainTex_TexelSize.xy * half2(1,-1);
half3 col = 0;
col += Sample(uv+upL)*0.25;
col += Sample(uv+upR)*0.25;
col += Sample(uv+downL)*0.25;
col += Sample(uv+downR)*0.25;
return col;
}
首先看 _MainTex_TexelSize;
https://docs.unity3d.com/cn/current/Manual/SL-PropertiesInPrograms.html
所以_MainTex_TexelSize 其实是那个纹理的相关信息
upL =_MainTex_TexelSize.xy * half2(-1,1);
这个就是取得当前坐标的 左上uv偏移量
col += Sample(uv+upL)*0.25;
再加上真实uv坐标就是取这个uv的左上的颜色
注意几点
_MainTex_TexelSize.y < 0.0是用于判断是否开启了抗锯齿,在Direct3D平台下,如果我们开启了抗锯齿,则xxx_TexelSize.y 会变成负值,好让我们能够正确的进行采样。
顺便提一句
UV坐标 Direct3D 和 OpenGL 不同
Direct3D 是左上角
OpenGL 是左下角