片段着色器 - "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;
}
}
这是我不更改 g
和 b
值的版本:
这里的版本设置了 g
和 b
值。
我想知道为什么会这样?
您得到的结果正是您应该使用着色器得到的结果。
您的输入图像只包含白色和黑色像素,所以
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),而白色将保持白色。
如果覆盖 r
、g
和 b
,您将得到 (r,g,b,A),因此颜色将完全独立于您选择的颜色从纹理中获取。
我正在使用 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;
}
}
这是我不更改 g
和 b
值的版本:
这里的版本设置了 g
和 b
值。
我想知道为什么会这样?
您得到的结果正是您应该使用着色器得到的结果。
您的输入图像只包含白色和黑色像素,所以
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),而白色将保持白色。
如果覆盖 r
、g
和 b
,您将得到 (r,g,b,A),因此颜色将完全独立于您选择的颜色从纹理中获取。