Sign in

Pekka Väänänen

@pekkavaa.bsky.social
1.2K followers 407 following 352 posts

Avid reader, computer graphics fan and atmospheric jungle beats enjoyer. Demoscene: cce/Peisik. Blog at 30fps.net

PostsRepliesMedia
Pekka Väänänen @pekkavaa.bsky.social · 3h
Well, at least the intro chapter will be kickass😅 Material on Reilly's method: ennisart.blogspot.com/2010/12/reil... ennisart.blogspot.com/2010/11/muns...
ennisart.blogspot.com
The Reilly Palette: a Palette of Convenience
To set up the figure-painting palette, you must first create the string of neutral control values described in the previous post. By the 197...
010
Pekka Väänänen @pekkavaa.bsky.social · 3h
I'm still working on the Palette Programming book. I planned an Early Access release for October with roughly half the chapters. But the last few writing sessions I've just spent studying the differences between the impressionist and the divisionist techniques and Frank J. Reilly's palette premixing
150
Pekka Väänänen @pekkavaa.bsky.social · 09/10/2026
Color science in the wild: "Beer color is measured in Degrees Lovibond, a metric based on the Munsell system" en.wikipedia.org/wiki/Beer_me...
en.wikipedia.org
Beer measurement - Wikipedia
050
Pekka Väänänen @pekkavaa.bsky.social · 05/10/2026
Yes! My website has an Atom feed: 30fps.net
30fps.net
Computer Graphics & Programming with Pekka Väänänen — 30fps.net
020
Pekka Väänänen @pekkavaa.bsky.social · 17/09/2026
The E3 demo in question: www.youtube.com/watch?v=8ZJ4... Naturally, the in-game shots begin with a shiny parallax mapping and Havok physics show :) Followed by Patrick Stewart hype second. Interesting how they had soft shadows in the demo but cut them from the game before release.
youtube.com
The Elder Scrolls IV: Oblivion - E3 2005 Demo
Official demo of The Elder Scrolls IV: Oblivion by Todd Howard, first shown at E3 2005, published 18 May 2005. The Elder Scrolls IV: Oblivion release dates: - Windows PC: 20 March 2006 - Xbox 360:…
010
Pekka Väänänen @pekkavaa.bsky.social · 17/09/2026
I enjoyed this 41 minute documentary filmed before the E3 2005 reveal of Elder Scrolls IV: Oblivion www.youtube.com/watch?v=zvm0... Found it funny how they staged a scene of artists traveling to Washington D.C. to capture textures for the game's Imperial City.
youtube.com
The Making of Oblivion (FULL | HQ | ENG)
Making of GOTY 2006
130
Pekka Väänänen @pekkavaa.bsky.social · 14/09/2026
I decided to discuss this in my book so I made this plot today. Still need to edit the caption for clarity. Surprisingly, 2-LSB triangular noise didn't hide banding in an error plot. I don't understand why. Some "waves" also seen here. Also unclear why exactly does changing to uniform work at all...
020
Reposted by Pekka Väänänen
Max (VGCartography) @vgcartography.com · 11/09/2026
nintendo 64 desertification 🏖️
shifting sand landangry aztecgobi's valleydindom dries
27823
Reposted by Pekka Väänänen
Don Williamson @donw.bsky.social · 09/09/2026
In ~2007 when coding the ambient lighting of Splinter Cell, I had the idea of storing dynamic SH probes in Voronoi cells, where a) dynamic objects could walk/lerp the face graph, and b) static meshes "palettised" probes per vertex and lerped to give Realtime GI. It never shipped but look how pretty!
410515
Reposted by Pekka Väänänen
Jason Scott @textfiles.com · 08/09/2026
Of all the formats for newsletters, zines and information indexes, I'd honestly have not thought people would use WinHelp format. But Vannevar K has collected hundreds of examples of WinHelp formated documents, all conveniently emulated in Windows 3.1.
2377
Pekka Väänänen @pekkavaa.bsky.social · 07/09/2026
I didn't know it was unfinished. Really interesting. Also, apparently I missed the crypt on my visit! :(
001
Pekka Väänänen @pekkavaa.bsky.social · 07/09/2026
It's an incredible building. Almost felt "overdesigned" as if the architects wanted to one-up every other basilica ever!
110
Pekka Väänänen @pekkavaa.bsky.social · 07/09/2026
And a final clarification: the example comparison I attached is error diffusion indeed and not ordered dithering. There grayscale amplitude*(1,1,1) noise is added to the error-compensated color before looking up the closest color in the palette. So it's dithering type A applied to dithering type B😃
100
Pekka Väänänen @pekkavaa.bsky.social · 07/09/2026
To be clear, I'm talking about ordered dithering. In error diffusion, it's clear that you need linear RGB for the output to visually mix to the original color (when seen from a distance). So my reasoning is that the same should apply to ordered RGB dithering too.
100
Pekka Väänänen @pekkavaa.bsky.social · 07/09/2026
In my case, the noise amplitude has to be larger. It's a 16-color image and the individual output levels are spread wider. So it's not too far from Lottes' HDR->SDR dithering situation. I *think* linear space noise makes more sense then and it needs a constant amplitude to average to 0.
100
Pekka Väänänen @pekkavaa.bsky.social · 07/09/2026
Thank you. This was a great summary (I've studied the INSIDE slide deck earlier). So in this case, you add 2LSB TPDF noise to the gamma-space values before integer quantization (done by the GPU as trunc(x+0.5)) but switch to 1LSB [-0.5, 0.5] rectangular noise for c<0.5/255 and c>254.5.
100
Pekka Väänänen @pekkavaa.bsky.social · 04/09/2026
I've been racking my brain over linear space dithering. Adding noise sounds simple but how much, exactly? Finally, I found a trick: scale the dither down near zero. Found from Timothy Lottes 2016 slide deck. Attached is an exaggarated example.
A two-pane comparison of Floyd-Steinberg dithering with threshold noise. Left: linear space noise is added with constant magnitude. Right: linear space noise but magnitude is scaled down near zero.A slide from "Advanced Techniques
and Optimization of
VDR Color Pipelines" by
Timothy Lottes (2016)

https://gpuopen.com/download/GdcVdrLottes.pdf
1302
Reposted by Pekka Väänänen
Collin Allen @command-tab.com · 03/09/2026
The #N64 development scene has been making huge strides recently. I blogged about where things stand right now: Also, that chunky header image took a *while* to make 🥹
command-tab.com
The Nintendo 64 Renaissance
The N64 homebrew scene now has better developer tools and support than ever
0153
Reposted by Pekka Väänänen
Nelarius @nelarius.bsky.social · 31/08/2026
While investigating #voxel rendering alternatives that don't involve generating triangles, I ran into the "Voxel GI with Nested Axis-Aligned Distance Fields" paper. github.com/cg-tuwien/NA... Super promising method, with adapted code, I can render RTAO with 1 billion voxels on an M2 Macbook Air!
091
Pekka Väänänen @pekkavaa.bsky.social · 01/09/2026
I went and checked and actually I used a trick by Timothy Lottes: launch all levels of Z pyramid in a single pass but the lower levels start at t=0 if their parent didn't finish yet. Gave a 20% boost. My messy writeup if you happen to be interested: peisik.untergrund.net/rendering_et...
peisik.untergrund.net
Rendering Eternal Fortress
We store 20 million points in a big fat ring buffer, and on each frame we add about two million (1920 × 1080, one ray per pixel) new ones to it, dropping out the oldest points.
130
Pekka Väänänen @pekkavaa.bsky.social · 01/09/2026
Super neat. I've done this as a separate "Z prepass" and I recall it was difficult to choose the cone size and the later ray start position to be conservative but not too large.
100
Reposted by Pekka Väänänen
Nexxtic (Selaco Lead Dev) @selaco.bsky.social · 27/08/2026
Being able to bake shadows into the Doom Engine is so freaking cool.
2136673
Pekka Väänänen @pekkavaa.bsky.social · 25/08/2026
Hexagonal-grid dithering looks pretty wild up close, especially the 50% case here. A crop of a figure from "Alpha stable modeling of human visual systems for digital halftoning in rectangular and hexagonal grids" by González et al. 2008.
0130
Pekka Väänänen @pekkavaa.bsky.social · 17/08/2026
Updated the article with a discussion on this 2023 blog post by Chris Lomont: lomont.org/posts/2023/a... Link to the new section: 30fps.net/pages/255-vs...
A reconstruction error plot with "Input value" on the X-axis and "Reconstruction error" on the Y-axis. Three thick bands where the blue "Standard" and orange "Alternative" lines are very similar. A green "Third" band goes over the plot diagonally, showing high negative error near 0.0 and high positive error near 1.0.
040
Pekka Väänänen @pekkavaa.bsky.social · 05/08/2026
Exactly right. Even a poor VGA cable would probably add just horizontal blur. Here I took photos on an LCD screen with HDMI and VGA and a weak argument could be made that perhaps some art was authored with the "horizontal blur" in mind. I have no idea if that actually happened.
020
Reposted by Pekka Väänänen
Robin Green @fatlimey.bsky.social · 03/08/2026
Ever wondered what a test card is for? TV signals are encoded in the YUV or YCbCr color spaces. A vectorscope is just the CbCr or UV part of the signal in 2D. Running a SMTPE test card through the scope gives you a zigzag pattern where it visits the center of each primary box in a specific order.
The SMTPE test card, electronically generated.An oscilloscope image with lines and boxes printed on the screen. The green lines of the oscilloscope are tracing out a pair of interlocking zigzags that exactly hit the centers of the boxes. Science!
181
Pekka Väänänen @pekkavaa.bsky.social · 05/08/2026
Others have given many good suggestions of existing fantasy worlds already but let me point out yet another one: plastiboo's Vermis: hollow-press.net/products/cop...
hollow-press.net
"Beware of the states that can permanently damage your flesh and mind" limited VERMIS print (New Version)
"Beware of the states that can permanently damage your flesh and mind"limited VERMIS printby PlastibooNEW VERSION!SIGNED by the artistBuy the books HEREBuy one of the few original artworks available H...
010
Pekka Väänänen @pekkavaa.bsky.social · 04/08/2026
What do you call the act of inserting an element to a sorted list? "Insort" of course... A snippet of a guide in the Python language docs.
030
Pekka Väänänen @pekkavaa.bsky.social · 04/08/2026
An interesting insider view from the SGI side to Nintendo 64's development and launch: steveshepard.com/blog/making-...
060
Pekka Väänänen @pekkavaa.bsky.social · 29/07/2026
Incredible work. Thank you!
010
Pekka Väänänen @pekkavaa.bsky.social · 29/07/2026
"Kodak Lab notebook entry showing Bayer Pattern" en.wikipedia.org/wiki/Bryce_B...
en.wikipedia.org
Bryce Bayer - Wikipedia
Bryce Edward Bayer (/ˈbaɪər/; pronounced BYE-er, August 15, 1929[1] – November 13, 2012) was an American scientist who invented the Bayer filter pattern,[1] which is used in most modern color digital…
010
Pekka Väänänen @pekkavaa.bsky.social · 20/07/2026
Very convincing. They look great.
110
Pekka Väänänen @pekkavaa.bsky.social · 20/07/2026
Hey that's a cool idea. Not sure how exactly it would work but at least some sort of "good neighbors for dithering" matrix could be built. I also got decent results by emphasizing luminance and hue differences more in color selection (at the expense of saturation error) without any explicit ramps.
011
Pekka Väänänen @pekkavaa.bsky.social · 20/07/2026
Cool! How do you use the dither matrix in color selection, if I may ask? Do you apply it as additive noise and then perform per-pixel closest color search (I called the "offset" approach in my text), or something different?
000
Pekka Väänänen @pekkavaa.bsky.social · 15/07/2026
Got me even though I knew it was coming
100
Pekka Väänänen @pekkavaa.bsky.social · 15/07/2026
An update on this: I tried the DAG method of eastfarthing.com/blog/2016-05... but couldn't get it to work. I tried the C64 palette and the greatest distance found is between black and dark cyan. Using that distance to find neighbors connects many colors 10 others so its not useful for finding ramps.
eastfarthing.com
Mapping Pixel Art Palettes
While researching pixel art palettes, I noticed a lot of discussion about color ramps. I've come up with an alternative to crossword-style layouts.
100
Pekka Väänänen @pekkavaa.bsky.social · 13/07/2026
Another good find from Bouman's image processing course: CIELAB DeltaE is intended for comparing larges swathes of color, not individual pixels. Source: engineering.purdue.edu/~bouman/ece6...
Warning: Don't Abuse Lab Space

Lab color space is designed for low spatial frequencies.
- It is very good for measuring color differences in objects.
- It is the standard for measuring paint color.
- It is good for measuring color accuracy of printers and displays.

Direct application to images works poorly.
- Lab does not account for high spatial frequency content of images.
- Lab formulation ignores different form of CSF for luminance and chrominance spaces.
- Image coding in Lab space will produce poor results.

C. A. Bouman: Digital Image Processing - January 11, 2026
090
Pekka Väänänen @pekkavaa.bsky.social · 13/07/2026
Useful dithering (digital halftoning) related notes: engineering.purdue.edu/~bouman/ece6... They are from Charles A. Bouman's Spring 2026 "Digital Image Processing I" course, Purdue University.
engineering.purdue.edu
090
Pekka Väänänen @pekkavaa.bsky.social · 10/07/2026
I just read about it recently. I think it's beautiful that the printing community has given it such a cute name. Discovering that combination of angles must have been a relief😅 I've also heard that yellow is sometimes printed using some sort of dithering while other inks keep the clustered-dot shape
010
Pekka Väänänen @pekkavaa.bsky.social · 09/07/2026
I've read that newspaper-like halftone patterns are laid out in a 45-degree angle because the human eye is less sensitive to that than to straight grid lines. But wouldn't a simpler explanation be that newspaper photos of streets and buildings have straight lines, so a rotated pattern works better?
160
Pekka Väänänen @pekkavaa.bsky.social · 08/07/2026
www.indiegamemusic.com used to be a thing way back and looks like they are still in business
indiegamemusic.com
Indie Game Music
Bringing music artists and game developers together
050
Pekka Väänänen @pekkavaa.bsky.social · 08/07/2026
The Mona Lisa mapped to the Commodore 64 palette by taking only pixel lightness into account. Two algorithms: N-Convex (left) always tries to dither the result while in Knoll's algorithm (right) dither strength can be tuned.
081
Pekka Väänänen @pekkavaa.bsky.social · 30/06/2026
Thanks for the feedback. The phone-reading experience is not the best and you're not the first to notice this. I'm not sure what's the best option is. "First" and "second" feel strange when the images are side by side. Perhaps labels like (a), (b) etc. would be the most neutral?
100
Pekka Väänänen @pekkavaa.bsky.social · 29/06/2026
A new article: Revisiting Yliluoma’s ordered dither algorithm 30fps.net/pages/revisi... It's a deep dive to a single "color selection algorithm" used for ordered dithering. Nothing groundbreaking but I did uncover a neat simplified version that works OK. It's technical but with visual examples.
A graphic showing a side-by-side comparison of three versions of the same image, each processed with a different dithering algorithm.
The image consists of three vertical panels arranged horizontally, with a text summary located at the bottom. Each panel features a stylized bird from the Big Buck Bunny animated short. A yellow beak and large eyes, sitting on a branch. A blue-to-pink gradient sky and green leaves in the background.

The three panels:

Yliluoma's 2nd dithering algorithm: Dithered result with the most noise.
EMA-Constant: Significantly smoother result.
Knoll (10% strength): Smooth result similar to EMA-Constant.

Text at the bottom:
Summary: This article discusses Yliiluoma's 2011 ordered dither algorithm (left), explains its internals in greater detail than other treatments, presents new simplified variants (middle), and compares the results to a state-of-the-art algorithm (right). Source code is included at the end.
A 2x2 grid comparing four versions of the same pixel-art scene from the 1999 Chrono Cross video game: three characters in a detailed interior room with curtains and windows. Each version uses a different dithering technique.

The images are labeled (top-left to bottom-right): "EMA-Exact", "EMA-Constant", "Knoll (20% strength)", and "Knoll (10% strength)".
22612
Pekka Väänänen @pekkavaa.bsky.social · 26/06/2026
Trying to finish a new blog post on ordered dithering. It's been _so_ much work but I think it's turning out really interesting.
A six-pane comparison of a Chrono Cross screenshot reduced to a 16-color fixed palette. Each pane shows a different result and they all are somewhat noisy. The panes are labeled EMA-Sweep, EMA-Exact, EMA-Constant, Yliluoma-2, Yliluoma-2 (no luma weighting), Knoll (30% strength).
0130
Pekka Väänänen @pekkavaa.bsky.social · 23/06/2026
Not too far from maximin (max coverage) algorithm that adds to a palette the image color that's furthest from the colors chosen so far. Its probabilistic version is the industry standard k-means++ init. So yeah sounds like a great idea and looks pretty too :)
110
Reposted by Pekka Väänänen
Ruben S. @atomicagegames.co.uk · 22/06/2026
Tried my hand at a 90s pre-rendered CGI aesthetic in Unity for a game jam #GameDev #IndieDev
88516
Pekka Väänänen @pekkavaa.bsky.social · 18/06/2026
An incredible blog post on ordered dithering in color. Perhaps I shared this before but it deserves to be seen: matejlou.blog/2023/12/06/o...
matejlou.blog
Ordered Dithering with Arbitrary or Irregular Colour Palettes
Introduction Hello. I have recently been spending a lot of time dithering. In image processing, dithering is the act of applying intentional perturbations or noise in order to compensate for the in…
0110
Pekka Väänänen @pekkavaa.bsky.social · 12/06/2026
That makes a lot of sense, it's the same clock both for memory reads and the monitor horizontal sync. Thanks!
020
Pekka Väänänen @pekkavaa.bsky.social · 12/06/2026
My new hobby: Taking holiday photos with multiple exposures to create fake GDC slides afterwards.
A PowerPoint slide titled "Cathedral Church of Saint Vitus". There is a three-pane comparison images labeled "Direct and emissive", "Indirect diffuse (baked)" and "Final render (Xbox One)". The background color is black and at the bottom there's a grey text "Rendering Secrets of 'Pekka's Two Nights in Prague'"
0548