cocos中如何让背景模糊_Cocos Creator Shader Effect 系列 - 8 - 高斯模糊

本文介绍了如何在Cocos Creator中实现高斯模糊效果,通过复习高斯模糊原理,详细阐述了如何计算像素点的模糊值,并探讨了性能考虑及优化方案。
摘要由CSDN通过智能技术生成

本章为大家带来高斯模糊的实现

2d-sprite-gaussian-blur-v1

首先,来点简单的,比如:高斯模糊的英文名叫 Gaussian Blur。

关于高斯模糊的原理,在我学习过程中,下面两篇文章是我觉得最能通俗易懂的介绍其工作原理的

十分建议先阅读以上文章,对高斯模糊有个认识。

一、 高斯模糊复习

阅读完高斯模糊,我自己的简单理解,一个像素点要计算出其模糊后的值,那么要执行下面几步:

采样周边像素值

根据被采样像素点和当前点的距离,计算出对应的权重值

求出周边像素值的加权平均值

当然,这里面有两个问题:

Q1:什么才是周边像素值?

A1:这个范围可以很大,比如周边就是全图,每计算一个点,都要收集全图像素点参与计算。也可以很小,只收集某个范围内的像素点,那么选哪个呢?

Q2:权重值怎么定义?

A2:高斯模糊实际上也叫高斯分布,不同距离的采用的加权值,实际是按照高斯分布(也叫正态分布)去计算的:

正态分布,来自百度百科图片

从上图,我们可以知道,大于 3σ(σ读标准差,英文术语 Stdev) 距离之外的点就几乎可以忽略,可以不参与模糊计算。而这一点在之前的 维基百科引文 中

好的,以下是一个简单的高斯模糊shader实现代码,基于cocos creator2.4: 首先,创建一个新的材质文件,将其命名为`blur.material`,然后将以下代码复制到文件: ``` Shader "Custom/Blur" { Properties { _MainTex ("Texture", 2D) = "white" {} _BlurSize ("Blur Size", Range(0.0, 10.0)) = 1.0 } SubShader { Tags { "RenderType"="Opaque" } LOD 100 Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; }; struct v2f { float2 uv : TEXCOORD0; float4 vertex : SV_POSITION; }; sampler2D _MainTex; float _BlurSize; float2 _ScreenSize; v2f vert (appdata v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); o.uv = v.uv; return o; } float4 frag (v2f i) : SV_Target { float2 texelSize = 1.0 / _ScreenSize; float2 blurMultiplyVec = float2(_BlurSize * texelSize.x, _BlurSize * texelSize.y); float4 sum = float4(0.0f, 0.0f, 0.0f, 0.0f); sum += tex2D(_MainTex, i.uv + float2(-blurMultiplyVec.x, -blurMultiplyVec.y)) * 0.0625; sum += tex2D(_MainTex, i.uv + float2(-blurMultiplyVec.x, blurMultiplyVec.y)) * 0.125; sum += tex2D(_MainTex, i.uv + float2( blurMultiplyVec.x, -blurMultiplyVec.y)) * 0.125; sum += tex2D(_MainTex, i.uv + float2( blurMultiplyVec.x, blurMultiplyVec.y)) * 0.25; sum += tex2D(_MainTex, i.uv) * 0.375; return sum; } ENDCG } } } ``` 然后,将该材质文件应用到需要模糊的Sprite或Node上。 最后,需要在代码设置一些参数,以便正确地渲染模糊效果。下面是一个简单的例子: ```javascript let sprite = cc.find("Canvas/Sprite").getComponent(cc.Sprite); let material = cc.Material.createWithBuiltin(cc.Material.BUILTIN_NAME.SPRITE); material.setProperty('texture', sprite.spriteFrame.getTexture()); material.setProperty('blurSize', 4.0); sprite.setMaterial(0, material); ``` 在这个例子,我们获取了场景名为“Sprite”的Sprite组件,创建了一个新的材质,并将其应用于Sprite上。我们还设置了材质的模糊大小属性为4.0。 希望这能够帮助你实现一个简单的高斯模糊shader
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值