当前位置:   article > 正文

Unity中的模糊效果(基于URP)

Unity中的模糊效果(基于URP)

十种模糊效果,以后处理方式实现

一,高斯模糊(Gaussian Blur)

片源代码

  1. float4 FragGaussianBlur(v2f i): SV_Target
  2. {
  3. half4 color = float4(0, 0, 0, 0);
  4. color += 0.40 * SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, i.uv);
  5. color += 0.15 * SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, i.uv01.xy);
  6. color += 0.15 * SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, i.uv01.zw);
  7. color += 0.10 * SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, i.uv23.xy);
  8. color += 0.10 * SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, i.uv23.zw);
  9. color += 0.05 * SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, i.uv45.xy);
  10. color += 0.05 * SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, i.uv45.zw);
  11. return color;
  12. }

                                                              Gaussian Blur Off

                                                              Gaussian Blur On

二,方框模糊(Box Blur)

片源代码

  1. half4 BoxFilter_4Tap(TEXTURE2D_ARGS(tex, samplerTex), float2 uv, float2 texelSize)
  2. {
  3. float4 d = texelSize.xyxy * float4(-1.0, -1.0, 1.0, 1.0);
  4. half4 s = 0;
  5. s = SAMPLE_TEXTURE2D(tex, samplerTex, uv + d.xy) * 0.25h; // 1 MUL
  6. s += SAMPLE_TEXTURE2D(tex, samplerTex, uv + d.zy) * 0.25h; // 1 MAD
  7. s += SAMPLE_TEXTURE2D(tex, samplerTex, uv + d.xw) * 0.25h; // 1 MAD
  8. s += SAMPLE_TEXTURE2D(tex, samplerTex, uv + d.zw) * 0.25h; // 1 MAD
  9. return s;
  10. }

                                                              Box Blur Off

                                                              Box Blur On

三,Kawase模糊(Kawase Blur)

片源代码

  1. half4 KawaseBlur(TEXTURE2D_ARGS(tex, samplerTex), float2 uv, float2 texelSize, half pixelOffset)
  2. {
  3. half4 o = 0;
  4. o += SAMPLE_TEXTURE2D(tex, samplerTex, uv + float2(pixelOffset +0.5, pixelOffset +0.5) * texelSize);
  5. o += SAMPLE_TEXTURE2D(tex, samplerTex, uv + float2(-pixelOffset -0.5, pixelOffset +0.5) * texelSize);
  6. o += SAMPLE_TEXTURE2D(tex, samplerTex, uv + float2(-pixelOffset -0.5, -pixelOffset -0.5) * texelSize);
  7. o += SAMPLE_TEXTURE2D(tex, samplerTex, uv + float2(pixelOffset +0.5, -pixelOffset -0.5) * texelSize);
  8. return o * 0.25;
  9. }

                                                              Kawase Blur Off

                                                              Kawase Blur On

四、双重模糊(Dual Blur)

片源代码

  1. half4 Frag_DownSample(v2f_DownSample i): SV_Target
  2. {
  3. half4 sum = SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, i.uv) * 4;
  4. sum += SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, i.uv01.xy);
  5. sum += SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, i.uv01.zw);
  6. sum += SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, i.uv23.xy);
  7. sum += SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, i.uv23.zw);
  8. return sum * 0.125;
  9. }
  10. half4 Frag_UpSample(v2f_UpSample i): SV_Target
  11. {
  12. half4 sum = 0;
  13. sum += SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, i.uv01.xy);
  14. sum += SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, i.uv01.zw) * 2;
  15. sum += SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, i.uv23.xy);
  16. sum += SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, i.uv23.zw) * 2;
  17. sum += SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, i.uv45.xy);
  18. sum += SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, i.uv45.zw) * 2;
  19. sum += SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, i.uv67.xy);
  20. sum += SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, i.uv67.zw) * 2;
  21. return sum * 0.0833;
  22. }

                                                              Dual Kawase Blur Off

                                                              Dual Kawase Blur On

五、散景模糊(Bokeh Blur)

片源代码

  1. half4 BokehBlur(VaryingsDefault i)
  2. {
  3. half2x2 rot = half2x2(_GoldenRot);
  4. half4 accumulator = 0.0;
  5. half4 divisor = 0.0;
  6. half r = 1.0;
  7. half2 angle = half2(0.0, _Radius);
  8. for (int j = 0; j < _Iteration; j++)
  9. {
  10. r += 1.0 / r;
  11. angle = mul(rot, angle);
  12. half4 bokeh = SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, float2(i.texcoord + _PixelSize * (r - 1.0) * angle));
  13. accumulator += bokeh * bokeh;
  14. divisor += bokeh;
  15. }
  16. return accumulator / divisor;
  17. }

                                                              Bokeh Blur Off

                                                              Bokeh Blur On

六、移轴模糊 (Tilt Shift Blur)

片源代码

  1. float TiltShiftMask(float2 uv)
  2. {
  3. float centerY = uv.y * 2.0 - 1.0 + _Offset; // [0,1] -> [-1,1]
  4. return pow(abs(centerY * _Area), _Spread);
  5. }

                                                              Tilt Shift Blur Off

                                                              Tilt Shift Blur On

七、光圈模糊(Iris Blur)

片源代码

  1. float IrisMask(float2 uv)
  2. {
  3. float2 center = uv * 2.0 - 1.0 + _Offset; // [0,1] -> [-1,1]
  4. return dot(center, center) * _AreaSize;
  5. }

                                                              Iris Blur Off

                                                              Iris Blur On

八、粒状模糊(Grainy Blur)

片源代码

  1. float Rand(float2 n)
  2. {
  3. return sin(dot(n, half2(1233.224, 1743.335)));
  4. }
  5. half4 GrainyBlur(VaryingsDefault i)
  6. {
  7. half2 randomOffset = float2(0.0, 0.0);
  8. half4 finalColor = half4(0.0, 0.0, 0.0, 0.0);
  9. float random = Rand(i.texcoord);
  10. for (int k = 0; k < int(_Iteration); k ++)
  11. {
  12. random = frac(43758.5453 * random + 0.61432);;
  13. randomOffset.x = (random - 0.5) * 2.0;
  14. random = frac(43758.5453 * random + 0.61432);
  15. randomOffset.y = (random - 0.5) * 2.0;
  16. finalColor += SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, half2(i.texcoord + randomOffset * _BlurRadius));
  17. }
  18. return finalColor / _Iteration;
  19. }

                                                              Grainy Blur Off

                                                              Grainy Blur On

九、径向模糊(Radial Blur)

片源代码

  1. half4 RadialBlur(VaryingsDefault i)
  2. {
  3. float2 blurVector = (_RadialCenter - i.texcoord.xy) * _BlurRadius;
  4. half4 acumulateColor = half4(0, 0, 0, 0);
  5. [unroll(30)]
  6. for (int j = 0; j < _Iteration; j ++)
  7. {
  8. acumulateColor += SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, i.texcoord);
  9. i.texcoord.xy += blurVector;
  10. }
  11. return acumulateColor / _Iteration;
  12. }

                                                              Radial Blur Off

                                                              Radial Blur On

十、方向模糊(Directional Blur)

片源代码

  1. half4 DirectionalBlur(VaryingsDefault i)
  2. {
  3. half4 color = half4(0.0, 0.0, 0.0, 0.0);
  4. for (int k = -_Iteration; k < _Iteration; k++)
  5. {
  6. color += SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, i.texcoord - _Direction * k);
  7. }
  8. half4 finalColor = color / (_Iteration * 2.0);
  9. return finalColor;
  10. }

                                                              Directional Blur Off

                                                              Directional Blur On

性能对比

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/神奇cpp/article/detail/1001790
推荐阅读
相关标签
  

闽ICP备14008679号