GLSL实现Image Filter
2008-11-27 13:41
169 查看
图像过滤无论是在作图工具还是特效的实现上都时有运用,这里发一些通常会使用到的图像
过滤着色器供有需要的朋友参考.
备注:这里列出的都是片元着色器,顶点着色器都是一样地简单变换顶点和传递纹理坐标.
高斯过滤 - 常用于进行图像模糊
横向过滤:
const int g_iWeightNumber = 17;
uniform sampler2D g_FilterTexture; // 被过滤纹理
uniform float g_aryWeight[g_iWeightNumber]; // Blur权重数组
uniform vec2 g_aryVerticalOffset[g_iWeightNumber]; // 横向Blur偏移数组
void main()
{
vec4 vec4Sum = vec4(0.0);
for(int i = 0; i < g_iWeightNumber; ++i)
{
vec4Sum += texture2D(g_FilterTexture, gl_TexCoord[0].st + g_aryVerticalOffset[i])*g_aryWeight[i];
}
gl_FragColor = vec4Sum;
}
纵向过滤:
const int g_iWeightNumber = 17;
uniform sampler2D g_FilterTexture; // 被过滤纹理
uniform float g_aryWeight[g_iWeightNumber]; // Blur权重数组
uniform vec2 g_aryHorizontalOffset[g_iWeightNumber]; // 横向Blur偏移数组
void main()
{
vec4 vec4Sum = vec4(0.0);
for(int i = 0; i < g_iWeightNumber; ++i)
{
vec4Sum += texture2D(g_FilterTexture, gl_TexCoord[0].st + g_aryHorizontalOffset[i])*g_aryWeight[i];
}
gl_FragColor = vec4Sum;
}
Mean过滤 - 用于纹理抗锯齿
// Mean kernel
// 1 1 1
// 1 1 1
// 1 1 1
const int g_iWeightNumber = 9;
uniform sampler2D g_FilterTexture; // 被过滤纹理
uniform float g_aryWeight[g_iWeightNumber]; // Blur权重数组
uniform vec2 g_aryOffset[g_iWeightNumber]; // 横向Blur偏移数组
void main()
{
vec4 vec4Sum = vec4(0.0);
if (gl_TexCoord[0].s < 0.495)
{
for(int i = 0; i < g_iWeightNumber; ++i)
{
vec4Sum += texture2D(g_FilterTexture, gl_TexCoord[0].st + g_aryOffset[i])*g_aryWeight[i];
}
}
else if (gl_TexCoord[0].s > 0.505)
{
vec4Sum = texture2D(g_FilterTexture, gl_TexCoord[0].st);
}
else
{
vec4Sum = vec4(1.0, 0.0, 0.0, 1.0);
}
gl_FragColor = vec4Sum;
}
Laplacian过滤 - 用于突显图像轮廓
// Edge detection kernel (Laplacian filter).
// 0 -1 0
// -1 4 -1
// 0 -1 0
const int g_iWeightNumber = 9;
uniform sampler2D g_FilterTexture; // 被过滤纹理
uniform float g_aryWeight[g_iWeightNumber]; // Blur权重数组
uniform vec2 g_aryOffset[g_iWeightNumber]; // 横向Blur偏移数组
void main()
{
vec4 vec4Sum = vec4(0.0);
if (gl_TexCoord[0].s < 0.495)
{
for(int i = 0; i < g_iWeightNumber; ++i)
{
vec4Sum += texture2D(g_FilterTexture, gl_TexCoord[0].st + g_aryOffset[i])*g_aryWeight[i];
}
vec4 vec4BaseColor = texture2D(g_FilterTexture, gl_TexCoord[0].st);
vec4Sum += vec4BaseColor*0.1;
}
else if (gl_TexCoord[0].s > 0.505)
{
vec4Sum = texture2D(g_FilterTexture, gl_TexCoord[0].st);
}
else
{
vec4Sum = vec4(1.0, 0.0, 0.0, 1.0);
}
gl_FragColor = vec4Sum;
}
Emboss过滤 - used to simulate the relief of an image
// Emboss filter
// 2 0 0
// 0 -1 0
// 0 0 -1
const int g_iWeightNumber = 9;
uniform sampler2D g_FilterTexture; // 被过滤纹理
uniform float g_aryWeight[g_iWeightNumber]; // Blur权重数组
uniform vec2 g_aryOffset[g_iWeightNumber]; // 横向Blur偏移数组
void main()
{
vec4 vec4Sum = vec4(0.0);
if (gl_TexCoord[0].s < 0.495)
{
for(int i = 0; i < g_iWeightNumber; ++i)
{
vec4Sum += texture2D(g_FilterTexture, gl_TexCoord[0].st + g_aryOffset[i])*g_aryWeight[i];
}
vec4Sum += 0.5;
}
else if (gl_TexCoord[0].s > 0.505)
{
vec4Sum = texture2D(g_FilterTexture, gl_TexCoord[0].st);
}
else
{
vec4Sum = vec4(1.0, 0.0, 0.0, 1.0);
}
gl_FragColor = vec4Sum;
}
Sharpness过滤 - 突显图像的细节
// Sharpness filter
// -1 -1 -1
// -1 9 -1
// -1 -1 -1
const int g_iWeightNumber = 9;
uniform sampler2D g_FilterTexture; // 被过滤纹理
uniform float g_aryWeight[g_iWeightNumber]; // Blur权重数组
uniform vec2 g_aryOffset[g_iWeightNumber]; // 横向Blur偏移数组
void main()
{
vec4 vec4Sum = vec4(0.0);
if (gl_TexCoord[0].s < 0.495)
{
for(int i = 0; i < g_iWeightNumber; ++i)
{
vec4Sum += texture2D(g_FilterTexture, gl_TexCoord[0].st + g_aryOffset[i])*g_aryWeight[i];
}
}
else if (gl_TexCoord[0].s > 0.505)
{
vec4Sum = texture2D(g_FilterTexture, gl_TexCoord[0].st);
}
else
{
vec4Sum = vec4(1.0, 0.0, 0.0, 1.0);
}
gl_FragColor = vec4Sum;
}
Demo效果截图:
exe文件:http://www.fileupyours.com/view/219112/GLSL/Image%20Filter%20Demo.rar
过滤着色器供有需要的朋友参考.
备注:这里列出的都是片元着色器,顶点着色器都是一样地简单变换顶点和传递纹理坐标.
高斯过滤 - 常用于进行图像模糊
横向过滤:
const int g_iWeightNumber = 17;
uniform sampler2D g_FilterTexture; // 被过滤纹理
uniform float g_aryWeight[g_iWeightNumber]; // Blur权重数组
uniform vec2 g_aryVerticalOffset[g_iWeightNumber]; // 横向Blur偏移数组
void main()
{
vec4 vec4Sum = vec4(0.0);
for(int i = 0; i < g_iWeightNumber; ++i)
{
vec4Sum += texture2D(g_FilterTexture, gl_TexCoord[0].st + g_aryVerticalOffset[i])*g_aryWeight[i];
}
gl_FragColor = vec4Sum;
}
纵向过滤:
const int g_iWeightNumber = 17;
uniform sampler2D g_FilterTexture; // 被过滤纹理
uniform float g_aryWeight[g_iWeightNumber]; // Blur权重数组
uniform vec2 g_aryHorizontalOffset[g_iWeightNumber]; // 横向Blur偏移数组
void main()
{
vec4 vec4Sum = vec4(0.0);
for(int i = 0; i < g_iWeightNumber; ++i)
{
vec4Sum += texture2D(g_FilterTexture, gl_TexCoord[0].st + g_aryHorizontalOffset[i])*g_aryWeight[i];
}
gl_FragColor = vec4Sum;
}
Mean过滤 - 用于纹理抗锯齿
// Mean kernel
// 1 1 1
// 1 1 1
// 1 1 1
const int g_iWeightNumber = 9;
uniform sampler2D g_FilterTexture; // 被过滤纹理
uniform float g_aryWeight[g_iWeightNumber]; // Blur权重数组
uniform vec2 g_aryOffset[g_iWeightNumber]; // 横向Blur偏移数组
void main()
{
vec4 vec4Sum = vec4(0.0);
if (gl_TexCoord[0].s < 0.495)
{
for(int i = 0; i < g_iWeightNumber; ++i)
{
vec4Sum += texture2D(g_FilterTexture, gl_TexCoord[0].st + g_aryOffset[i])*g_aryWeight[i];
}
}
else if (gl_TexCoord[0].s > 0.505)
{
vec4Sum = texture2D(g_FilterTexture, gl_TexCoord[0].st);
}
else
{
vec4Sum = vec4(1.0, 0.0, 0.0, 1.0);
}
gl_FragColor = vec4Sum;
}
Laplacian过滤 - 用于突显图像轮廓
// Edge detection kernel (Laplacian filter).
// 0 -1 0
// -1 4 -1
// 0 -1 0
const int g_iWeightNumber = 9;
uniform sampler2D g_FilterTexture; // 被过滤纹理
uniform float g_aryWeight[g_iWeightNumber]; // Blur权重数组
uniform vec2 g_aryOffset[g_iWeightNumber]; // 横向Blur偏移数组
void main()
{
vec4 vec4Sum = vec4(0.0);
if (gl_TexCoord[0].s < 0.495)
{
for(int i = 0; i < g_iWeightNumber; ++i)
{
vec4Sum += texture2D(g_FilterTexture, gl_TexCoord[0].st + g_aryOffset[i])*g_aryWeight[i];
}
vec4 vec4BaseColor = texture2D(g_FilterTexture, gl_TexCoord[0].st);
vec4Sum += vec4BaseColor*0.1;
}
else if (gl_TexCoord[0].s > 0.505)
{
vec4Sum = texture2D(g_FilterTexture, gl_TexCoord[0].st);
}
else
{
vec4Sum = vec4(1.0, 0.0, 0.0, 1.0);
}
gl_FragColor = vec4Sum;
}
Emboss过滤 - used to simulate the relief of an image
// Emboss filter
// 2 0 0
// 0 -1 0
// 0 0 -1
const int g_iWeightNumber = 9;
uniform sampler2D g_FilterTexture; // 被过滤纹理
uniform float g_aryWeight[g_iWeightNumber]; // Blur权重数组
uniform vec2 g_aryOffset[g_iWeightNumber]; // 横向Blur偏移数组
void main()
{
vec4 vec4Sum = vec4(0.0);
if (gl_TexCoord[0].s < 0.495)
{
for(int i = 0; i < g_iWeightNumber; ++i)
{
vec4Sum += texture2D(g_FilterTexture, gl_TexCoord[0].st + g_aryOffset[i])*g_aryWeight[i];
}
vec4Sum += 0.5;
}
else if (gl_TexCoord[0].s > 0.505)
{
vec4Sum = texture2D(g_FilterTexture, gl_TexCoord[0].st);
}
else
{
vec4Sum = vec4(1.0, 0.0, 0.0, 1.0);
}
gl_FragColor = vec4Sum;
}
Sharpness过滤 - 突显图像的细节
// Sharpness filter
// -1 -1 -1
// -1 9 -1
// -1 -1 -1
const int g_iWeightNumber = 9;
uniform sampler2D g_FilterTexture; // 被过滤纹理
uniform float g_aryWeight[g_iWeightNumber]; // Blur权重数组
uniform vec2 g_aryOffset[g_iWeightNumber]; // 横向Blur偏移数组
void main()
{
vec4 vec4Sum = vec4(0.0);
if (gl_TexCoord[0].s < 0.495)
{
for(int i = 0; i < g_iWeightNumber; ++i)
{
vec4Sum += texture2D(g_FilterTexture, gl_TexCoord[0].st + g_aryOffset[i])*g_aryWeight[i];
}
}
else if (gl_TexCoord[0].s > 0.505)
{
vec4Sum = texture2D(g_FilterTexture, gl_TexCoord[0].st);
}
else
{
vec4Sum = vec4(1.0, 0.0, 0.0, 1.0);
}
gl_FragColor = vec4Sum;
}
Demo效果截图:
exe文件:http://www.fileupyours.com/view/219112/GLSL/Image%20Filter%20Demo.rar
相关文章推荐
- GPUImage中亮度调整的实现——GPUImageBrightnessFilter
- Shader特效——“Kuwahara Filter”的实现 【OpenCV】【GLSL】
- android ImageView实现变暗效果(使用setColorFilter滤镜)
- GPUImageTransformFilter实现3D旋转
- nginx+fastdfs+image_filter 实现实时缩略图
- GPUImage中曝光滤镜实现——GPUImageExposureFilter
- GPUImage中饱和度调整的实现——GPUImageSaturationFilter
- Nginx + image_filter_module + fastdfs实现上传图片的实时缩略图预览
- GPUImage中对比度调整的实现——GPUImageContrastFilter
- 利用BlurMaskFilter实现具有阴影效果的Imageview
- Android实现ImageView加边框
- OpenCV导向滤波(引导滤波)实现(Guided Filter)代码,以及使用颜色先验算法去雾
- html{filter:expression(document.execCommand("BackgroundImageCache",false,true)
- IOS SDWebImage实现原理详解
- ImageView里面的图片实现同时移动缩放旋转 photoView自定义
- itk::VTKImageToImageFilter使用问题
- iOS直播app——GPUImage渲染底层实现
- 使用RGBa和Filter实现不影响子元素的CSS透明背景
- [类库升级,实现逐帧截图]GenerateFrameImage-Lib新的解决方案
- Android ImageView的拖拽实现