将强度参数添加到 GPUImageFalseColorFilter
Add intensity parameter to GPUImageFalseColorFilter
见底部更新
看起来 GPUImageFalseColorFilter 是从另一个过滤器复制的 - 我可以在着色器中看到强度 属性,尽管它实际上没有做任何事情。我已经为它添加了 setter 和 Obj-c 包装器,但现在我似乎无法获得 gl_fragColor
return 值来将强度作为参数。
这是使用 100% 强度的着色器:
precision lowp float;
varying highp vec2 textureCoordinate;
uniform sampler2D inputImageTexture;
uniform lowp float intensity;
uniform vec4 shadowTintColor;
uniform vec4 highlightTintColor;
const mediump vec3 luminanceWeighting = vec3(0.2125, 0.7154, 0.0721);
void main()
{
lowp vec4 textureColor = texture2D(inputImageTexture, textureCoordinate);
float luminance = dot(textureColor.rgb, luminanceWeighting);
gl_FragColor = vec4( mix(shadowTintColor.rgb, highlightTintColor.rgb, luminance), textureColor.a);
}
);
我试过:
gl_FragColor = vec4( mix(shadowTintColor.rgb, highlightTintColor.rgb, luminance), intensity);
gl_FragColor = mix(textureColor, mix(shadowTintColor.rgb, highlightTintColor.rgb, luminance), intensity);
和其他一些,但过滤器崩溃并出现大量错误(No matching function for call to mix(vec4, vec3, float)
、Too many arguments to constructor of 'vec4'
)。
我怎样才能获得强度属性?
并且为了加分,原始过滤器被编写为将 vec4 色调颜色作为输入,但在过滤器中仅使用 vec3 色调颜色。除了全局 "intensity" 属性,我还想在每个单独的色调上支持一个 alpha 通道。
更新:
在这方面取得了一些重大进展 - 它现在接受像这样的个人强度参数:
precision lowp float;
varying highp vec2 textureCoordinate;
uniform sampler2D inputImageTexture;
uniform lowp float shadowTintIntensity;
uniform lowp float highlightTintIntensity;
uniform vec4 shadowTintColor;
uniform vec4 highlightTintColor;
const mediump vec3 luminanceWeighting = vec3(0.2125, 0.7154, 0.0721);
{
lowp vec4 textureColor = texture2D(inputImageTexture, textureCoordinate);
highp float luminance = dot(textureColor.rgb, luminanceWeighting);
highp vec4 shadowResult = mix(textureColor, max(textureColor, vec4( mix(shadowTintColor.rgb, textureColor.rgb, luminance), textureColor.a)), shadowTintIntensity);
highp vec4 mixedResult = mix(textureColor, min(shadowResult, vec4( mix(shadowResult.rgb, highlightTintColor.rgb, luminance), textureColor.a)), highlightTintIntensity / 3.0);
gl_FragColor = mixedResult;
}
);
我现在可以让它正确地影响图像的强度,但它似乎在亮度权重上有点偏差?我在高光计算器上手动添加了一个 / 3.0
乘数,它似乎平衡了阴影和高光强度效果,但这并不是正确的方法。 编辑:这甚至根本无法将它们正确地混合在一起 - 如果未指定 highlightTint,则效果不起作用。
如何正确地将最终图像混合在一起?
最终通过使用 mix
并将两个结果与亮度常数混合来实现:
vec4 textureColor = texture2D(inputImageTexture, textureCoordinate);
float luminance = dot(textureColor.rgb, luminanceWeighting);
vec4 shadowResult = mix(textureColor, max(textureColor, vec4( mix(shadowTintColor.rgb, textureColor.rgb, luminance), textureColor.a)), shadowTintIntensity);
vec4 highlightResult = mix(textureColor, min(shadowResult, vec4( mix(shadowResult.rgb, highlightTintColor.rgb, luminance), textureColor.a)), highlightTintIntensity);
gl_FragColor = vec4( mix(shadowResult.rgb, highlightResult.rgb, luminance), textureColor.a);
// ^ ^
见底部更新
看起来 GPUImageFalseColorFilter 是从另一个过滤器复制的 - 我可以在着色器中看到强度 属性,尽管它实际上没有做任何事情。我已经为它添加了 setter 和 Obj-c 包装器,但现在我似乎无法获得 gl_fragColor
return 值来将强度作为参数。
这是使用 100% 强度的着色器:
precision lowp float;
varying highp vec2 textureCoordinate;
uniform sampler2D inputImageTexture;
uniform lowp float intensity;
uniform vec4 shadowTintColor;
uniform vec4 highlightTintColor;
const mediump vec3 luminanceWeighting = vec3(0.2125, 0.7154, 0.0721);
void main()
{
lowp vec4 textureColor = texture2D(inputImageTexture, textureCoordinate);
float luminance = dot(textureColor.rgb, luminanceWeighting);
gl_FragColor = vec4( mix(shadowTintColor.rgb, highlightTintColor.rgb, luminance), textureColor.a);
}
);
我试过:
gl_FragColor = vec4( mix(shadowTintColor.rgb, highlightTintColor.rgb, luminance), intensity);
gl_FragColor = mix(textureColor, mix(shadowTintColor.rgb, highlightTintColor.rgb, luminance), intensity);
和其他一些,但过滤器崩溃并出现大量错误(No matching function for call to mix(vec4, vec3, float)
、Too many arguments to constructor of 'vec4'
)。
我怎样才能获得强度属性?
并且为了加分,原始过滤器被编写为将 vec4 色调颜色作为输入,但在过滤器中仅使用 vec3 色调颜色。除了全局 "intensity" 属性,我还想在每个单独的色调上支持一个 alpha 通道。
更新:
在这方面取得了一些重大进展 - 它现在接受像这样的个人强度参数:
precision lowp float;
varying highp vec2 textureCoordinate;
uniform sampler2D inputImageTexture;
uniform lowp float shadowTintIntensity;
uniform lowp float highlightTintIntensity;
uniform vec4 shadowTintColor;
uniform vec4 highlightTintColor;
const mediump vec3 luminanceWeighting = vec3(0.2125, 0.7154, 0.0721);
{
lowp vec4 textureColor = texture2D(inputImageTexture, textureCoordinate);
highp float luminance = dot(textureColor.rgb, luminanceWeighting);
highp vec4 shadowResult = mix(textureColor, max(textureColor, vec4( mix(shadowTintColor.rgb, textureColor.rgb, luminance), textureColor.a)), shadowTintIntensity);
highp vec4 mixedResult = mix(textureColor, min(shadowResult, vec4( mix(shadowResult.rgb, highlightTintColor.rgb, luminance), textureColor.a)), highlightTintIntensity / 3.0);
gl_FragColor = mixedResult;
}
);
我现在可以让它正确地影响图像的强度,但它似乎在亮度权重上有点偏差?我在高光计算器上手动添加了一个 / 3.0
乘数,它似乎平衡了阴影和高光强度效果,但这并不是正确的方法。 编辑:这甚至根本无法将它们正确地混合在一起 - 如果未指定 highlightTint,则效果不起作用。
如何正确地将最终图像混合在一起?
最终通过使用 mix
并将两个结果与亮度常数混合来实现:
vec4 textureColor = texture2D(inputImageTexture, textureCoordinate);
float luminance = dot(textureColor.rgb, luminanceWeighting);
vec4 shadowResult = mix(textureColor, max(textureColor, vec4( mix(shadowTintColor.rgb, textureColor.rgb, luminance), textureColor.a)), shadowTintIntensity);
vec4 highlightResult = mix(textureColor, min(shadowResult, vec4( mix(shadowResult.rgb, highlightTintColor.rgb, luminance), textureColor.a)), highlightTintIntensity);
gl_FragColor = vec4( mix(shadowResult.rgb, highlightResult.rgb, luminance), textureColor.a);
// ^ ^