片段着色器 - "strange" 更改片段颜色时的行为 - 检测为不同的值

Fragment shader - "strange" behaviour when changing color of fragment - detected as different value

我正在使用 GPUImage 库,并且正在使用片段着色器编写自己的自定义滤镜。

我有一张图片,上面有黑色文字。我想创建类似 "drop shadow" 的东西,但颜色是红色。 这很简单,我只需偏移坐标,检查颜色,如果我碰到什么东西 "not white" 我就把它变成红色。

创建滤镜时,我认为纯红色不是最佳选择,因此我想稍微调整一下颜色。所以我修改了绿色和蓝色值。一旦我这样做了,整个图像就变成了红色…… 我不确定我在这里做错了什么......为什么我会得到这种效果?

varying highp vec2 textureCoordinate;

uniform sampler2D inputImageTexture;


lowp vec4 offsetCoordinate(highp vec2 coordinate, lowp float x, lowp float y) {
    highp vec2 newCoordinate = textureCoordinate;
    newCoordinate.x = textureCoordinate.x + x;
    newCoordinate.y = textureCoordinate.y + y;
    return texture2D(inputImageTexture, newCoordinate);
}

void main()
{

    lowp vec4 inputColor = texture2D(inputImageTexture, textureCoordinate);

    if (inputColor.r > 0.1 && inputColor.g > 0.1 && inputColor.b > 0.1) {

        lowp vec4 outputColor = offsetCoordinate(textureCoordinate, 0.1, 0.03);
        outputColor.r = 1.0;
        outputColor.g = 0.09;
        outputColor.b = 0.09;

        gl_FragColor = outputColor;

    } else {

        gl_FragColor = inputColor;

    }

}

这是我不更改 gb 值的版本:

这里的版本设置了 gb 值。

我想知道为什么会这样?

您得到的结果正是您应该使用着色器得到的结果。

您的输入图像只包含白色和黑色像素,所以

lowp vec4 outputColor = offsetCoordinate(textureCoordinate, 0.1, 0.03);

将产生 (0,0,0,A) 或 (1,1,1,A)(不知道您将获得什么 alpha 值,但这无关紧要)。

如果用 1 覆盖 outputColor.r,您会将黑色变为红色 (1,0,0,A),而白色将保持白色。

如果覆盖 rgb,您将得到 (r,g,b,A),因此颜色将完全独立于您选择的颜色从纹理中获取。