做游戏可能需要有些动态的改变图片效果要求,这些用ps做的很容易,但是耗资源,所以在这里列举几个常用的滤镜算法,效果算是一般,没ps的专业 ~~

#ifdef GL_ES
precision mediump float;
#endif

uniform float Hue; //色相
uniform float Sat; //饱和度
uniform float Lig; //明度
uniform float Bri; //亮度
uniform float mode;
uniform vec2 TextureSize;
uniform vec2 resolution;
uniform vec3 GlowColor;//发光色
uniform float GlowRange;//发光范围
uniform float GlowExpand; //发光强度
uniform vec3  OutlineColor;//描边颜色
uniform float OutlineRange;//描边范围
varying vec4 v_fragmentColor;
varying vec2 v_texCoord;

1.色相/饱和度

if( Hue != 0.0 || Sat !=0.0 || Lig != 0.0 )
        {                                          
           float Cmax, Cmin;                      
           float D;                              
           float H, S, L;                        
            Cmax = max (R, max (G, B));             
            Cmin = min (R, min (G, B));           
            L = (Cmax + Cmin) /2.0;              
           if (Cmax == Cmin)                      
            {                                       
                H =0.0;                           
                S =0.0;                          
            }                                      
           else                                  
            {                                       
                D = Cmax - Cmin;                   
               if (L < 0.5)                      
                {                                 
                    S = D / (Cmax + Cmin);        
                }                                  
               else                               
                {                                  
                    S = D / (2.0 - (Cmax + Cmin));  
                }

if (R == Cmax)                    
                {                                 
                    H = (G - B) / D;              
                }                                  
               else                              
                {                                  
                   if (G == Cmax)                
                    {                             
                        H =2.0 + (B - R) /D;     
                    }                              
                   else                            
                    {                              
                        H =4.0 + (R - G) / D;      
                    }                              
                }                                  
                H = H /6.0;                       
            }                                      
      
            // modify H/S/L values                  
            H += Hue;                               
            S += Sat;                               
            L += Lig;

if (H < 0.0)                           
            {                                      
                H = H +1.0;                       
            }

H = clamp(H,0.0, 1.0);                 
            S = clamp(S,0.0, 1.0);               
            L = clamp(L,0.0, 1.0);

// convert back to RGB                 
           float var_2, var_1;

if (S == 0.0)                                        
            {                                                    
                R = L;                                             
                G = L;                                           
                B = L;                                           
            }                                                      
           else                                                   
            {                                                     
               if ( L < 0.5 )                                    
                {                                                 
                    var_2 = L * (1.0 + S );                       
                }                                                 
               else                                              
                {                                                  
                    var_2 = ( L + S ) - ( S * L );                
                }

var_1 =2.0 * L - var_2;

R = Hue_2_RGB( var_1, var_2, H + (1.0 / 3.0 ) );  
                G = Hue_2_RGB( var_1, var_2, H );                 
                B = Hue_2_RGB( var_1, var_2, H - (1.0 / 3.0 ) );  
            }                                                      
        }                                                         
       if ( Bri != 0.0 )                                         
        {                                                          
           if ( Bri > 0.0 )                                      
            {                                                     
                R = R + (255.0 - R) /255.0 * Bri;                 
                G = G + (255.0 - G) /255.0 * Bri;                 
                B = B + (255.0 - B) /255.0 * Bri;               
            }                                                     
           else                                                  
            {                                                    
                R = R + R /255.0 * Bri;                          
                G = G + G /255.0 * Bri;                           
                B = B + B /255.0 * Bri;                           
            }                                                    
        }

2.描边

float radius=0.005;

normal = texture2D(jjxx, vec2(jjv_texCoord.x, jjv_texCoord.y));
   accum += texture2D(jjxx, vec2(jjv_texCoord.x - radius, jjv_texCoord.y - radius));
    accum += texture2D(jjxx, vec2(jjv_texCoord.x + radius, jjv_texCoord.y - radius));
    accum += texture2D(jjxx, vec2(jjv_texCoord.x + radius, jjv_texCoord.y + radius));
    accum += texture2D(jjxx, vec2(jjv_texCoord.x - radius, jjv_texCoord.y + radius));
   
    accum *=1.0;
    accum.rgb =  vec3(1,1,0) * accum.a;
    //accum.a = 1;
    normal = ( accum * (1.0 - normal.a)) + (normal * normal.a);
    gl_FragColor =normal;

3.外发光

float samplerPre = 2.0;                                                                                                    
           float radiusX = 1.0 / TextureSize.x;                                                                                       
           float radiusY = 1.0 / TextureSize.y;                                                                                      
           float glowAlpha = 0.0;                                                                                                    
           float count = 0.0;                                                                                                        
           for( float i = -GlowRange ; i <= GlowRange ; i += samplerPre )                                                            
            {                                                                                                                         
               for( float j = -GlowRange ; j <= GlowRange ; j += samplerPre )                                                        
                {                                                                                                                     
                    vec2 samplerTexCoord = vec2( v_texCoord.x + j * radiusX , v_texCoord.y + i * radiusY );                           
                   if( samplerTexCoord.x < 0.0 || samplerTexCoord.x > 1.0 || samplerTexCoord.y <0.0 || samplerTexCoord.y > 1.0 )     
                        glowAlpha +=0.0;                                                                                              
                   else            
                        glowAlpha += texture2D( CC_Texture0, samplerTexCoord ).a;     
                    count +=1.0;                                                                                                      
                }                                                                                                                     
            }                                                                                                                          
            glowAlpha/= (count+500);
            R = GlowColor.r;                                                                                                          
            G = GlowColor.g;                                                                                                           
            B = GlowColor.b;                                                                                                         
            A = glowAlpha *GlowExpand;

描边和外发光主要是滤波算法取附近的颜色算平均色,描边是在颜色alpha为0,也就是没有颜色的时候取附近的颜色,如果附近有颜色,那么就设置为描边色,可以根据alpha算颜色值。外发光,外观上表现为离颜色区域近的发光色多些,远的就慢慢淡了,所以可以根据附近的alpha总和取平均值计算透明度,这样运行的效果有发光的表现,但是与ps的发光效果相比还有一定差距,这个需要更好的完善发光算法吧。~

发光效果图:

色相效果图:

ps 色相/饱和度,描边,外发光算法(opengl)相关推荐

  1. 易语言 调节系统对比度api_一分钟完成色相饱和度!2019最新PS对比度色彩智能调节滤镜来袭...

    大家好,又到了分享的时刻!上期呢给大家分享的PS插件相信大家都已经领取到了!本期了小编继续给大家分享!这次分享的是款堪称傻瓜式的 Photoshop(调节色相插件,因为操作简单不需要基础.它就是Top ...

  2. 在QT框架下进行仿照PS图像调整功能设计(亮度对比度,色相饱和度及明度)

    原文链接:https://blog.csdn.net/maozefa/article/details/4778934 图像亮度调整分为非线性和线性两种方法. 非线性图像亮度是将图像像素的R.G.B分别 ...

  3. 用OpenCV实现Photoshop算法(七): 调整色相饱和度

    系列文章: 用OpenCV实现Photoshop算法(一): 图像旋转 用OpenCV实现Photoshop算法(二): 图像剪切 用OpenCV实现Photoshop算法(三): 曲线调整 用Ope ...

  4. C++实现Photoshop色相/饱和度/明度功能

    本文用C++实现Photoshop色相/饱和度/明度功能,界面程序使用BCB6:图片操作采用GDI+.代码也可适用于其它C/C++编译器(可能要稍作修改). 有关Photoshop饱和度调整原理可参见 ...

  5. Opencv-python 色相饱和度(HLS)

    Opencv-python 色相饱和度(HLS) import cv2 as cv import numpy as np# 全局变量 g_hls_h = [] # 图片分量 hls g_hls_l = ...

  6. PHP HSV色相 饱和度 亮度 增强

    PHP HSV色相 饱和度 亮度 增强 在开始之前我们先了解一下什么是HSV HSV 是颜色模型 色调H 用角度度量,取值范围为0°-360°,从红色开始按逆时针方向计算,红色为0°,绿色为120°, ...

  7. html的hsl形式的颜色选择器,hsl() - 色相饱和度明度模式 - css3颜色

    hsl() 版本:CSS3 hsl()函数符被定义为色相-饱和度-明度(Hue-saturation-lightness)模式.HSL 相比 RGB 的优点是更加直观:你可以估算你想要的颜色,然后微调 ...

  8. 修改图片颜色 色相 饱和度 亮度 ColorMatrix

    Android开发中经常会遇到一些简单的图片处理,比如修改图片的颜色,饱和度,亮度等.今天就给大家介绍一下简单的图片处理. 基础知识 颜色的三要素 色调(色相/颜色):物体的颜色: 饱和度(彩度):色 ...

  9. 曲线快捷键,色阶快捷键,曝光度,自然饱和度,色相饱和度,色彩平衡

    ctrl+m  曲线快捷键 ctrl+l    色阶快捷键 曝光度可以调整一下曝光度,减少灰蒙蒙的感觉 自然饱和度可以提亮一下颜色的亮度.自然饱和度中的饱和度对于已经饱和的颜色就不会再进行饱和.色相饱 ...

最新文章

  1. 简单介绍.Net性能测试框架Crank的使用方法
  2. windows下使用word2vec训练维基百科中文语料全攻略!(二)
  3. mysql出现error 2003_mysql启动时出现ERROR 2003 (HY000)问题的解决方法
  4. java画方块_[求助]用Swing就画一个方块代码出错了
  5. 用c语言编写linux守护进程
  6. php 开启 pathinfo,Nginx + php-fpm 开启 PATH_INFO 模式
  7. 大麦dw11sa不拆机刷机padavan+breed
  8. Bug系列路径规划算法原理介绍(三)——Tangent BUG算法
  9. 六度短网址服务平台原理
  10. sql server 2016不能全部用到CPU的逻辑核心数的问题
  11. 算符优先算法java实现,算符优先算法
  12. 360浏览器(QQ浏览器 等双核浏览器) 极速 IE 兼容 模式的 兼容问题处理:设置优先使用极速模式 渲染和加载
  13. python--测试使用不同的方式计算位涡平流项的差异
  14. 支持HEVC/H265 RTMP播放的VLC WINDOWS版本
  15. 调焦后焦实现不同距离成像_一次性学全佳能尼康的对焦模式、对焦区域模式等对焦知识!(上)...
  16. linux/windows下基于opc ua协议使用open62541开发客户端-上
  17. #9733;一名“标题党”自我修炼的10…
  18. 复数fft的时间复杂度,如何复数捕获阶段,振幅和频率的FFT的结果?
  19. 深入浅出leveldb之基础知识
  20. linux系统有哪些版本 linux系统哪个版本好用

热门文章

  1. Nexus+Docker私服+GitLab的一些记录
  2. 苹果高通诉讼之争 会成下个苹果VS爱立信吗?
  3. 亚马逊代开店入驻—亚马逊开店需要什么条件亚马逊站点入驻流程和注意事项
  4. 私人牙科诊所管理系统(含源码+论文+答辩PPT等)
  5. Pytorch源码学习之四:torchvision.models.squeezenet
  6. 新的刷脸支付方式掘起手机支付将会終结
  7. Int类型数据的序列化以及反序列化(与Java服务器通讯预热)
  8. 罗技K375s如何切换通道
  9. 【业务理解】数据指标
  10. mAPI软件发布升级版本v1.3.0(测试版)