[...1 of 2...]
I'll write more about Benoit's questions in next message. But for now, a
technical nit...
I wonder if there's a bug in the equations?
>[...]
>WebCGM uses a painters model of rendering. Colors are applied in
>successive operations to the output device. When an area overlaps a
>previously colored area the new color partially or completely obscures
>the old. When the color is not completely opaque the result on the
>output device is defined by the following (mathematical) rules for
>compositing (all color values use premultiplied alpha):
>
>Pr, Pg, Pb - Primitive color value
>Pa - Primitive alpha value
>Cr, Cg, Cb - Canvas color value (before blending)
>Ca - Canvas alpha value (before blending)
>Cr', Cg', Cb' - Canvas color value (after blending)
>Ca' - Canvas alpha value (after blending)
>Ca' = 1 - (1 - Pa) * (1 - Ca)
Are the following equations correct? If primitive is fully transparent
red, for example (0, 1, 0, 0), then it should not affect the canvas,
right? I.e., intuitively Cr'=Cr. But the equation gives,
Cr' = Cr + Pr
Similarly, the equation gives intuitively wrong result for Pa=1 (fully
opaque). So I think the equation actually needs to be:
Cr' = (1 - Pa)*Cr + Pa*Pr
Thoughts?
-Lofton.
>Cr' = (1 - Pa) * Cr + Pr
>Cg' = (1 - Pa) * Cg + Pg
>Cb' = (1 - Pa) * Cb + Pb
>
>Example #1:
>Primitive is semi transparent red: (Pa, Pr, Pg, Pb) = (0.5,0.5,0,0)
>Canvas is opaque black: (Ca, Cr, Cg, Cb) = (1,0,0,0)
>Ca' = 1 - (1 - 0.5) * (1 - 1) = 1
>Cr' = (1 - 0.5) * 0 + 0.5 = 0.5
>Cg' = (1 - 0.5) * 0 + 0 = 0
>Cb' = (1 - 0.5) * 0 + 0 = 0
>The result is an opaque dark red (1,0.5,0,0).
>
>Example #2:
>Primitive is opaque red: (Pa, Pr, Pg, Pb) = (1,1,0,0)
>Canvas is semi transparent black: (Ca, Cr, Cg, Cb) = (0.5,0,0,0)
>Ca' = 1 - (1 - 1) * (1 - 0.5) = 1
>Cr' = (1 - 1) * 0 + 1 = 1
>Cg' = (1 - 1) * 0 + 0 = 0
>Cb' = (1 - 1) * 0 + 0 = 0
>The result is an opaque red (1,1,0,0).
>
>Example #3:
>Primitive is semi transparent red: (Pa, Pr, Pg, Pb) = (0.5,0.5,0,0)
>Canvas is semi transparent black: (Ca, Cr, Cg, Cb) = (0.5,0,0,0)
>Ca' = 1 - (1 - 0.5) * (1 - 0.5) = 0.75
>Cr' = (1 - 0.5) * 0 + 0.5 = 0.5
>Cg' = (1 - 0.5) * 0 + 0 = 0
>Cb' = (1 - 0.5) * 0 + 0 = 0
>The result is a transparent dark red (0.75,0.5,0,0).