Readit News logoReadit News
sunnyps · 2 years ago
> However, using a transparent color significantly slowed down the number that can be drawn too which doesn't make as much sense to me. I'd imagine that with hardware today transparency should be somewhat free.

That's because transparency limits how you can batch draws on the GPU. With opaque draws, you can use the depth buffer and draw in any order you like e.g. maximizing batching. With transparency, you need to draw things in the right order for blending to work (painters order).

dmazzoni · 2 years ago
I think it's more complex than that. While web browsers do use GPU rendering, they're not game engines. They don't draw every single object on the screen every frame, that could easily cause lag on a large complex page.

Chromium in particular tries to minimize the total number of layers. It renders each layer into a pixel map, then for each frame it composites all of the visible layers into the final image.

That works really well in practice because you often have lots of layers that move around but don't actually change their pixels. So those don't need to be rendered (rasterized) every frame, just composited.

If you have a bunch of box shadows without transparency, Chromium will rasterize the whole thing once as a single layer.

If you have a bunch of box shadows with transparency, Chromium might create a separate layer for each one. That's probably suboptimal in this particular case, but imagine if your partially transparent box shadows had to also slide around the page independently.

forrestthewoods · 2 years ago
> They don't draw every single object on the screen every frame, that could easily cause lag on a large complex page.

Games draw every single object on the screen every frame. They don't lag, quite the opposite in fact!

o11c · 2 years ago
Reverse-painter's-order beats painter's-order since it lets you skip fully-occluded objects:

  Start with a buffer that's fully transparent (α=0.0)
  for each face from front to back:
    for each pixel of the face:
      draw the pixel, blending 1.0-buffer.α of the new pixel into whatever's already in the buffer
      (if buffer.α == 1.0 you can just skip it entirely, just like for depth buffering)
  go back and double check your math relating to transparent objects behind other transparent objects
The tricky part is if you have faces that overlap in a cycle (can happen legitimately), or that penetrate each other (often avoidable if you think about it).

mabster · 2 years ago
The game engines I've dealt with separate opaque and transparent geometry.

It is generally good to render opaque geometry back to front to reduce overdraw, but not going so far as sorting the objects. We would do stuff like render the hands first in an FPS or render the skybox last in most games.

Now for the transparent layer: First occlusion is handled by the z-buffer as usual. If you render from front to back I assume you render to another buffer first and then composite to the framebuffer? If you render from back to front you don't need alpha in your framebuffer and can assume each rendered pixel is opaque, not needing that composite.

There's also order independent transparency stuff though which IIRC does need another buffer, which requires a composite but then saves you having to sort the objects.

Cloudef · 2 years ago
GPUs also do not like overdraw, so it's generally good idea to avoid having many transparent elements on top of each other, its also the reason why drawing more triangles vs. transparent texture is generally better.
DaoVeles · 2 years ago
My big take away with the whole City Skylines 2 performance issue and the lack of LOD was that geometry processing is so cheap nowadays. So long as you aren't too reckless with geometry in terms of sub-pixel rendering, you don't really have to worry about it too much any more.

It isn't like the Ps2 era when geometry time was a real concern on render times. Even a modern low end GPU could process a few hundred million polygons a second without sweating it, now getting the result son screen is a very different issue.

delusional · 2 years ago
The "Ordering" step doesn't really matter that much. You're usually doing a sort anyway prior to submitting the drawcall. What hurts is the overdraw. If you're doing opaque rendering, you get to render front to back, rendering only what actually appears on the final framebuffer. The number of pixels (after the depth pass) is proportional to the framebuffer. When you're doing transparent rendering you render back to front, and you have to render a tonne of the scene that will eventually be (partially) obscured by other random polys. We call that overdraw. The amount of pixels through the shader pipeline balloons to be proportional to the size of your mesh.

If you're doing non-overlapping stuff, you'd actually expect (almost) no slowdown from transparency, since you'd have to touch every pixel once anyway, and the only thing that changed is the shader formula.

p_l · 2 years ago
One more thing to consider is memory bandwidth, which can be limiting factor especially on mobile devices.

A non-transparent draw over another draw allows in best case to cull all overlapping drawing operations, in worst case means you only have to use as much bandwidth as the individual draws.

With transparency, especially if you can't somehow combine the operations together (from my understanding, very hard problem), it means you also need to read back the entire region you're overlapping with transparency - so every transparent draw involves at least twice the final framebuffer size bitmap going-over memory bus.

Now consider that many mobile devices had not enough memory bandwidth to do a full redraw (i.e. blit the full framebuffer image twice) of the screen in time to maintain 60fps and it becomes a considerable problem.

amelius · 2 years ago
Can't you mathematically work out how to change the colors/opacity to rearrange the job?
Rapzid · 2 years ago
Having that knowledge sounds just as expensive if the operations aren't commutative.
klysm · 2 years ago
I think there’s still a dependency graph
paulirish · 2 years ago
Seriously fun exploration.

> Layering. That is an important word.

Layering is also the key to the (silly but also sometimes good-looking) effects from my text shadow project from 14yrs ago: https://paulirish.github.io/mothereffingtextshadow/

breck · 2 years ago
> Layering. That is an important word.

It's almost like this post has many layers to it, and that it's not really about box shadows.

rustystump · 2 years ago
<3
sufehmi · 2 years ago
Was confused because everything moved in 2 seconds per frame on M2 Firefox.

Switched to Chrome - suddenly everything is butter smooth.

Congrats on an article very well done!

ctippett · 2 years ago
I'm embarrassed to admit it took until the final paragraph before realising that 'gypity' is a reference to Chat GPT.
noqc · 2 years ago
I took until here.
fitsumbelay · 2 years ago
same
jbritton · 2 years ago
Primeagen YouTube channel lingo.
krsdcbl · 2 years ago
fun fact, this had me realise the term isn't some kind of in joke spawned of a colleague's mind, but actually a meme in the progess of becoming one
tracker1 · 2 years ago
Chad Gipity is a good guy... ;-)
tracker1 · 2 years ago
His significant other (Elle Elim) is pretty nice too.
gs17 · 2 years ago
Same, I thought it was some sort of tool related to gyp but for client side.
zarathustreal · 2 years ago
Hmm.. I must be even further out of the loop than you, why would that be embarrassing?
hnbad · 2 years ago
It isn't. They were being self-deprecating.
recursive · 2 years ago
I'm totally down for some good old fashioned impractical hacking. But just remember, we already have canvas, which can do all this easier, faster, and better.
egypturnash · 2 years ago
But with less comedic value. Doing this with nothing but box-shadow is funny, mostly because it is so impractical.
klysm · 2 years ago
Canvas throws away a lot though, especially w accessibility
tkzed49 · 2 years ago
now I'm imagining a screen reader reading off the coordinates of 1000 box shadows
recursive · 2 years ago
Really? I would have guessed that canvas provides pretty much exactly the same accessibility as a UI rendered entirely out of box shadows.
dmazzoni · 2 years ago
Canvas is better...if you're trying to do something that stays within a fixed-size box.
kroltan · 2 years ago
Canvas would still be faster even if you used a full-screen box. Just the string concatenation overhead of doing this with box-shadows is insanely wasteful.

Which isn't to demerit the hackish creativity of taking one thing and running with it! But if you wanted to do a ball painting effect like that outside this "what if" context, it would be technically irresponsible to do it with box-shadows.

hnbad · 2 years ago
Sure, and we already have keyboards, so there's no need to use floppy drives or rubber chickens to make music either.
tracker1 · 2 years ago
Looking at the music visualizations was definitely cool. Really miss the old winamp days when you could play music and just run the visualizer full screen. I wish that streaming audio players did this today.
valbu · 2 years ago
Still use Winamp (actually WACUP) with Milkdrop visualizations almost every day. But true that streaming audio players are so basic featureless pieces of software.
moritzwarhier · 2 years ago
Yes it's enraging and really telling.

AVS and Milkdrop could probably run on a toaster today, I'd guess even WebGL would be enough on a smartphone, laptop or similar device with some kind of GPU.

Meanwhile, YTM costs 13€ a month, doesn't have an equalizer, no cross-device sync despite cloud everything... no nothing. Not even gapless album playback.

Once upon a time, I signed up to Spotify in order to have a good conscience, because I grew old and didn't want to keep collecting audio files...

Then Spotify became worse and worse.

For now YTM seems like a better deal, but I still can't even find a free solution to migrate my playlists.

Basically, everything went to shit. The only advantage is not having to illegaly download new music after browsing Discogs.

The disadvantage is, apart from the odd good recommendation, my interest in discovering new music has vanished.

Even new music found on Discogs.

But why bother saving songs to playlists when it's all transient anyway?

That was my main last straw with Spotify — too many good music disappearing from playlists, and steadily worsening recommendations. With rabbit-holes of totally trash AI-generated "music" in between, that didn't stop unless actively skipping.

And YTMs not gonna end any better, I feel.

Just a reminder that all music is transient. And maybe to seek regaining enthusiasm by playing music myself, or going out.

Streaming really has killed "listening to music" and being excited about it for me, and I don't feel it's purely because of old age.

Going to revive my Mp3 collection soon from a backup and download my ~25 records worth listening since 2012 then from Bandcamp instead.

Deleted Comment

butz · 2 years ago
But at the end of the day Firefox and Chrome are still rendering 1px box-shadow differently at 150% browser zoom. Best hopes for Baseline 2025.
yesimahuman · 2 years ago
> It also turns out that some smart people figured out maths hacks to draw rounded boxes for super cheap which UI peeps love because with this hack boxes can be so round as to appear as circles

Any references to learn more about these hacks?

leecommamichael · 2 years ago
Some historic articles on software rendering (the original Bill Atkinson stuff) https://www.folklore.org/Round_Rects_Are_Everywhere.htmlhttp://wg20.criticalcodestudies.com/index.php?p=/discussion/...

A modern 3D accelerated article (using SDF as another commenter suspected) https://mortoray.com/quickly-drawing-a-rounded-rectangle-wit...

rustystump · 2 years ago
I was thinking SDFs and the Bill stuff at time of writing. Read my mind.

Have to add work by Evan Wallace here too as he is a legend.

https://madebyevan.com/shaders/fast-rounded-rectangle-shadow...https://madebyevan.com/webgl-path-tracing/

pmhpereira · 2 years ago
Probably signed distance fields (SDF).
fitsumbelay · 2 years ago
My kind of hackin' Almost like an antichrist to the Josh Comeau posts I've read on the topic https://www.google.com/search?q=josh+comeau+shadows