我正在使用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
值:
此处版本为g
&设置了b
个值。
我想知道为什么会这样?
答案 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),白色将保持白色。
如果您覆盖r
,g
和b
,您将获得(r,g,b,A),因此颜色将完全独立于您从中获取的颜色纹理。