OpenGL-滤镜效果

滤镜实际上就是在片元着色器对特定的像素点进行处理。 灰度滤镜 灰度滤镜原理:
  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-f5d84d-1562738010891-2)]

<figcaption></figcaption>

暖色滤镜 思路:

  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-812367-1562738010890-1)]

<figcaption></figcaption>

冷色滤镜 思路:

  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-be6e65-1562738010889-0)]

<figcaption></figcaption>

颠倒滤镜 思路:

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

作者:聪莞
链接:https://juejin.im/post/5d22f34fe51d45775c73dd60
此文章来源于第三方转载!!

小编这呢,给大家推荐一个优秀的iOS交流平台,平台里的伙伴们都是非常优秀的iOS开发人员,我们专注于技术的分享与技巧的交流,大家可以在平台上讨论技术,交流学习。欢迎大家的加入(想要进入的可加小编微信)。
18173184023

全部评论

相关推荐

鱼专:你没有问题,有问题的是java市场,我有实习经历都捞不到实习,走一步看一步吧
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务