IOS OpenGL ES GPUImage 图像叠加 GPUImageOverlayBlendFilter

打印 上一主题 下一主题

主题 897|帖子 897|积分 2691

目录
零基础 OpenGL (ES) 学习路线推荐 : OpenGL (ES) 学习目录 >> OpenGL ES 基础
零基础 OpenGL (ES) 学习路线推荐 : OpenGL (ES) 学习目录 >> OpenGL ES 转场
零基础 OpenGL (ES) 学习路线推荐 : OpenGL (ES) 学习目录 >> OpenGL ES 特效
零基础 OpenGL (ES) 学习路线推荐 : OpenGL (ES) 学习目录 >> OpenGL ES 函数
零基础 OpenGL (ES) 学习路线推荐 : OpenGL (ES) 学习目录 >> OpenGL ES GPUImage 使用
零基础 OpenGL (ES) 学习路线推荐 : OpenGL (ES) 学习目录 >> OpenGL ES GLSL 编程
一.简介

GPUImage 共 125 个滤镜, 分为四类
1、Color adjustments : 31 filters , 颜色处理相关
2、Image processing : 40 filters , 图像处理相关.
3、Blending modes : 29 filters , 混合模式相关.
4、Visual effects : 25 filters , 视觉效果相关.
GPUImageOverlayBlendFilter 属于 GPUImage 图像混合模式相关,用于图像叠加。shader 源码如下:
  1. /******************************************************************************************/
  2. //@Author:猿说编程
  3. //@Blog(个人博客地址): www.codersrc.com
  4. //@File:IOS – OpenGL ES GPUImage GPUImageOverlayBlendFilter
  5. //@Time:2022/07/02 06:30
  6. //@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
  7. /******************************************************************************************/
  8. #if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE
  9. NSString *const kGPUImageOverlayBlendFragmentShaderString = SHADER_STRING
  10. (
  11. varying highp vec2 textureCoordinate;
  12. varying highp vec2 textureCoordinate2;
  13. uniform sampler2D inputImageTexture;
  14. uniform sampler2D inputImageTexture2;
  15. void main()
  16. {
  17.      mediump vec4 base = texture2D(inputImageTexture, textureCoordinate);
  18.      mediump vec4 overlay = texture2D(inputImageTexture2, textureCoordinate2);
  19.      mediump float ra;
  20.      if (2.0 * base.r < base.a) {
  21.          ra = 2.0 * overlay.r * base.r + overlay.r * (1.0 - base.a) + base.r * (1.0 - overlay.a);
  22.      } else {
  23.          ra = overlay.a * base.a - 2.0 * (base.a - base.r) * (overlay.a - overlay.r) + overlay.r * (1.0 - base.a) + base.r * (1.0 - overlay.a);
  24.      }
  25.      mediump float ga;
  26.      if (2.0 * base.g < base.a) {
  27.          ga = 2.0 * overlay.g * base.g + overlay.g * (1.0 - base.a) + base.g * (1.0 - overlay.a);
  28.      } else {
  29.          ga = overlay.a * base.a - 2.0 * (base.a - base.g) * (overlay.a - overlay.g) + overlay.g * (1.0 - base.a) + base.g * (1.0 - overlay.a);
  30.      }
  31.      mediump float ba;
  32.      if (2.0 * base.b < base.a) {
  33.          ba = 2.0 * overlay.b * base.b + overlay.b * (1.0 - base.a) + base.b * (1.0 - overlay.a);
  34.      } else {
  35.          ba = overlay.a * base.a - 2.0 * (base.a - base.b) * (overlay.a - overlay.b) + overlay.b * (1.0 - base.a) + base.b * (1.0 - overlay.a);
  36.      }
  37.      gl_FragColor = vec4(ra, ga, ba, 1.0);
  38. }
  39. );
  40. #else
  41. NSString *const kGPUImageOverlayBlendFragmentShaderString = SHADER_STRING
  42. (
  43. varying vec2 textureCoordinate;
  44. varying vec2 textureCoordinate2;
  45. uniform sampler2D inputImageTexture;
  46. uniform sampler2D inputImageTexture2;
  47. void main()
  48. {
  49.      vec4 base = texture2D(inputImageTexture, textureCoordinate);
  50.      vec4 overlay = texture2D(inputImageTexture2, textureCoordinate2);
  51.      float ra;
  52.      if (2.0 * base.r < base.a) {
  53.          ra = 2.0 * overlay.r * base.r + overlay.r * (1.0 - base.a) + base.r * (1.0 - overlay.a);
  54.      } else {
  55.          ra = overlay.a * base.a - 2.0 * (base.a - base.r) * (overlay.a - overlay.r) + overlay.r * (1.0 - base.a) + base.r * (1.0 - overlay.a);
  56.      }
  57.      float ga;
  58.      if (2.0 * base.g < base.a) {
  59.          ga = 2.0 * overlay.g * base.g + overlay.g * (1.0 - base.a) + base.g * (1.0 - overlay.a);
  60.      } else {
  61.          ga = overlay.a * base.a - 2.0 * (base.a - base.g) * (overlay.a - overlay.g) + overlay.g * (1.0 - base.a) + base.g * (1.0 - overlay.a);
  62.      }
  63.      float ba;
  64.      if (2.0 * base.b < base.a) {
  65.          ba = 2.0 * overlay.b * base.b + overlay.b * (1.0 - base.a) + base.b * (1.0 - overlay.a);
  66.      } else {
  67.          ba = overlay.a * base.a - 2.0 * (base.a - base.b) * (overlay.a - overlay.b) + overlay.b * (1.0 - base.a) + base.b * (1.0 - overlay.a);
  68.      }
  69.      gl_FragColor = vec4(ra, ga, ba, 1.0);
  70. }
  71. );
  72. #endif
复制代码
二.效果演示

使用 GPUImageOverlayBlendFilter**,**源图和目标图如下:


使用 GPUImageOverlayBlendFilter 效果如下:

三.源码下载

OpenGL ES Demo 下载地址 : IOS OpenGL ES GPUImage 图像叠加 GPUImageOverlayBlendFilter

四.猜你喜欢

本文由博客 - 猿说编程 猿说编程 发布!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

大号在练葵花宝典

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表