-3

シェーダーの例を次に示します。

varying highp vec2 textureCoordinate;


varying highp vec2 textureCoordinate2; // TODO: This is not used

 uniform sampler2D inputImageTexture;
 uniform sampler2D inputImageTexture2; // lookup texture

 void main()
 {
     lowp vec4 textureColor = texture2D(inputImageTexture, textureCoordinate);

 mediump float blueColor = textureColor.b * 63.0;

 mediump vec2 quad1;
 quad1.y = floor(floor(blueColor) / 8.0);
 quad1.x = floor(blueColor) - (quad1.y * 8.0);

 mediump vec2 quad2;
 quad2.y = floor(ceil(blueColor) / 8.0);
 quad2.x = ceil(blueColor) - (quad2.y * 8.0);

 highp vec2 texPos1;
 texPos1.x = (quad1.x * 0.125) + 0.5/512.0 + ((0.125 - 1.0/512.0) * textureColor.r);
 texPos1.y = (quad1.y * 0.125) + 0.5/512.0 + ((0.125 - 1.0/512.0) * textureColor.g);

 highp vec2 texPos2;
 texPos2.x = (quad2.x * 0.125) + 0.5/512.0 + ((0.125 - 1.0/512.0) * textureColor.r);
 texPos2.y = (quad2.y * 0.125) + 0.5/512.0 + ((0.125 - 1.0/512.0) * textureColor.g);

 lowp vec4 newColor1 = texture2D(inputImageTexture2, texPos1);
 lowp vec4 newColor2 = texture2D(inputImageTexture2, texPos2);

 lowp vec4 newColor = mix(newColor1, newColor2, fract(blueColor));
 gl_FragColor = vec4(newColor.rgb, textureColor.w);

}

このシェーダは、画像の周囲に青いエッジの効果を追加します。計算には追加のテクスチャを使用します。これがテクスチャです: https://github.com/BradLarson/GPUImage/blob/master/framework/Resources/lookup.png 誰かがこのテクスチャの目的を説明できますか? コードでは、このテクスチャは inputImageTexture2 変数に格納されます。アイデアとアルゴリズムとは?たとえば、青の代わりに赤のエッジを取得したい場合、入力テクスチャを変更する必要があります。

ありがとう。

4

1 に答える 1

2

この特定のフィルターは Lev Zelensky によって作成され、彼のブログでその構成について説明しています。

基本的に、ベースの RGB ルックアップ テーブルから始めて、それを Photoshop に取り込み、再現したい色効果を適用してから、結果の画像を取得し、それをこのフィルターのルックアップ テーブルとして使用します。イメージ内の各 RGB 値について、そのテーブル内で最も近い一致が検出され、元の色の代わりに使用されます。

画像の外側が青みを帯びている理由については、ルックアップ テーブルを正しく生成して保存していること、およびフィルターの正しい入力スロットに追加していることを確認してください。

于 2013-08-12T18:49:38.867 に答える