将强度参数添加到 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);
//                            ^                   ^