我正在尝试使用我们自己的Brad Larson的GPUImage框架在 GLSL 的片段着色器中实现阿特金森抖动算法。(这可能是不可能的事情之一,但我还没有足够的知识来确定这一点,所以我还是继续做下去。)
Atkinson 算法将灰度图像抖动为在原始 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);
}