普通模糊,动感模糊,高斯模糊算法实现
来源:互联网 发布:年会礼品 知乎 编辑:程序博客网 时间:2024/05/16 01:47
模糊算法在实际应用中经常回碰到,这里总结下几种模糊算法,以便将来的需要。
#ifdef GL_ES
precision mediump float;
#endif
uniform float mode;//0普通模糊 1高斯模糊 2动感模糊
uniform vec2 resolution;
uniform float GlowRange; //模糊半径
uniform float GlowExpand; //动感模糊角度
varying vec4 v_fragmentColor;
varying vec2 v_texCoord;
void main()
{
vec4 clraverge=vec4(0,0,0,0);
if( GlowRange > 0.0 )
{
if(mode==2)
{
float samplerPre =1;
float range=GlowRange*3;
float rad=GlowExpand;
for( float j = 1; j<=range ; j += samplerPre )
{
float dx=0.002*cos(rad);
float dy=0.002*sin(rad);
vec2 samplerTexCoord = vec2( v_texCoord.x + j*dx, v_texCoord.y+j*dy );
vec2 samplerTexCoord1= vec2( v_texCoord.x - j*dx,v_texCoord.y-j*dy);
if( samplerTexCoord.x < 0.0 || samplerTexCoord.x > 1.0 ||samplerTexCoord1.x < 0.0 || samplerTexCoord1.x > 1.0||
samplerTexCoord.y < 0.0 || samplerTexCoord.y > 1.0 ||samplerTexCoord1.y < 0.0 || samplerTexCoord1.y > 1.0)
{
continue;
}
vec4 tc= texture2D( CC_Texture0, samplerTexCoord );
vec4 tc1= texture2D( CC_Texture0, samplerTexCoord1 );
clraverge+=tc;
clraverge+=tc1;
}
clraverge/=(range*2);
}
else{
float samplerPre = 3.0;
float radiusX = 1.0 / TextureSize.x;
float radiusY = 1.0 / TextureSize.y;
float count = 0.0;
float range=GlowRange*2.0;
for( float i = -range ; i <= range ; i += samplerPre )
{
for( float j = -range ; j <= range ; j += samplerPre )
{
float nx=j;
float ny=i;
float q=range/1.75;
float gr=(1.0/(2*3.14159*q*q))*exp(-(nx*nx+ny*ny)/(2*q*q))*9.0;
vec2 samplerTexCoord = vec2( v_texCoord.x + j * radiusX , v_texCoord.y + i * radiusY );
if( samplerTexCoord.x < 0.0)
samplerTexCoord.x=-samplerTexCoord.x;
else if(samplerTexCoord.x > 1.0)
samplerTexCoord.x =2-samplerTexCoord.x;
if(samplerTexCoord.y < 0.0)
samplerTexCoord.y=-samplerTexCoord.y;
else if(samplerTexCoord.y > 1.0)
samplerTexCoord.y =2-samplerTexCoord.y;
vec4 tc= texture2D( CC_Texture0, samplerTexCoord );
if(mode==0)
clraverge+=tc;
else if(mode==1)
clraverge+=tc*gr;
count+=1;
}
}
if(mode==0)
clraverge/=count;
}
}
gl_FragColor =clraverge;
}
普通模糊就是取附近一定范围的颜色平均值,高斯模糊是取加权平均值,动感模糊就是将一条直线的附近颜色取平均值,glsl代码在上面已经贴出,实际应用只要设置相应参数就ok了
原图:
普通模糊:
高斯模糊:
动感模糊:
- 普通模糊,动感模糊,高斯模糊算法实现
- 高斯模糊算法
- 高斯模糊算法
- 高斯模糊算法
- 高斯模糊算法
- 高斯模糊算法
- 高斯模糊算法
- 实现高斯模糊
- 实现图片模糊,高斯模糊
- 高斯模糊算法的 C++ 实现
- UIImageview 模糊、高斯模糊
- 均值模糊 高斯模糊
- 高斯模糊的算法
- 高斯模糊的算法
- 快速高斯模糊算法
- 高斯模糊的算法
- 高斯模糊的算法
- 高斯模糊的算法
- CODEVS-1531 山峰
- 王帅:深入PHP内核(二)——SAPI探究
- MVC模型
- Ural1089(字符串处理)
- Unity3D里面的JavaScript和浏览器的JavaScript的大致区别
- 普通模糊,动感模糊,高斯模糊算法实现
- PHP相关系列 - 优化你的PHP代码
- 用Bundle和直接用Intent.putExtra("xx",yy)传递有什么不同
- 使用 OpenSSL API 进行安全编程,第 2 部分: 安全握手
- ios&java 常用加密(二)单向加密
- "The Civil War in France" translation05
- Java语言基本语法
- 算法笔记五:利用堆结构来对数据进行排序
- ANDROID音频系统散记之四:4.0音频系统HAL初探