[HN Gopher] My mental model of how alpha opacity works is wrong
       ___________________________________________________________________
        
       My mental model of how alpha opacity works is wrong
        
       Author : sebg
       Score  : 47 points
       Date   : 2022-02-03 17:11 UTC (2 days ago)
        
 (HTM) web link (coolbutuseless.github.io)
 (TXT) w3m dump (coolbutuseless.github.io)
        
       | [deleted]
        
       | cjdell wrote:
       | Relevant video about cross-fades in CSS which I definitely
       | learned something from:
       | https://youtu.be/PYSOnC2CrD8?list=PLNYkxOF6rcIAKIQFsNbV0JDws...
        
       | klodolph wrote:
       | Alpha is also multiplicative, not just transmissivity. You just
       | pick the right operation to think about it.
       | 
       | https://en.wikipedia.org/wiki/Alpha_compositing
       | 
       | If your compositing operation is A over B, then transmissivity is
       | multiplicative for the A&B region. If your compositing mode is A
       | in B, then opacity (alpha) is multiplicative.
       | 
       | This has the same structure, mathematically, as thinking about
       | logical operations like AND and OR, which are complementary to
       | each other. If you think of AND as multiplication, well, you can
       | think of OR as multiplication as well, just with the values
       | flipped around.
        
       | Animats wrote:
       | He hasn't found the hard problem yet.
       | 
       | If you have two translucent objects, how do you combine the
       | colors? This is hard to do with Z-buffer rendering. The obvious
       | coloring operation is not commutative, and in a Z-buffer system,
       | you don't know which face gets rendered first.
       | 
       | This is a huge pain. You can't just dump everything into the GPU
       | and let it draw in parallel, which is what GPUs do fast. You
       | usually have to depth-sort triangles, so the front triangle gets
       | rendered last. This delays rendering while the CPU does the sort.
       | 
       | There's a GPU-based solution to this, but it involves some
       | compromises in quality.[1]
       | 
       | [1] https://developer.nvidia.com/content/transparency-or-
       | translu...
        
         | zokier wrote:
         | Involving colors is much more complicated than that; in theory
         | if you shine white light through stack a red filter on top of
         | blue filter, I'd expect the intersecting area to be closer to
         | black than purple. You can see that in for example this
         | picture: https://www.walmart.com/ip/Sightmark-32mm-
         | Filters/31197086
         | 
         | This is just the tip of the iceberg when it comes to the
         | complexity of translucent objects. To get truly convincing
         | results spectral rendering is needed, but of course that is
         | prohibitively expensive for real-time use.
        
         | boulos wrote:
         | The (stochastic) order-independent transparency and k-buffer
         | line of work is definitely cool for what it was. I get the
         | sense that RTX will finally make it so that folks are going to
         | end up just ray tracing the transparent volumes (even if you
         | first did a rasterization pass of the "non transparent stuff").
        
         | nyanpasu64 wrote:
         | The hard problem in 2D rendering (where objects are drawn in a
         | user-determined order) isn't translucent blending of unsorted
         | polygons, but conflation artifacts. If you have two adjacent
         | squares where the first covers the left half of a pixel and the
         | second covers the right half, and both are drawn with alpha
         | blending, there will be background showing through which
         | shouldn't exist, and too little influence from the first
         | square's color. Similarly if you drawn two identical squares on
         | top of each other, which both cover the left half of a pixel,
         | the first square will have some influence over the background
         | which shouldn't happen at all.
        
         | pcwalton wrote:
         | The "right" solution with no quality compromises is per-pixel
         | linked lists (PPLLs) that are then sorted afterward. This is
         | straightforwardly implementable on GPU, but it remains to be
         | seen whether the technique will take off, given the overhead.
        
       | pavlov wrote:
       | Light is additive (in a linear colorspace). But the opacity of a
       | layer means blocking part of the light, and such light absorbers
       | are multiplicative.
        
       | Synaesthesia wrote:
       | Yeah I realised this one day after thinking about it. This is a
       | very elegant explanation of the correct way to think about it.
        
       | ruined wrote:
       | sometimes i read things like this, and i'm astounded that anyone
       | could have developed a mental model so incorrect and unintuitive
       | but close enough to persist for a while.
       | 
       | then i remind myself that i probably have a few situations like
       | that in my own mind and i should remain vigilant.
       | 
       | edit: and then i get just a _little_ more frustrated next time
       | someone resists a correction that i provide.
        
         | rebuilder wrote:
         | It depends on what your experience is with. If you've done any
         | digital painting, you're probably all too familiar with low-
         | opacity strokes seeming to never add up to full opacity, and
         | will have concluded the opacities are not simply added
         | together.
        
         | gs17 wrote:
         | > incorrect and unintuitive
         | 
         | The thing that you might be missing is that "incorrect" is
         | (usually) objective, but "unintuitive" isn't necessarily so. I
         | can see how someone else would think additive opacity is
         | intuitive, even if it's very easy to show that it isn't
         | correct.
        
           | marcosdumay wrote:
           | Every one of those things limited to [0; 1] combine
           | multiplicativelly. (Mostly because they are some kind of
           | probability or vectorial projection - what are the same
           | thing, by the way.)
           | 
           | You are right that "intuitive" is a subjective property. But
           | I'm completely lost trying to imagine what kind of life
           | experiences can lead on to expect them to be additive.
        
             | nerdponx wrote:
             | I also thought that opacity was additive and clamped to 0,1
             | until right now.
             | 
             | Seem intuitive to me. Half + half = whole. When I make a
             | chart in R and set the color to alpha 0.5, the result looks
             | more or less like an opaque point if I plot 2 of them on
             | top of each other.
             | 
             | Apparently that's wrong, but it's consistent with my not-
             | very-precise observations, and I have never had a need or
             | desire to learn more about how opacity works. One cannot be
             | an expert in all things.
             | 
             | What intuition should a layperson have to suggest that
             | _obviously_ opacity /transmissivity is multiplicative? I
             | don't see the value in deriding the incorrect intuition of
             | uneducated people. In statistics at least we accept that
             | statistics is hard specifically because it can be
             | unintuitive.
        
               | marcosdumay wrote:
               | Out of curiosity, did you have any rationalization for
               | why clamping it made sense, or you just didn't think
               | about it?
        
               | nerdponx wrote:
               | "How can something be more opaque than fully opaque?" was
               | my intuition (and probably many other people's). Also
               | RGBA numbers are generally clamped to 0,255.
        
               | riversflow wrote:
               | > What intuition should a layperson have to suggest that
               | obviously opacity/transmissivity is multiplicative?
               | 
               | My intuition is that if I put on dark sunglasses I can
               | still see through other dark things (like a CD or welders
               | glass) if I look at something bright enough (like the
               | sun). If opacity/transmissivity is modeled like it works
               | in real life, given this example, it follows that it
               | wouldn't be additive.
        
               | nerdponx wrote:
               | That's a great point, and it illustrates the problem with
               | the mental models of uneducated people. It's difficult to
               | know what information should and shouldn't be part of the
               | model! I figured it just didn't work like real life,
               | because RGBA numbers are clamped.
        
               | teawrecks wrote:
               | > What intuition should a layperson have to suggest that
               | obviously opacity/transmissivity is multiplicative?
               | 
               | Tinted windows and sunglasses come to mind. Intuitively,
               | if you put translucent things back to back, you expect
               | light to still pass through, albeit less of it, but
               | always some. A noteworthy exception is when using
               | polarized filters, which can unintuitively block out 100%
               | of light depending on the angle between the filters.
        
       | boulos wrote:
       | If the original author is here, I find that the original paper
       | [1] still remains one of the better discussions of what is trying
       | to be represented with alpha blending operations.
       | 
       | It's all just an approximation. Don't lose sight of that!
       | 
       | [1] https://graphics.pixar.com/library/Compositing/paper.pdf
        
       | amelius wrote:
       | For more fun, draw a filled circle in Inkscape. Then copy and
       | paste it in the same place, and again, and again ... and watch
       | the edges get more and more jagged. Try to explain _that_ to an
       | average user.
        
       | Diggsey wrote:
       | Well... if we're trying to model how a translucent pane would
       | work in the real world, then this is correct for one particular
       | interpretation of alpha.
       | 
       | However, if we're talking about how alpha blending actually works
       | in software, then it can vary a lot.
       | 
       | For example, in Direct3D you would typically use the
       | `D3DBLEND_SRCALPHA` and `D3DBLEND_INVSRCALPHA` for the source and
       | destination blend modes respectively. In that case, the combined
       | alpha is actually `src_alpha^2 + (1 - src_alpha) * dst_alpha`
       | which is different again from the two calculations in the
       | article.
       | 
       | There are even other ways to achieve a physically realistic
       | result that use a different interpretation of the alpha channel.
       | Or maybe you want to solve for something else (eg. order-
       | independent blending)
        
       ___________________________________________________________________
       (page generated 2022-02-05 23:00 UTC)