That *really* shed light on why that works how it does, in a way that
totally makes sense to me. You're better than the Orange Book...

-George Toledo

On Sun, Jun 20, 2010 at 11:07 AM, Christopher Wright <cwri...@kineme.net>wrote:

> Thanks cwright! I get it now. I wasn't putting the gl_FragColor line in the
>> right place.... really obvious oversight.
>>
>> I'm attaching the "working as expected" shader. (I'm still scratching my
>> head a little bit about why, if color is alpha=0 already in the vertex
>> shader, and my source texture is composited over alpha, why this is
>> necessary.)
>>
>
> I think you're thinking in more complicated texturing terms than is
> strictly necessary -- the blend mode affects the entire object (the final
> compositing of whatever the fragment shader spits out), not the input
> texture or the input color.  Alpha blend mode (unofficial)   simply tells
> the GPU to do the premultiplication itself.  This is a bit slower, but
> simplifies writing shaders. (And in fact, if you need to do the
> premultiplication in the fragment shader anyway, it's actually the same
> speed -- the premultiplication needs to happen somewhere, so that cost gets
> paid somewhere).
>
> To do alpha blending, you perform this mathematical operation (Alpha blend
> mode tells the GPU to use this equation):
>
> outputColor = destinationColor * (1. - sourceAlpha)  + sourceColor *
> sourceAlpha;    (you provide sourceColor and sourceAlpha directly by setting
> gl_FragColor or gl_FragData[0])
>
> This cost 2 multiplies, and an add per pixel ["1. - sourceAlpha" is often
> "free" since it's usually just a binary inversion in 8 bit mode] (back in
> the day, this was a gigantic cost - I remember writing assembly blitters
> that did this sort of thing when I was a kid, before graphics hardware was
> around to make this irrelevant).
>
> So some people thought about the problem, and they realized that you could
> pre-calculate the "sourceColor * sourceAlpha" part, since that's constant.
>  Thus, "premultiplication" was born.  Your textures don't store sourceColor
> anymore, they store sourceColor * sourceAlpha.  this, of course, has the
> negative side effect of losing color fidelity when alpha is less than 1 --
> for example, when alpha is 0, color is 0 (you've lost all the color
> information).  In practice, this typically isn't a problem, and it saves a
> multiply per pixel, which is a lot of work.
>
> The equation then becomes the following (Over blend mode uses this):
> outputColor = destinationColor * (1. - sourceApha) + sourceColor;
>
> So if you feed it a sourceColor that _isn't_ premultiplied, the results are
> wrong (they kinda blend, but they're kinda opaque too).
>
> Add blend mode uses the following:
> outputColor = destinationColor + sourceColor;   this is even simpler (0
> multiplies!), but disregards alpha entirely.)
>
> So, when you're setting colors in QC, typically it does the
> premultiplication for you, and never need to know/care.  However, it cannot
> do that in the shader for you, since you're taking control of the GPU
> directly at that point.
>
>
>
>  Too bad that the shader is blowing up your machine ( I wonder if the
>> classic vertexnoise glsl would do the same, as it's largely the same).
>>
>
> Not sure -- I commented out all the dead code, and it started working, so I
> have no idea.  *shrugs*
>
>
> --
> [ christopher wright ]
> cwri...@kineme.net
> http://kineme.net/
>
>
 _______________________________________________
Do not post admin requests to the list. They will be ignored.
Quartzcomposer-dev mailing list      (Quartzcomposer-dev@lists.apple.com)
Help/Unsubscribe/Update your Subscription:
http://lists.apple.com/mailman/options/quartzcomposer-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com

Reply via email to