OpenGL-滤镜效果(一)

作者: 聪莞 | 来源:发表于2019-06-28 16:51 被阅读4次
滤镜实际上就是在片元着色器对特定的像素点进行处理。

灰度滤镜
灰度滤镜原理:

  1. 浮点算法:Gray = R * 0.3 + G * 0.59 + B * 0.11
  2. 整数算法:Gray = (R30 + G59 + B*11) / 100
  3. 移位算法:Gray = (R76 + G151 + B*28)>>8
  4. 平均值法:Gray = (R+G+B)/3
  5. 仅取绿色:Gray = G

思路:

  1. 获取原始图片的纹素值
  2. 选择合适的灰度算法
  3. 将计算所得赋给gl_FragColor

实例代码

  1. 顶点着色器(滤镜并不需要操作顶点着色器,所以不同滤镜顶点着色器代码一致):
attribute vec4 Position;
attribute vec2 TextureCoords;
varying vec2 TextureCoordsVarying;

void main (void) {
    gl_Position = Position;
    TextureCoordsVarying = TextureCoords;
}
  1. 片元着色器
precision highp float;
uniform sampler2D Texture;
varying vec2 TextureCoordsVarying;

void main (void) {
    
    vec4 mask = texture2D(Texture, TextureCoordsVarying);
}

权值法(各个颜色的权值参考了GPUImage ,也可以用上面的权值)

const highp vec3 W = vec3(0.2125, 0.7154, 0.0721);

void main (void) {
    
    vec4 mask = texture2D(Texture, TextureCoordsVarying);
    float luminance = dot(mask.rgb, W);
    gl_FragColor = vec4(vec3(luminance), 1.0);
}

平均值法:

    float color = (mask.r + mask.g + mask.b) / 3.0;
    vec4 tempColor = vec4(color,color,color,1);
    gl_FragColor = vec4(vec3(tempColor), 1.0);

一般由于人眼对不同颜色的敏感度不一样,所以三种颜色值的权重不一样,一般来说绿色最高,红色其次,蓝色最低,最合理的取值分别为Wr = 30%,Wg = 59%,Wb = 11%,所以权值法相对效果更好一点。


image.png

暖色滤镜
思路:

  1. 获取原始图片的纹素值
  2. 将rgb通道的颜色添加相应的红/绿色值,再作为rgb通道的值,
  3. 将计算所得赋给gl_FragColor
    vec4 mask = texture2D(Texture, TextureCoordsVarying);
    gl_FragColor = mask + vec4(0.3,0.3,0.0,0.0);
image.png

冷色滤镜
思路:

  1. 获取原始图片的纹素值
  2. 将rgb通道的颜色添加相应的蓝色值,再作为rgb通道的值,
  3. 将计算所得赋给gl_FragColor
    vec4 mask = texture2D(Texture, TextureCoordsVarying);
    gl_FragColor = mask + vec4(0.0,0.0,0.3,0.0);
image.png

颠倒滤镜
思路:

  1. 获取原始图片的纹素值
  2. 将纹理坐标做映射 (y -> 1 - y)
  3. 将计算所得赋给gl_FragColor
vec4 color = texture2D(Texture, vec2(TextureCoordsVarying.x, 1.0 - TextureCoordsVarying.y));
image.png

相关文章

  • OpenGL-滤镜效果(二)

    接上篇OpenGL-滤镜效果(一),接着探讨一些滤镜的算法实现。 原图放一张我家宠物怡宝: 旋涡滤镜 图像旋涡主要...

  • OpenGL-滤镜效果(一)

    滤镜实际上就是在片元着色器对特定的像素点进行处理。 灰度滤镜灰度滤镜原理: 浮点算法:Gray = R * 0.3...

  • 滤镜效果

    滤镜效果大家肯定都知道,毕竟现在相机这么牛,一般都有这个功能。不废话,开搞! 所谓滤镜效果,就是对一张图像的颜色进...

  • iOS-GPUImage 本地视频添加滤镜

    本文内容: 1、播放本地视频,实时添加滤镜,修改不同的滤镜效果 2、给本地视频添加滤镜,然后保存有滤镜效果的视频到...

  • OpenGL ES 动态效果滤镜

    这篇文章介绍一下带有动态效果的滤镜,大家可以先了解下 分屏滤镜 和 马赛克滤镜 。 动态效果的滤镜其实就是根据当前...

  • 2020-05-18

    CIFilter 实现滤镜效果 ,苹果给我们提供了将近200中滤镜效果,具体苹果官网及展示效果 CIFilter苹...

  • PhotoShop教程 PS滤镜制作魔幻背景特效

    本教程介绍用PhotoShop滤镜制作魔幻背景特效效果,主要用到滤镜,滤镜主要是用来实现图像的各种特殊效果。 最终...

  • IOS开发图片处理:添加滤镜功能。

    一、滤镜的内容和效果是比较多并且复杂的 ,学习滤镜需要技巧 如下:两个输出语句解决滤镜的属性选择问题:1.查询效果...

  • CoreImage(二)CIFilter滤镜效果使用

    CIFilter滤镜效果使用 CIFilter是使用CoreImage进行滤镜效果的核心类,通过这个类设置(KVC...

  • OpenGL纹理案例-球体世界

    开场白 本文在我之前的文章OpenGL-公转自转demo中的demo为基础,添加纹理。效果图: 简述逻辑 Setu...

网友评论

    本文标题:OpenGL-滤镜效果(一)

    本文链接:https://www.haomeiwen.com/subject/usplcctx.html