Hammer が指摘するように、私のオープン ソースGPUImageフレームワークの GPUImageDifferenceBlendFilter はまさにこれを行います。次のフラグメント シェーダーを使用して、赤、緑、青のチャンネルの絶対差を取得します。
varying highp vec2 textureCoordinate;
varying highp vec2 textureCoordinate2;
uniform sampler2D inputImageTexture;
uniform sampler2D inputImageTexture2;
void main()
{
mediump vec4 textureColor = texture2D(inputImageTexture, textureCoordinate);
mediump vec4 textureColor2 = texture2D(inputImageTexture2, textureCoordinate2);
gl_FragColor = vec4(abs(textureColor2.rgb - textureColor.rgb), textureColor.a);
}
連続するビデオ フレームを比較する必要がある場合は、GPUImageBuffer を使用して、古いフレームが現在のビデオ フレームとともに処理されるのを遅らせることもできます。フレームワーク内の FilterShowcase サンプル アプリケーションに、この例があります。
「結果は負のRGB値を持ちたい」という意味がよくわかりません。現在の iOS デバイスでサポートされているテクスチャ バックアップ フレームバッファ (レンダー ターゲット) 用の唯一のテクスチャ フォーマットは、32 ビット BGRA です。これは、各カラー チャネルの範囲が 0 ~ 255 であり、負の値が許可されていないことを意味します。ただし、その色範囲の下半分を負の値に使用し、上半分を正の値に使用できます。
次のようなフラグメント シェーダーを使用して、GPUImageSubtractBlendFilter を変更することができます。
varying highp vec2 textureCoordinate;
varying highp vec2 textureCoordinate2;
uniform sampler2D inputImageTexture;
uniform sampler2D inputImageTexture2;
void main()
{
lowp vec4 textureColor = texture2D(inputImageTexture, textureCoordinate);
lowp vec4 textureColor2 = texture2D(inputImageTexture2, textureCoordinate2);
gl_FragColor = vec4((textureColor.rgb - textureColor2.rgb + 1.0) * 0.5, textureColor.a);
}
次に、ピクセルを読み戻した後、0-255 の出力を -128 - 128 (または任意の範囲) に変換する必要があります。