OpenGLフィルタ効果(一)

2551 ワード

璣菗33751;33751;フィルタは、実際にはパッチ・カラーライターで特定の画素点を処理しています.グレースケールフィルタの原理:
  • 浮動小数点アルゴリズム:Gray=R*0.3+G*0.59+B*0.11
  • 整数アルゴリズム:Gray=(R 30+G 59+B*11)/100
  • シフトアルゴリズム:Gray=(R 76+G 151+B*28)>>8
  • 平均値法:Gray=(R+G+B)/3
  • 緑色のみ取ります.Gray=G
  • 考え方:
  • 元の画像の画素値
  • を取得する.
  • 適切な階調アルゴリズムを選択する
  • .
  • 計算した所得をgl_に賦課する.FragColor
  • インスタンスコード
  • 頂点測色器(フィルターは頂点測色器を操作する必要がないので、異なるフィルターの頂点測色器コードが一致します):
  • attribute vec4 Position;
    attribute vec2 TextureCoords;
    varying vec2 TextureCoordsVarying;
    
    void main (void) {
        gl_Position = Position;
        TextureCoordsVarying = TextureCoords;
    }
    
  • 枚のオリジナル着色器
  • 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);
    
    一般的に人の目は異なる色に対する感度が異なるので、3つの色の値の重みは違っています.一般的には緑が一番高く、赤が二番目、青が一番低く、それぞれWr=30%、Wg=59%、Wb=11%という合理的な値をとる方が効果的です.
    暖色フィルタの考え方:
  • 元の画像の画素値
  • を取得する.
  • は、rgbチャネルの色に対応する赤/緑の値を追加し、rgbチャネルの値として
  • を使用する.
  • 計算した所得をgl_に賦課する.FragColor
  •     vec4 mask = texture2D(Texture, TextureCoordsVarying);
        gl_FragColor = mask + vec4(0.3,0.3,0.0,0.0);
    
    冷色フィルタの考え方:
  • 元の画像の画素値
  • を取得する.
  • は、rgbチャネルの色に対応する青色値を追加し、rgbチャネルの値として
  • を使用する.
  • 計算した所得をgl_に賦課する.FragColor
  •     vec4 mask = texture2D(Texture, TextureCoordsVarying);
        gl_FragColor = mask + vec4(0.0,0.0,0.3,0.0);
    
    フィルタの考え方を反転:
  • 元の画像の画素値
  • を取得する.
  • テクスチャ座標をマッピングする(y->>1-y)
  • 計算した所得をgl_に賦課する.FragColor
  • vec4 color = texture2D(Texture, vec2(TextureCoordsVarying.x, 1.0 - TextureCoordsVarying.y));
    
    転載先:https://juejin.im/post/5d22f34fe51d45775c73dd60