After having used simple blending techniques together with fragment shader effects that could easily accomplish this,
it somehow seems silly to ask. Although, I'd appreciate if i could, for once (), accomplish something simple with a simple approach.
I'm trying to create an effect identical to the blend mode in photoshop called multiply.
I use (GL_DST_COLOR, GL_ZERO) or (GL_ZERO, GL_SRC_COLOR) with Equation GL_FUNC_ADD to accomplish a basic multiply effect.
I thought all channels would be multiplied, maybe they do, but in that case it's like i see the clear color without anything on it,
and as that isn't really stored anywhere, there must be something else I'm doing wrong.
If I try to compute the result myself. (given that the transparent regions of src are black with an alpha value of 0.00)
(Rs * Sr + Rd * Dr, Gs * Sg + Gd * Dg, Bs * Sb + Bd * Db, As * Sa + Ad * Da) // - All channels should be treated the same. // My resulting colour in the transparent region of src, on the grass (Let's say it's 0.5, 0.5, 0.25) // would be (0.00 * 0.50 + 0.50 * 0.00, 0.00 * 0.50 + 0.50 * 0.00, 0.00 * 0.25 + 0.25 * 0.00, 0.00 * 1.00 + 1.00 * 0.00) // effectively (0.00, 0.00, 0.00, 0.00) // - which as i see it should be transparent. It comes out black, however.
I read somewhere that it's just not doable with ordinary blending, and I guess a nice thing to have here would be a
per-channel glBlendFunc. After not getting the desired result, I immediately resolved to shotgun surgery and tried out all combinations, with no luck.
If I cannot manage to do this, I guess I'd just leave this part as it is, it's not a gamestopper, but it does irritate me a bit. :-)
These images should illustrate what I'm going for, - and I must admit, i haven't tried with actual textures yet,
I merely change the alpha component when setting glColour4f(). I expect the result to be similar with texturing.
Src. (What I draw to the colour buffer)
Dst. (What's already in the colour buffer)
Desired. (I'd really like to see this result)
Achieved. (I'm getting this result. )
Have any of you been past this? I guess a common use for texture multiplications would be for lightmaps,
and here using alpha probably won't make much sense, as revealing more of the previous layer only
means approaching a white lightmap value (at which point the surface appears unlit).
I intend to use this for my GUI, however. For simple overlay effects, dialogs and HUDs. (Should become nice and generic. )
Without lerping between any colour and white, I'd like to be able to have the overlayed GUI element fade out, while still keeping the effect.
Say, I have a red light filter taking up the entire screen, resembling the player having been shot, fading out slowly, and things gradually come back to their original colours.
Edited by SuperVGA, 03 February 2013 - 02:17 PM.