122 lines
3.1 KiB
Plaintext
122 lines
3.1 KiB
Plaintext
Shader "Hide/FullBlur"
|
||
{
|
||
Properties
|
||
{
|
||
_MainTex("Texture", 2D) = "white" {}
|
||
}
|
||
SubShader
|
||
{
|
||
Tags
|
||
{
|
||
"RenderType"="Opaque"
|
||
"RenderPipeline" = "UniversalPipeline"
|
||
}
|
||
|
||
LOD 100
|
||
|
||
HLSLINCLUDE
|
||
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
|
||
sampler2D _MainTex;
|
||
half4 _MainTex_TexelSize;
|
||
float _BlurSizeX;
|
||
float _BlurSizeY;
|
||
|
||
//URP下没有appdata_img结构 要自定义
|
||
struct a2v
|
||
{
|
||
float4 vertex : POSITION;
|
||
float2 texcoord : TEXCOORD0;
|
||
};
|
||
|
||
struct v2f
|
||
{
|
||
float4 pos : SV_POSITION;
|
||
half2 uv[5] : TEXCOORD0;
|
||
};
|
||
|
||
//我们只需要appdata_img内置结构的数据传入即可(有顶点、纹理坐标)
|
||
v2f vertBlurVertical(a2v v) {
|
||
v2f o;
|
||
|
||
//o.pos = UnityObjectToClipPos(v.vertex); //CG
|
||
VertexPositionInputs vertexInputs = GetVertexPositionInputs(v.vertex.xyz);
|
||
o.pos = vertexInputs.positionCS;
|
||
half2 uv = v.texcoord;
|
||
|
||
//纵向的5个像素点纹理坐标
|
||
o.uv[0] = uv;
|
||
o.uv[1] = uv + float2(0.0, _MainTex_TexelSize.y * 1.0) * _BlurSizeY;
|
||
o.uv[2] = uv - float2(0.0, _MainTex_TexelSize.y * 1.0) * _BlurSizeY;
|
||
o.uv[3] = uv + float2(0.0, _MainTex_TexelSize.y * 2.0) * _BlurSizeY;
|
||
o.uv[4] = uv - float2(0.0, _MainTex_TexelSize.y * 2.0) * _BlurSizeY;
|
||
return o;
|
||
}
|
||
|
||
v2f vertBlurHorizontal(a2v v) {
|
||
v2f o;
|
||
//o.pos = UnityObjectToClipPos(v.vertex); //CG
|
||
VertexPositionInputs vertexInputs = GetVertexPositionInputs(v.vertex.xyz);
|
||
o.pos = vertexInputs.positionCS;
|
||
half2 uv = v.texcoord;
|
||
|
||
//横向的5个像素点纹理坐标
|
||
o.uv[0] = uv;
|
||
o.uv[1] = uv + float2(_MainTex_TexelSize.x * 1.0, 0.0) * _BlurSizeX;
|
||
o.uv[2] = uv - float2(_MainTex_TexelSize.x * 1.0, 0.0) * _BlurSizeX;
|
||
o.uv[3] = uv + float2(_MainTex_TexelSize.x * 2.0, 0.0) * _BlurSizeX;
|
||
o.uv[4] = uv - float2(_MainTex_TexelSize.x * 2.0, 0.0) * _BlurSizeX;
|
||
return o;
|
||
}
|
||
|
||
//无论是纵向还是横向,它们都会使用这个片元着色器,处理手法一样
|
||
half4 fragBlur(v2f i) : SV_Target{
|
||
float weight[3] = {0.4026, 0.2442, 0.0545};
|
||
//采样RGB然后进行乘以对应的权重累加到sum
|
||
half3 sum = tex2D(_MainTex, i.uv[0]).rgb * weight[0];
|
||
for (int it = 1; it < 3; it++) {
|
||
sum += tex2D(_MainTex, i.uv[it * 2 - 1]).rgb * weight[it];
|
||
sum += tex2D(_MainTex, i.uv[it * 2]).rgb * weight[it];
|
||
}
|
||
//是的这样就完成了,模糊。。。。
|
||
return half4(sum, 1.0);
|
||
}
|
||
ENDHLSL
|
||
|
||
//上面都是INCLUDE内容即下面Pass都可使用的内容
|
||
//标配写法
|
||
ZTest Always Cull Off ZWrite Off
|
||
//第一个PASS,纵向模糊处理
|
||
Pass
|
||
{
|
||
NAME "GAUSSIAN_BLUR_VERTICAL"
|
||
|
||
//CGPROGRAM //CG
|
||
HLSLPROGRAM
|
||
|
||
//纵向的顶点着色器
|
||
#pragma vertex vertBlurVertical
|
||
//片元着色器
|
||
#pragma fragment fragBlur
|
||
|
||
//ENDCG //CG
|
||
ENDHLSL
|
||
}
|
||
//第二个Pass 横向模糊处理
|
||
Pass
|
||
{
|
||
NAME "GAUSSIAN_BLUR_HORIZONTAL"
|
||
|
||
//CGPROGRAM
|
||
HLSLPROGRAM
|
||
|
||
//横向的顶点着色器
|
||
#pragma vertex vertBlurHorizontal
|
||
//片元着色器
|
||
#pragma fragment fragBlur
|
||
|
||
//ENDCG
|
||
ENDHLSL
|
||
}
|
||
}//完成SubShader
|
||
Fallback Off
|
||
} |