V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
liuliupet
V2EX  ›  程序员

分享一个我厂 iOS 程序员写的水纹滤镜源码

  •  
  •   liuliupet · 2015-04-01 17:30:05 +08:00 · 5449 次点击
    这是一个创建于 3506 天前的主题,其中的信息可能已经有所发展或是发生改变。
    17 条回复    2015-04-21 14:32:33 +08:00
    wzyuliyang
        1
    wzyuliyang  
       2015-04-01 18:35:59 +08:00
    GPU?????
    kepenj
        2
    kepenj  
       2015-04-01 19:12:31 +08:00
    感谢分享
    sincway
        3
    sincway  
       2015-04-01 19:29:12 +08:00
    看起来很不错的样子
    PP
        4
    PP  
       2015-04-01 20:42:16 +08:00 via iPad   ❤️ 1
    好逼真,我还以为我的屏幕出了问题。
    liuliupet
        5
    liuliupet  
    OP
       2015-04-01 21:10:15 +08:00
    @wzyuliyang OpenGLES
    liuliupet
        6
    liuliupet  
    OP
       2015-04-01 21:12:52 +08:00
    @sincway 在准备做一个哈哈镜的App
    sumhat
        7
    sumhat  
       2015-04-01 21:15:24 +08:00
    目测源码里有一堆 double 型常量,你们厂只能祈祷那个程序员不要离职了....
    lzsadam
        8
    lzsadam  
       2015-04-01 21:31:04 +08:00
    猛一看还以为阿森纳有iOS程序员。
    zhangchioulin
        9
    zhangchioulin  
       2015-04-01 21:40:53 +08:00
    好逼真!!
    sophymax
        10
    sophymax  
       2015-04-01 22:59:45 +08:00 via iPad
    那用的是个什么库,GPUImage开头的那一堆?看到这个第一感觉是写的opengl shader,但打眼一看好像没shader文件,只有一堆GPUimagexxxxxx文件
    ryd994
        11
    ryd994  
       2015-04-01 23:35:31 +08:00 via Android
    @sumhat 求问double常量是什么坑?
    sumhat
        12
    sumhat  
       2015-04-01 23:41:30 +08:00   ❤️ 1
    @ryd994 就是形如这样的代码,摘录自楼主的 Github。一点注释都没有,后人完全没办法维护。

    void main()
    {
    vec4 textureColor = texture2D(inputImageTexture, textureCoordinate);
    vec4 textureColor2 = texture2D(inputImageTexture2, textureCoordinate2);

    float maskY = 0.2989 * colorToReplace.r + 0.5866 * colorToReplace.g + 0.1145 * colorToReplace.b;
    float maskCr = 0.7132 * (colorToReplace.r - maskY);
    float maskCb = 0.5647 * (colorToReplace.b - maskY);

    float Y = 0.2989 * textureColor.r + 0.5866 * textureColor.g + 0.1145 * textureColor.b;
    float Cr = 0.7132 * (textureColor.r - Y);
    float Cb = 0.5647 * (textureColor.b - Y);

    // float blendValue = 1.0 - smoothstep(thresholdSensitivity - smoothing, thresholdSensitivity , abs(Cr - maskCr) + abs(Cb - maskCb));
    float blendValue = 1.0 - smoothstep(thresholdSensitivity, thresholdSensitivity + smoothing, distance(vec2(Cr, Cb), vec2(maskCr, maskCb)));
    gl_FragColor = mix(textureColor, textureColor2, blendValue);
    }
    theoractice
        13
    theoractice  
       2015-04-02 01:41:40 +08:00   ❤️ 1
    liyonghelpme
        14
    liyonghelpme  
       2015-04-02 09:18:12 +08:00
    学shader 上这个网站哈哈 有一起玩得同学没 https://www.shadertoy.com/
    magicianzrh
        15
    magicianzrh  
       2015-04-02 09:56:04 +08:00
    kepenj
        16
    kepenj  
       2015-04-02 13:28:13 +08:00
    theoractice
        17
    theoractice  
       2015-04-21 14:32:33 +08:00
    @sumhat 那些常量是色彩空间转换公式里用到的。RGB转灰度时也会用到类似的常量。
    科学家研究的结果,不需要改~
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3023 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 00:33 · PVG 08:33 · LAX 16:33 · JFK 19:33
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.