Skip to content
HomeVideosBooksBlogs
AllTop postsTopics
Podcasts
HistoryListsWatch laterLiked videosFollowing

The videos, books, blogs and podcasts Hacker News keeps recommending, all in one place.

VideosBooksBlogsPodcastsAboutPrivacySettings

Data from Hacker News, HackerTube, HackerBooks, HackerBlogs and Open Library. Credits · Not affiliated with Y Combinator.

HomeVideosBooksBlogsPodcasts
Ctrl K
    B

    Bart Wronski

    bartwronski.com · Personal blog · on HN since 2014

    Bart Wronski, a graphics programmer, writes about image processing, texture filtering, rendering and sometimes software engineering practice.

    Visit blogHN submissions
    ProgrammingMathGames
    What HN says

    HN commenters link it for image deconvolution and bilinear filtering explanations, and discuss details of its blur kernels and the half-pixel offset.

    Stats for nerds
    36HN people shared it
    50linked in comments
    1.2Kstory points
    Nov 2025last shared
    2015people per year2025

    Top posts on HN

    1. 1
      Why are video games graphics challenging? Productionizing rendering algorithms
      3 people · 329 points · first shared 2020 · 89 comments on HN
    2. 2
      Bilinear down/upsampling, aligning pixel grids, and that infamous GPU half pixel (2021)
      4 people · 183 points · first shared 2021 · 23 comments on HN
    3. 3
      Is This a Branch?
      3 people · 139 points · first shared 2021 · 74 comments on HN
    4. 4
      Removing blur from images – deconvolution and using simple image filters
      3 people · 131 points · first shared 2022 · 32 comments on HN
    5. 5
      Using JAX, numpy, and optimization techniques to improve separable image filters
      2 people · 101 points · first shared 2020 · 9 comments on HN
    6. 6
      (Unofficial) Insider guide to tech interviews
      1 person · 89 points · first shared 2022 · 20 comments on HN
    7. 7
      On Leaving California and the Silicon Valley
      2 people · 73 points · first shared 2021 · 126 comments on HN
    8. 8
      Separability, SVD and low-rank approximation of 2D image processing filters
      3 people · 55 points · first shared 2020 · 5 comments on HN
    9. 9
      Dithering in Games, Part 1: Simple Quantization (2016)
      1 person · 33 points · first shared 2019 · 7 comments on HN
    10. 10
      Gradients on grids of pixels/voxels – forward, central, and diagonal differences
      1 person · 21 points · first shared 2021 · Discussion on HN

    What HN people wrote when they linked it

    • kragenOct 2025

      The major dithering algorithm that's missing from this list is blue-noise dithering. This is very similar to "ordered dithering"; you can think of ordered dithering as either thresholding the pixel values with a different threshold value on each pixel, following a regular pattern, or as adding a different offset value to each pixel, following a regular pattern, and thresholding the result with a constant threshold. Blue-noise dithering replaces the regular pattern with a random pattern that's been high-pass filtered. This has all the advantages of ordered dithering, in particular avoiding "crawling" patterns during animation, but avoids the repetitive patterns and line artifacts it introduces.

      https://nelari.us/post/quick_and_dirty_dithering/ is the best quick introduction to the technique that I've seen. There's a more comprehensive introduction at https://momentsingraphics.de/BlueNoise.html. https://bartwronski.com/2016/10/30/dithering-part-three-real-world-2d-quantization-dithering/ also demonstrates it, comparing it to other dithering algorithms.

      Ulichney introduced blue noise to dithering in 01988 as a refinement of "white-noise dithering", also known as "random dithering", where you just add white noise before thresholding: https://cv.ulichney.com/papers/1988-blue-noise.pdf. Ulichney's paper is also a pretty comprehensive overview of dithering algorithms at the time, and he also makes some interesting observations about high-pass prefiltering ("sharpening", for…

    • DonHopkinsMar 2022

      Cool, interesting links to code -- thank you! I chased down Intel's paper the code linked to describing how it works on archive.org.

      https://web.archive.org/web/20110317025924/https://software.intel.com/en-us/articles/iir-gaussian-blur-filter-implementation-using-intel-advanced-vector-extensions

      It's not just about using SIMD instructions (they help), and laying out memory to optimize cache performance (which also helps), but most importantly that Gaussian blur is a "separable filter" that you can break up into a horizontal and vertical pass, each of which require a lot fewer memory references (on the order of just two times the number of pixels times the kernel size, instead of the number of pixels times the kernel size squared):

      IIR Gaussian Blur Filter Implementation using Intel® Advanced Vector Extensions

      >This white paper proposes an implementation for the Infinite Impulse Response (IIR) Gaussian blur filter [1] [2] [3] using Intel® Advanced Vector Extensions (Intel® AVX) instructions. [...]

      >The IIR Gaussian blur filter applies equation (1) on each pixel through two sequential passes:
      The horizontal pass: This pass processes the input image left-to-right (row-wise), then right-to-left. The output of the left-to-right pass is added to the right-to-left pass.

      >The vertical pass: Usually, the vertical pass processes the output from the horizontal pass top-to-bottom (column-wise), and then bottom-to-top. Accessing the input column-wise leads to a lot of cache blocks…

    • krackersApr 2025

      As a toy example if you have pixels a,b,c and you blur to (a+b)/2,(b+c)/2, you can recover back c - a. You might be able to have a good estimate of the boundary condition ("a"), e.g. you can just use (a+b)/2 as an approximation for "a", so the recovered result might look fairly close.

      You'll basically want to look up the area of deconvolution. You can interpret it in linear algebra terms as trying to invert an ill-conditioned matrix, or in signal processing terms as trying to multiply by the inverse of the PSF. In real-world cases the main challenge is doing so without blowing up any error that comes from quantization noise (or other types of noise).

      See https://bartwronski.com/2022/05/26/removing-blur-from-images-deconvolution-and-using-optimized-simple-filters/ and https://yuzhikov.com/articles/BlurredImagesRestoration1.htm

    • malkiaMar 2015

      Assasin's Creed mentions of Geometry Shaders being used - (March, 2014, GDC) - https://bartwronski.files.wordpress.com/2014/03/ac4_gdc.pdf

      possibly many others.

      EDIT: Here is much more updated version (4 versions actually with much more detailed images/video and more notes) - from the author's web-page - http://bartwronski.com/2014/05/09/digital-dragons-2014-slides/

      oh, and if you are looking for some fun graphics failures :)

      http://igetyourfail.blogspot.com/2009/02/behold-power-of-geometry-shaders.html

    • vanderZwanNov 2021

      I've experimented with that. It only works if you pick you pick a form of ordered dithering, like a Bayer index or Interleaved Gradient Noise[0][1]. Which looks pretty terrible compared to error diffusion dithering approaches like Sierra3. And even if you use ordered dithering it only somewhat helps with compression.

      [0]https://bartwronski.com/2016/10/30/dithering-part-three-real-world-2d-quantization-dithering/

      [1] https://www.iryoku.com/next-generation-post-processing-in-call-of-duty-advanced-warfare

    • joshvmMar 2020

      I meant about where this line comes from:

      mask = masks[0][0]

      Presumably 0 is the class ID? For someone new to ML or object detection, it might not be obvious why you take the first channel here.

      Also recent related reading: https://bartwronski.com/2020/03/15/using-jax-numpy-and-optimization-techniques-to-improve-separable-image-filters/

      HN Discussion: https://news.ycombinator.com/item?id=22590360&ref=hvper.com&utm_source=hvper.com&utm_medium=website

    Related

    Fabian Giesenfgiesen.wordpress.com200 people

    Why do CPUs have multiple cache levels?

    Fabian Giesen
    Personal · last shared 2026
    Josh Barczakjoshbarczak.com18 people

    OpenGL Is Broken

    Josh Barczak
    Personal · last shared 2025
    Surmasurma.dev67 people

    Ditherpunk: The article I wish I had about monochrome image dithering

    Surma
    Personal · last shared 2025
    Ignore the Codeignorethecode.net112 people

    Oberon (2009)

    Ignore the Code
    Personal · last shared 2026
    Shape of Everythingshapeof.com30 people

    We Need A Standard Layered Image Format

    Shape of Everything
    Personal · last shared 2026
    Inigo Quileziquilezles.org210 people

    Articles on fractals, computer graphics, mathematics, demoscene and more

    Inigo Quilez
    Personal · last shared 2026
    Christoph Petersmomentsingraphics.de15 people

    Goodbye C++, Hello C

    Christoph Peters
    Personal · last shared 2026
    Aras Pranckevičiusaras-p.info79 people

    I accidentally Blender VSE

    Aras Pranckevičius
    Personal · last shared 2026