• glsl shader简明教程系列1


    glsl shader简明教程系列1 

    底层的东西我就不说了(自己去百度翻基础教程)  我直接说上层了(片段着色器)

     web编辑器还在开发中 有了编辑器 到时候可以把代码复制上去可以看到效果了  

    1  实现图片变灰(需要注意 shader是强类型语言 注意类型一致)

    void main () {
    // 这个变量c就是图片每个像素的 颜色值
    vec4 c = vec4(1,1,1,1) * texture2D(texture, uv0);
    
    //下面是变灰算法 只要明白这个算法能变灰就行 
    float clrbright = (c.r + c.g + c.b) * (1. / 3.);
    float gray = (0.6) * clrbright;
    
    //给图片每个像素重新赋值颜色值
    gl_FragColor = vec4(gray, gray, gray, c.a);
    }

    2 图片变亮效果

      vec4 dim(vec4 col, float factor) {
        return vec4(col.r * factor, col.g * factor, col.b * factor, col.a);
      }
     
    
    void main () {
         // 这个变量c就是图片每个像素的 颜色值
         vec4 c = vec4(1,1,1,1) * texture2D(texture, uv0);
          // 提高亮度(dim第二个参数 设置1以上提高亮度 1以下降低亮度  这些都是颜色算法 不用深究明白有什么作用就行
        vec4 blurred_image = dim(c,1.6);
     //给图片每个像素重新赋值颜色值
         gl_FragColor = vec4(blurred_image);
    
    
    
      }

    3 图片变模糊

     #define repeats 5.
      #define num 0.02
     // 随机值
    float rand(vec2 co){
        return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453);
    }
    // 应用贴图UV
    vec4 draw(vec2 uv) {
        return  texture2D(texture,uv).rgba; 
    }
    
    void main () {
        // 模糊贴图(下面都是模糊算法 不用细看 直接搬过来用就行)
        vec4 blurred_image = vec4(0.);
          // 重复采样
        for (float i = 0.; i < repeats; i++) { 
          // 第一采样点
            vec2 q = vec2(cos(degrees((i/repeats)*360.)),sin(degrees((i/repeats)*360.))) * (rand(vec2(i,uv0.x+uv0.y))+num); 
            vec2 uv2 = uv0+(q*num);
            blurred_image += draw(uv2)/2.;
            
            // 第二采样点
            q = vec2(cos(degrees((i/repeats)*360.)),sin(degrees((i/repeats)*360.))) * (rand(vec2(i+2.,uv0.x+uv0.y+24.))+num); 
            uv2 = uv0+(q*num);
            blurred_image += draw(uv2)/2.;
        }
          // 中和
        blurred_image /= repeats;
        // 给图片每个像素重新赋值颜色值
        gl_FragColor = vec4(blurred_image);
    
    
    
      }

    接下来说下圆形mask做法

    vec4 drawCircle() {
        float dis = 0.0;
        //uv 代表贴图的uv坐标 默认左下角为00点
        vec2 uv = uv0;
             
             //
            dis = distance( uv, vec2(0.5, 0.5) );
         
         
          vec4 color;
           // 这个变量c就是图片每个像素的 颜色值
            vec4 c = vec4(1,1,1,1)* texture2D(texture,uv);
            //判断如果是半径内 就显示 半径外 就隐藏
            if(dis <= 0.5)
              {
                  color = c;
               }
               else{
                // 隐藏不要的部分
                 color = vec4(c.rgb,0.); 
              }
      
        return  color; 
    }
    
    
    void main () {
        vec4 color = drawCircle();
          gl_FragColor = color;
    }

     如果边缘要弄羽化效果 那就在边缘加点0到1 的透明度过度

    smoothstep(a, b, x) 可以用来生成0到1的平滑过渡.

    如果x小于a,返回 0。

    如果x大于b,返回 1。

    如果a<x<b  返回0~1

  • 相关阅读:
    快速导出B站收藏单节目列表
    打包Python程序
    PHP应用日志记录
    这几天折腾win10访问deepin共享的历程
    PHP更新本地公网IP到阿里云域名解析,实现DDNS
    PHP.ini 能不能加载子配置文件 ?
    PHP处理表单数据的一个安全回顾(记录教训)
    不用U盘,用一台好电脑给另一个电脑重装windows10
    方正 ignb路由器设置备份(自用笔记)
    Xiuno BBS 4.0 修改时间显示
  • 原文地址:https://www.cnblogs.com/newmiracle/p/11882437.html
Copyright © 2020-2023  润新知