2015-10-05 60 views
3

見在底部添加強度參數GPUImageFalseColorFilter


它看起來像GPUImageFalseColorFilter從另一個過濾器複製更新 - 我可以看到在着色強度性能,但它實際上並沒有做任何事情。我已經爲它添加了setter和obj-c包裝,但是現在我似乎無法獲得gl_fragColor返回值以將強度作爲參數。

這裏的着色器具有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色調顏色。除了全球「強度」屬性之外,我還想在每個單獨的色調顏色上支持一個Alpha通道。


更新:

提出了一些嚴肅的進展與此 - 它現在接受單一強度PARAMS像這樣:

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,則效果不起作用。

如何正確地將最終圖像混合在一起?

+0

您可能需要瓜分了一些值,它會工作之前... [這只是一個粗略的想法](https://gist.github.com/anonymous/a8c6eb859096103e56c3)。 –

+0

@lll看到更新 - 我分散了強度值,它更接近。只需要找到一種方法來混合shadowResult和highlightResult。 – brandonscript

回答

3

終於得到了這個利用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); 
//       ^    ^