41554 blogs · [ { "id": "01a0871d-9334-71c0-b677-7986d190a8bc", "title": "Revisiting Yliluoma's ordered dither algorithm", "url": "https://30fps.net/pages/revisiting-yliluoma-2", "published_at": "2026-06-28T21:00:00+00:00" }, { "id": "01a0871d-9334-71c0-b677-7986d1b41bd2", "title": "Should you normalize RGB values by 255 or 256?", "url": "https://30fps.net/pages/255-vs-256-division", "published_at": "2026-05-31T21:00:00+00:00" }, { "id": "01a0871d-9334-71c0-b677-7986d29375ef", "title": "Single-pass palette refinement and ordered dithering", "url": "https://30fps.net/pages/bayer-order-online-kmeans", "published_at": "2026-04-22T21:00:00+00:00" }, { "id": "01a0871d-9334-71c0-b677-7986d365e4d8", "title": "More accurate Doom colormap", "url": "https://30fps.net/pages/doom-oklab", "published_at": "2025-10-29T22:00:00+00:00" }, { "id": "01a0871d-9334-71c0-b677-7986d4456bc0", "title": "Why CIELAB doesn't improve median cut", "url": "https://30fps.net/pages/median-cut-lab-problem", "published_at": "2025-10-23T21:00:00+00:00" }, { "id": "01a0871d-9334-71c0-b677-7986d4483396", "title": "Better sRGB to greyscale conversion", "url": "https://30fps.net/pages/better-srgb-to-greyscale", "published_at": "2025-10-12T21:00:00+00:00" }, { "id": "01a0871d-9334-71c0-b677-7986d531113c", "title": "Mapping to the PICO-8 palette, perceptually", "url": "https://30fps.net/pages/perceptual-pico8-pixel-mapping", "published_at": "2025-09-06T21:00:00+00:00" }, { "id": "01a0871d-9334-71c0-b677-7986d57afc10", "title": "Approximate first principal component", "url": "https://30fps.net/pages/approximate-first-pc", "published_at": "2025-07-16T21:00:00+00:00" }, { "id": "01a0871d-9334-71c0-b677-7986d5d32657", "title": "HyAB k-means for color quantization", "url": "https://30fps.net/pages/hyab-kmeans", "published_at": "2025-07-08T21:00:00+00:00" }, { "id": "01a0871d-9334-71c0-b677-7986d645d2f5", "title": "Palette lighting tricks on the Nintendo 64", "url": "https://30fps.net/pages/palette-lighting-tricks-n64", "published_at": "2025-05-16T21:00:00+00:00" }, { "id": "01a0871d-9334-71c0-b677-7986d7171c48", "title": "Portal flow brings it all together", "url": "https://30fps.net/pages/pvs-portal-flow", "published_at": "2025-01-17T22:00:00+00:00" }, { "id": "01a0871d-9334-71c0-b677-7986d7da9e66", "title": "Fine visibility via clipping", "url": "https://30fps.net/pages/pvs-fine-visibility", "published_at": "2025-01-09T22:00:00+00:00" }, { "id": "01a0871d-9334-71c0-b677-7986d8391dc2", "title": "Coarse base visibility", "url": "https://30fps.net/pages/pvs-coarse-visibility", "published_at": "2025-01-09T22:00:00+00:00" }, { "id": "01a0871d-9334-71c0-b677-7986d92e3eaf", "title": "Portals and Quake", "url": "https://30fps.net/pages/pvs-portals-and-quake", "published_at": "2025-01-09T22:00:00+00:00" }, { "id": "01a0871d-9334-71c0-b677-7986da2d7fde", "title": "A simple way to scale pixel art games", "url": "https://30fps.net/pages/pixelart-scaling", "published_at": "2024-11-26T22:00:00+00:00" }, { "id": "01a0871d-9334-71c0-b677-7986dabe710c", "title": "How to present MS-DOS screenshots", "url": "https://30fps.net/pages/msdos-aspect-ratio", "published_at": "2024-11-14T22:00:00+00:00" }, { "id": "01a0871d-9334-71c0-b677-7986db3e2d41", "title": "How Westwood VQA works", "url": "https://30fps.net/pages/vqa", "published_at": "2024-11-13T22:00:00+00:00" }, { "id": "01a0871d-9334-71c0-b677-7986dbb79032", "title": "Efficiently split a NumPy array into tiles", "url": "https://30fps.net/notebooks/split-to-tiles", "published_at": "2024-11-06T22:00:00+00:00" }, { "id": "01a0871d-9334-71c0-b677-7986dca1292b", "title": "Classic 3D videogame shadow techniques", "url": "https://30fps.net/pages/videogame-shadows", "published_at": "2024-10-24T21:00:00+00:00" }, { "id": "01a0871d-9334-71c0-b677-7986dcb32b6c", "title": "Shader post-processing in a hurry", "url": "https://30fps.net/pages/post-processing", "published_at": "2024-04-05T21:00:00+00:00" }, { "id": "01a0871d-9334-71c0-b677-7986dd363644", "title": "Moving basis decomposition for images", "url": "https://30fps.net/notebooks/mbd-in-2d", "published_at": "2024-03-15T22:00:00+00:00" }, { "id": "01a0871d-9334-71c0-b677-7986ddbd9ed8", "title": "Color quantization with a self-organizing map", "url": "https://30fps.net/notebooks/sompalette", "published_at": "2024-03-07T22:00:00+00:00" }, { "id": "01a0871d-9334-71c0-b677-7986de5e800f", "title": "PCA image color compression experiment", "url": "https://30fps.net/notebooks/pcacolors", "published_at": "2024-03-04T22:00:00+00:00" }, { "id": "01a0871d-9334-71c0-b677-7986de6f3a6c", "title": "Clean pointer serialization in C", "url": "https://30fps.net/pages/clean-pointer-serialization", "published_at": "2024-01-20T22:00:00+00:00" }, { "id": "01a0871d-9334-71c0-b677-7986de9c419f", "title": "Sort a sphere BVH with split planes", "url": "https://30fps.net/pages/sorted-bvh", "published_at": "2024-01-09T22:00:00+00:00" }, { "id": "01a0871d-9334-71c0-b677-7986df665db8", "title": "Annoying details of a Z-buffer rasterizer", "url": "https://30fps.net/pages/z-rasterizer-details", "published_at": "2024-01-03T22:00:00+00:00" }, { "id": "01a0871d-9334-71c0-b677-7986dfd4d43e", "title": "Going up in color bit depth", "url": "https://30fps.net/pages/bit-depths", "published_at": "2023-11-07T22:00:00+00:00" }, { "id": "01a0871d-9334-71c0-b677-7986e09a6d6c", "title": "Image vector quantization is just like creating a tilemap", "url": "https://30fps.net/notebooks/image-vq", "published_at": "2023-04-29T21:00:00+00:00" }, { "id": "01a0871d-9334-71c0-b677-7986e1355b9a", "title": "In-place filtering of an array", "url": "https://30fps.net/pages/inplace-filtering", "published_at": "2023-03-21T22:00:00+00:00" }, { "id": "01a0871d-9334-71c0-b677-7986e229ee9d", "title": "BSP Lessons", "url": "https://30fps.net/pages/bsp-lessons", "published_at": "2023-03-06T22:00:00+00:00" }, { "id": "01a0871d-9334-71c0-b677-7986e2317994", "title": "Full screen triangle optimization", "url": "https://30fps.net/pages/twotris", "published_at": "2023-02-26T22:00:00+00:00" } ] posts Claim your blog
Back to Computer Graphics & Programming with Pekka Väänänen — 30fps.net
Blog · corpus.blog/blogs/30fps.net/posts

Computer Graphics & Programming with Pekka Väänänen — 30fps.net

30fps.net

2026

2025

2024

2023