独自のBrad LarsonのGPUImageフレームワークを使用して、GLSL のフラグメント シェーダーにAtkinson ディザリング アルゴリズムを実装しようとしています。(これは不可能なことの 1 つかもしれませんが、私はまだそれを決定するのに十分な知識がないので、とにかく先に進んで実行しています。)
アトキンソン アルゴリズムは、元の Macintosh で見られるように、グレースケール イメージを純粋な白黒にディザリングします。基本的に、ピクセルの周囲のいくつかのピクセルを調査し、それぞれが純粋な黒または白からどれだけ離れているかを判断し、それを使用して累積的な「エラー」を計算する必要があります。そのエラー値に特定のピクセルの元の値を加えた値が、黒か白かを決定します。問題は、私が知る限り、エラー値が (ほとんど?) 常にゼロか、いつの間にかゼロに近いことです。私が考えているのは、私がサンプリングしているテクスチャが私が書き込んでいるテクスチャと同じであるため、エラーが最終的にゼロ (またはそれに近い) になるということです。 m サンプリングはすでに黒または白です。
これは正しいですか、それともサンプリングして書き込んでいるテクスチャは異なりますか? 前者の場合、それを回避する方法はありますか?後者の場合、このコードの他の問題を見つけることができるでしょうか? 困惑しており、適切にデバッグする方法がわからない可能性があります。
varying highp vec2 textureCoordinate;
uniform sampler2D inputImageTexture;
uniform highp vec3 dimensions;
void main()
{
highp vec2 relevantPixels[6];
relevantPixels[0] = vec2(textureCoordinate.x, textureCoordinate.y - 2.0);
relevantPixels[1] = vec2(textureCoordinate.x - 1.0, textureCoordinate.y - 1.0);
relevantPixels[2] = vec2(textureCoordinate.x, textureCoordinate.y - 1.0);
relevantPixels[3] = vec2(textureCoordinate.x + 1.0, textureCoordinate.y - 1.0);
relevantPixels[4] = vec2(textureCoordinate.x - 2.0, textureCoordinate.y);
relevantPixels[5] = vec2(textureCoordinate.x - 1.0, textureCoordinate.y);
highp float err = 0.0;
for (mediump int i = 0; i < 6; i++) {
highp vec2 relevantPixel = relevantPixels[i];
// @todo Make sure we're not sampling a pixel out of scope. For now this
// doesn't seem to be a failure (?!).
lowp vec4 pointColor = texture2D(inputImageTexture, relevantPixel);
err += ((pointColor.r - step(.5, pointColor.r)) / 8.0);
}
lowp vec4 textureColor = texture2D(inputImageTexture, textureCoordinate);
lowp float hue = step(.5, textureColor.r + err);
gl_FragColor = vec4(hue, hue, hue, 1.0);
}