当前位置:   article > 正文

Unity背景模糊图片高斯模糊高性能的实现方案_unity高斯模糊

unity高斯模糊

环境:

unity2021.3.x

效果:

模糊前:

模糊后:

模糊前:

模糊后:

实现核心思路(shader):

  1. SubShader {
  2. CGINCLUDE
  3. #include "UnityCG.cginc"
  4. sampler2D _MainTex; // 主纹理
  5. half4 _MainTex_TexelSize; // _MainTex的像素尺寸大小, float4(1/width, 1/height, width, height)
  6. float _BlurSize; // 模糊尺寸(纹理坐标的偏移量)
  7. struct v2f {
  8. float4 pos : SV_POSITION; // 模型空间顶点坐标
  9. half2 uv[5]: TEXCOORD0; // 5个邻域的纹理坐标
  10. };
  11. v2f vertBlurVertical(appdata_img v) { // 垂直模糊顶点着色器
  12. v2f o;
  13. o.pos = UnityObjectToClipPos(v.vertex); // 模型空间顶点坐标变换到裁剪空间, 等价于: mul(UNITY_MATRIX_MVP, v.vertex)
  14. half2 uv = v.texcoord;
  15. o.uv[0] = uv;
  16. o.uv[1] = uv + float2(0.0, _MainTex_TexelSize.y * 1.0) * _BlurSize;
  17. o.uv[2] = uv - float2(0.0, _MainTex_TexelSize.y * 1.0) * _BlurSize;
  18. o.uv[3] = uv + float2(0.0, _MainTex_TexelSize.y * 2.0) * _BlurSize;
  19. o.uv[4] = uv - float2(0.0, _MainTex_TexelSize.y * 2.0) * _BlurSize;
  20. return o;
  21. }
  22. v2f vertBlurHorizontal(appdata_img v) { // 水平模糊顶点着色器
  23. v2f o;
  24. o.pos = UnityObjectToClipPos(v.vertex); // 模型空间顶点坐标变换到裁剪空间, 等价于: mul(UNITY_MATRIX_MVP, v.vertex)
  25. half2 uv = v.texcoord;
  26. o.uv[0] = uv;
  27. o.uv[1] = uv + float2(_MainTex_TexelSize.x * 1.0, 0.0) * _BlurSize;
  28. o.uv[2] = uv - float2(_MainTex_TexelSize.x * 1.0, 0.0) * _BlurSize;
  29. o.uv[3] = uv + float2(_MainTex_TexelSize.x * 2.0, 0.0) * _BlurSize;
  30. o.uv[4] = uv - float2(_MainTex_TexelSize.x * 2.0, 0.0) * _BlurSize;
  31. return o;
  32. }
  33. fixed4 fragBlur(v2f i) : SV_Target {
  34. float weight[3] = {0.4026, 0.2442, 0.0545}; // 大小为5的一维高斯核,实际只需记录3个权值
  35. fixed3 sum = tex2D(_MainTex, i.uv[0]).rgb * weight[0];
  36. for (int j = 1; j < 3; j++) {
  37. sum += tex2D(_MainTex, i.uv[j * 2 - 1]).rgb * weight[j]; // 中心右侧或下侧的纹理*权值
  38. sum += tex2D(_MainTex, i.uv[j * 2]).rgb * weight[j]; // 中心左侧或上侧的纹理*权值
  39. }
  40. return fixed4(sum, 1.0);
  41. }
  42. ENDCG
  43. ZTest Always Cull Off ZWrite Off
  44. Pass {
  45. NAME "GAUSSIAN_BLUR_VERTICAL"
  46. CGPROGRAM
  47. #pragma vertex vertBlurVertical
  48. #pragma fragment fragBlur
  49. ENDCG
  50. }
  51. Pass {
  52. NAME "GAUSSIAN_BLUR_HORIZONTAL"
  53. CGPROGRAM
  54. #pragma vertex vertBlurHorizontal
  55. #pragma fragment fragBlur
  56. ENDCG
  57. }
  58. }

github地址:高斯模糊 Github地址

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

闽ICP备14008679号