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

这篇具有很好参考价值的文章主要介绍了Unity背景模糊图片高斯模糊高性能的实现方案。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

环境:

unity2021.3.x

效果:

模糊前:

unity高斯模糊,Unity,unity,游戏引擎,背景模糊,高斯模糊,模糊

模糊后:

unity高斯模糊,Unity,unity,游戏引擎,背景模糊,高斯模糊,模糊

模糊前:

unity高斯模糊,Unity,unity,游戏引擎,背景模糊,高斯模糊,模糊

模糊后:

unity高斯模糊,Unity,unity,游戏引擎,背景模糊,高斯模糊,模糊

实现核心思路(shader):

 SubShader {
     CGINCLUDE
     
     #include "UnityCG.cginc"
     
     sampler2D _MainTex; // 主纹理
     half4 _MainTex_TexelSize; // _MainTex的像素尺寸大小, float4(1/width, 1/height, width, height)
     float _BlurSize; // 模糊尺寸(纹理坐标的偏移量)
       
     struct v2f {
         float4 pos : SV_POSITION; // 模型空间顶点坐标
         half2 uv[5]: TEXCOORD0; // 5个邻域的纹理坐标
     };
       
     v2f vertBlurVertical(appdata_img v) { // 垂直模糊顶点着色器
         v2f o;
         o.pos = UnityObjectToClipPos(v.vertex); // 模型空间顶点坐标变换到裁剪空间, 等价于: mul(UNITY_MATRIX_MVP, v.vertex)
         half2 uv = v.texcoord;
         o.uv[0] = uv;
         o.uv[1] = uv + float2(0.0, _MainTex_TexelSize.y * 1.0) * _BlurSize;
         o.uv[2] = uv - float2(0.0, _MainTex_TexelSize.y * 1.0) * _BlurSize;
         o.uv[3] = uv + float2(0.0, _MainTex_TexelSize.y * 2.0) * _BlurSize;
         o.uv[4] = uv - float2(0.0, _MainTex_TexelSize.y * 2.0) * _BlurSize;      
         return o;
     }
     
     v2f vertBlurHorizontal(appdata_img v) { // 水平模糊顶点着色器
         v2f o;
         o.pos = UnityObjectToClipPos(v.vertex); // 模型空间顶点坐标变换到裁剪空间, 等价于: mul(UNITY_MATRIX_MVP, v.vertex)
         half2 uv = v.texcoord;
         o.uv[0] = uv;
         o.uv[1] = uv + float2(_MainTex_TexelSize.x * 1.0, 0.0) * _BlurSize;
         o.uv[2] = uv - float2(_MainTex_TexelSize.x * 1.0, 0.0) * _BlurSize;
         o.uv[3] = uv + float2(_MainTex_TexelSize.x * 2.0, 0.0) * _BlurSize;
         o.uv[4] = uv - float2(_MainTex_TexelSize.x * 2.0, 0.0) * _BlurSize;      
         return o;
     }
 
     fixed4 fragBlur(v2f i) : SV_Target {
         float weight[3] = {0.4026, 0.2442, 0.0545}; // 大小为5的一维高斯核,实际只需记录3个权值
         fixed3 sum = tex2D(_MainTex, i.uv[0]).rgb * weight[0];
         for (int j = 1; j < 3; j++) {
             sum += tex2D(_MainTex, i.uv[j * 2 - 1]).rgb * weight[j]; // 中心右侧或下侧的纹理*权值
             sum += tex2D(_MainTex, i.uv[j * 2]).rgb * weight[j]; // 中心左侧或上侧的纹理*权值
         }
         return fixed4(sum, 1.0);
     }
         
     ENDCG
     
     ZTest Always Cull Off ZWrite Off
     
     Pass {
         NAME "GAUSSIAN_BLUR_VERTICAL"
         
         CGPROGRAM
           
         #pragma vertex vertBlurVertical  
         #pragma fragment fragBlur
           
         ENDCG  
     }
     
     Pass {  
         NAME "GAUSSIAN_BLUR_HORIZONTAL"
         
         CGPROGRAM  
         
         #pragma vertex vertBlurHorizontal  
         #pragma fragment fragBlur
         
         ENDCG
     }
 }

github地址:高斯模糊 Github地址文章来源地址https://www.toymoban.com/news/detail-859080.html

到了这里,关于Unity背景模糊图片高斯模糊高性能的实现方案的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Kafka是如何实现高性能IO

    ​ 批量处理是一种非常有效的提升系统吞吐量的方法。在 Kafka 内部,消息都是以“批”为单位处理的。一批消息从发送端到接收端,是如何在 Kafka 中流转的呢? Kafka 的 Producer 只提供了单条发送的 send() 方法,并没有提供任何批量发送的接口。 kafka 根本就没有提供单条发送

    2024年02月11日
    浏览(34)
  • 通过Span实现高性能数组,实例解析

    SpanT 是 C# 7.2 引入的一个强大的数据结构,用于表示内存中的一块连续数据。它可以用于实现高性能的数组操作,而无需额外的内存分配。在本文中,我将详细介绍如何使用 SpanT 来实现高性能数组操作,并提供一些示例代码来说明其用法。 SpanT 是 System.Memory 命名空间中的结构

    2024年02月05日
    浏览(43)
  • Docker与Kafka:实现高性能流处理

    Docker 和 Kafka 都是现代技术中的重要组成部分,它们各自在不同领域发挥着重要作用。Docker 是一个开源的应用容器引擎,用于自动化部署、创建、运行和管理应用程序。Kafka 是一个分布式流处理平台,用于构建实时数据流管道和流处理应用程序。 在大数据和实时数据处理领域

    2024年02月20日
    浏览(38)
  • 【消息队列】Kafka如何实现高性能IO

    我们直到Kafka是一个自称高性能的消息队列引擎,一般来说对于中间件的设计需要从计算、存储、网络三方面进行下手,而消息从产生到消费,也会经历多个流程,比如在生产者端采用异步同步方式发送,采用高效的压缩算法,高效的序列化方式,以及网络IO等。那么Kafka主要

    2023年04月13日
    浏览(31)
  • uni-app如何实现高性能

    这篇文章主要讲解uni-app如何实现高性能的问题? 什么是uni-app? 简单说一下什么是uni-app,uni-app是继承自vue.js,对vue做了轻度定制,并且实现了完整的组件化开发,并且支持多端发布的一种架构,开发的项目可适配多平台。 过内前端开发的大致分歧  国内前端开发生态现在的

    2024年04月11日
    浏览(26)
  • 【Unity3D热更新】Unity3D 零成本、高性能的C#的热更新框架:HybridCLR

    推荐阅读 CSDN主页 GitHub开源地址 Unity3D插件分享 简书地址 我的个人博客 QQ群:1040082875 大家好,我是佛系工程师 ☆恬静的小魔龙☆ ,不定时更新Unity开发技巧,觉得有用记得一键三连哦。 相信只要做过热更新的小伙伴,都被热更新搞过心态吧。 我有一个小伙伴,本来是面向

    2024年01月16日
    浏览(40)
  • kafka高吞吐、低延时、高性能的实现原理

    作者:源码时代-Raymon老师 Kafka是大数据领域无处不在的消息中间件,目前广泛使用在企业内部的实时数据管道,并帮助企业构建自己的流计算应用程序。Kafka虽然是基于磁盘做的数据存储,但却具有高性能、高吞吐、低延时的特点,其吞吐量动辄几万、几十上百万,这其中的

    2024年02月04日
    浏览(39)
  • C++高性能服务器网络框架设计与实现

    这篇文章将从两个方面来介绍,一个是服务器中的基础的网络通信部件;另外一个是,如何利用这些基础通信部件整合成一个完整的高效的服务器框架。注意:本文以下内容中的客户端是相对概念,指的是连接到当前讨论的服务程序的终端,所以这里的客户端既可能是我们传

    2024年02月04日
    浏览(40)
  • 高性能计算的矩阵乘法优化 - Python + OpenMP实现

    关于上一节读者某些疑问 :为什么你用进程并行不是线程并行? 回答 :由于Python解释器有GIL(全局解释器锁),在单进程的解释器上有线程安全锁,也就是说每次只能一个线程访问解释器,因此Python在语法上的多线程(multithreads)实现是不会提高并行性能的。 这一点和C

    2024年02月15日
    浏览(51)
  • c++代码实现一个高性能内存池(超详细版本)

    写在前面 本文的内存池代码是改编自Nginx的内存池源码,思路几乎一样。由于Nginx源码的变量命名我不喜欢,又没有注释,看得我很难受。想自己写一版容易理解的代码。这应该是全网独一份的超详细版本了(笑~). 应用场景 写内存池的原理之前,按照惯例先说内存池的应用

    2024年02月06日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包