片段着色器 - 更改片段颜色时的“奇怪”行为 - 检测为不同的值

时间:2015-11-26 20:30:40

标签: opengl-es gpuimage

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

我的图像上有黑色文字。我想创建类似“投影”的东西,但是是红色。 这很简单,我只是偏移坐标,检查颜色,如果我点击“非白”,我将其更改为红色。

当我创建过滤器时,我认为纯红色不是要走的路,我想稍微调整颜色。所以我修改了绿色和蓝色值。一旦我这样做,整个图像变成红色...... 我不确定我在这里做错了什么......为什么我会得到这种效果?

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;

    }

}

这是我不更改g& b值:

enter image description here

此处版本为g&设置了b个值。

enter image description here

我想知道为什么会这样?

1 个答案:

答案 0 :(得分:1)

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

您的输入图像仅包含白色和黑色像素,因此

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

会产生(0,0,0,A)或(1,1,1,A)(不知道你会得到什么alpha值,但它不重要)。< / p>

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

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