All Posts

Most Recent Posts:

2022-1-1 Interleaved Gradient Noise: A Different Kind of Low Discrepancy Sequence
2021-12-29 Why Can’t You Design Noise in Frequency Space?
2021-12-27 Not All Blue Noise is Created Equal Part 2
2021-07-11 Inverting a Button Press (Featuring Current Dividers)
2021-06-27 Resistance and Voltage Dividers

222 posts grouped by the following categories:

(Posts TODO – to help me remember things I’d like to write up at some point

Other Publications

2021-08-04 Ray Tracing Gems II Chapter 24 “Using Blue Noise for Ray Traced Soft Shadows”

2021-11-18 Simple But Effective Verlet Game Physics – GDC India 2021
Youtube Video:

2021-12-17 Spatiotemporal Blue Noise
Code and pregenerated textures:
Blog post part 1:
Blog post part 2:
Arxiv Paper on scalar valued STBN:


2022-1-1 Interleaved Gradient Noise: A Different Kind of Low Discrepancy Sequence
2021-12-29 Why Can’t You Design Noise in Frequency Space?
2021-12-27 Not All Blue Noise is Created Equal Part 2
2021-04-11 Perlin Noise Experiments
2020-11-04 Frequency Domain Image Compression and Filtering
2020-07-11 Interpolating Data Over Arbitrary Shapes With Laplace’s Equation and Walk on Spheres
2020-06-14 Casual Shadertoy Path Tracing 3: Fresnel, Rough Refraction & Absorption, Orbit Camera
2020-06-06 Casual Shadertoy Path Tracing 2: Image Improvement and Glossy Reflections
2020-05-25 Casual Shadertoy Path Tracing 1: Basic Camera, Diffuse, Emissive
2020-05-16 Using Blue Noise For Raytraced Soft Shadows
2020-05-10 Ray Marching Fog With Blue Noise
2019-12-07 Bezier Triangles
2019-06-25 Generating Blue Noise Textures With Void And Cluster
2018-11-16 How To: Data Lookups Via Raytracing
2018-08-12 Not All Blue Noise is Created Equal
2018-08-07 Tiled Blue Noise
2018-07-13 Blending an HDR color into a U8 Buffer
2018-07-04 Pathtraced Depth of Field & Bokeh
2018-04-16 Prefix Sums and Summed Area Tables
2018-03-24 An Idea: Raytracing Lookup Tables
2018-03-19 A Very Quick DirectX Raytracing API Primer
2018-03-10 Don’t Convert sRGB U8 to Linear U8!
2018-01-30 What the Heck is Blue Noise?
2017-11-26 Dissecting “Tiny Clouds”
2017-11-03 Animating Noise For Integration Over Time 2: Uniform Over Time
2017-10-31 Animating Noise For Integration Over Time
2017-10-25 Transmuting White Noise To Blue, Red, Green, Purple
2017-10-20 Generating Blue Noise Sample Points With Mitchell’s Best Candidate Algorithm
2017-10-01 Calculating the Distance Between Points in “Wrap Around” (Toroidal) Space
2017-07-10 WebGL PBR Implementation
2017-07-01 Why Are Some Shadows Soft And Other Shadows Hard?
2017-01-09 Raytracing Reflection, Refraction, Fresnel, Total Internal Reflection, and Beer’s Law
2016-09-21 Path Tracing – Getting Started With Diffuse and Emissive
2016-07-28 Fourier Transform (And Inverse) Of Images
2016-03-14 Using Wang Tiles to Simulate Turing Machines
2016-03-05 Matrix Form of Bezier Curves
2016-03-02 Actually Making Signed Distance Field Textures With JFA
2016-02-29 Fast Voronoi Diagrams and Distance Field Textures on the GPU With the Jump Flooding Algorithm
2016-02-21 G-Buffer Upsizing
2016-02-03 Failed Shadertoy “Dust” Game – Browsers Need To Compile Shaders Off the Main Thread!
2016-01-16 Making a Ray Traced Snake Game in Shadertoy
2015-08-19 Gaussian Blur
2015-08-18 Box Blur
2015-08-15 Resizing Images With Bicubic Interpolation
2015-08-09 Cubic Hermite Rectangles
2015-06-19 What is Pre-multiplied Alpha and Why Does it Matter?
2015-04-30 Bilinear Filtering & Bilinear Interpolation
2015-04-23 FlipQuad & FlipTri Antialiasing
2015-04-23 4-Rook Antialiasing (RGSS)
2015-04-22 Quincunx Antialiasing
2015-01-17 Bresenham’s Drawing Algorithms
2014-08-13 Wang Tiling
2014-08-11 Temporal supersampling, flipquads and real time raytracing
2014-06-30 Distance Field Textures
2014-06-22 Analytic Fog Density
2014-02-07 Lots of Skyboxes!
2014-02-03 Converting RGB to Grayscale
2014-01-27 A trip through the Graphics Pipeline
2014-01-22 Shadertoy – WebGLSL pixel shaders
2012-09-25 How to Render the Mandelbrot Set
2012-05-03 MoriRT: Pixel and Geometry Caching to Aid Real Time Raytracing

Original Research / Inventions

2019-03-22 Linear Fit Search
2018-04-23 Taking a Stroll Between The Pixels
2017-05-07 Improved Storage Space Efficiency of GPU Texture Sampler Bezier Curve Evaluation
2016-12-16 Evaluating Points on Analytical Surfaces and in Analytical Volumes Using the GPU Texture Sampler
2016-12-10 Failed Experiment: The GPU Texture Sampler is Turing Complete But That Fact is Pretty Useless
2016-12-08 Evaluating Polynomials with the GPU Texture Sampler
2016-02-22 GPU Texture Sampler Bezier Curve Evaluation
2015-01-24 DAPSE Preview


2020-10-25 When Life Gives You Lemons, Make Random Numbers
2020-06-23 Weighted Round Robin (Weighted Random Integers) Using The Golden Ratio Low Discrepancy Sequence
2019-08-10 Measuring Debug STL Container Perf Cost in MSVC
2017-11-21 Demystifying Floating Point Precision
2017-06-20 SIMD / GPU Friendly Branchless Binary Search
2016-12-06 The Secret to Writing Fast Code / How Fast Code Gets Slow
2016-11-13 Minimizing Code Complexity by Programming Declaratively
2016-10-14 A Data Point for MSVC vs Clang Code Generation
2016-10-03 Is Code Faster Than Data? Examining Hash Tables
2016-09-26 Is Code Faster Than Data? Switch Statements vs. Arrays
2016-09-23 Exploring Compile Time Hashing
2016-05-18 Who Cares About Dynamic Array Growth Strategies?
2016-04-09 Turning a Truth Table Into A digital Circuit (ANF)
2016-02-09 How and Why Cleaning Up Code or Processes Gives Multiplicative Benefits
2015-12-20 Simplifying Boolean Expressions With Karnaugh Maps
2015-12-18 What Happens When you Mix Hash Tables and Binary Searching?
2015-12-14 O(1) Data Lookups With Minimal Perfect Hashing
2015-03-09 HyperLogLog: Estimate Unique Value Counts Like The Pros
2015-02-25 Avoiding The Performance Hazzards of std::function
2015-02-22 Count Min Sketch: A Probabilistic Histogram
2015-02-13 Writing a Basic Search Engine AKA Calculating Similarity of Histograms with Dot Product
2015-02-08 Estimating Set Membership With a Bloom Filter
2015-02-05 Getting Strongly Typed Typedefs Using Phantom Types
2015-02-03 Estimating Counts of Distinct Values with KMV
2013-09-13 External C++ Header Guards
2013-09-09 Alloca and Realloc – Useful Tools, Not Ancient Relics
2013-07-08 Is pre-increment really faster than post increment? Part 2
2013-07-07 A Super Tiny Random Number Generator
2013-07-06 Fast & Lightweight Random “Shuffle” Functionality – FIXED!
2013-07-06 The Incredible Time Traveling Random Number Generator
2013-06-18 Why do you hate me rand()?!
2013-06-08 Fast & Lightweight Random “Shuffle” Functionality
2013-06-08 Efficiently Generate Random Numbers Without Repeats
2013-06-05 Is pre-increment really faster than post increment? Part 1
2013-05-21 The Black Art of sizeof() aka Compile Time Type Deduction
2013-05-11 Lists of Macro Lists
2013-05-07 Macro Lists For The Win – Side B
2013-05-03 Macro Lists For The Win
2013-05-01 Permutation Programming Without Maintenance Nightmares
2012-11-28 Mechanical Computer Quest Part I

Game Dev

2020-03-01 Using Low Discrepancy Sequences & Blue Noise in Loot Drop Tables for Games
2017-09-30 Half Tile Offset Streaming World Grids
2016-04-01 Game Development Needs Data Pipeline Middleware
2014-01-11 Getting Ideal Disk Reads on the Cheap
2012-09-24 Bias And Gain Are Your Friend
2012-09-21 Anatomy of a Skeletal Animation System Part 3
2012-09-21 Anatomy of a Skeletal Animation System Part 2
2012-09-21 Anatomy of a Skeletal Animation System Part 1
2012-09-09 Recording lagless demo videos of a laggy game


2021-04-01 Mean Squared Error is Variance
2020-11-25 Multiple Importance Sampling in 1D
2020-07-26 Irrational Numbers
2020-07-17 Using Low Discrepancy Sequences With Rejection Sampling
2020-06-04 A Link Between Russian Roulette and Rejection Sampling / Importance Sampling
2020-05-03 Guess a Number Between 1 and 10
2020-03-17 Basic Methods For Finding Zeroes and Mins / Maxes of Functions
2020-03-12 Using White Noise to Choose Between Red Noise and Blue Noise
2020-03-10 How Do I Calculate Variance in 1 Pass?
2020-02-09 A Fun 2d Rotation Matrix Derivation
2019-12-01 Calculating Information Entropy
2019-10-25 Bayes’ Theorem Intuition
2019-07-30 Dice, Distributions & Noise Colors
2019-06-1 Taking the Max of Uniform Random Numbers
2019-05-25 Generating Random Numbers From a Specific Distribution With The Metropolis Algorithm (MCMC)
2018-06-12 Monte Carlo Integration Explanation in 1D
2017-08-08 Generating Random Numbers From a Specific Distribution With Rejection Sampling
2017-08-05 Generating Random Numbers From a Specific Distribution By Inverting the CDF
2017-07-25 Counting Bits & The Normal Distribution
2017-05-29 When Random Numbers Are Too Random: Low Discrepancy Sequences
2017-04-10 Solving N equations and N unknowns: The Fine Print (Gauss Jordan Elimination)
2017-03-31 Orthogonal Projection Matrix Plainly Explained
2017-03-13 Neural Network Gradients: Backpropagation, Dual Numbers, Finite Differences
2017-02-20 Multivariable Dual Numbers & Automatic Differentiation
2017-02-07 A Geometric Interpretation of Neural Networks
2017-01-02 Incremental Least Squares Surface and Hyper-Volume Fitting
2016-12-22 Incremental Least Squares Curve Fitting
2016-08-23 Incremental Averaging
2016-08-11 Understanding The Discrete Fourier Transform
2016-03-11 A Sixth Way To Calculate Sine Without Trig
2016-02-19 Normalized Vector Interpolation TL;DR
2015-11-13 Hiding a Lookup Table in a Modulus Operation
2015-09-15 Solving Nested Modulus Equations
2015-09-12 Solving Simultaneous Congruences (Chinese Remainder Theorem)
2015-09-10 Modular Multiplicative Inverse
2015-08-08 Cubic Hermite Interpolation
2015-08-05 Lagrange Rectangles
2015-08-02 Finite Differences
2015-07-28 Rectangular Bezier Patches
2015-07-08 Lagrange Interpolation
2015-07-05 The De Casteljau Algorithm for Evaluating Bezier Curves
2015-06-14 A Fifth Way to Calculate Sine Without Trig
2015-05-25 Easy Binomial Expansion & Bezier Curve Formulas
2015-01-24 Programmatically Calculating GCD and LCM
2014-12-30 Dual Numbers & Automatic Differentiation
2014-12-27 Using Imaginary Numbers To Rotate 2D Vectors
2014-11-04 Four Ways to Calculate Sine Without Trig
2014-08-28 One Dimensional Bezier Curves
2014-08-14 Counting in Binary is a Fractal
2014-08-10 What if My Equation DOESN’T Equal Zero??
2014-03-22 Bezier Curves Part 2 (and Bezier Surfaces)
2014-03-09 Implicit vs Parametric vs Explicit Surfaces
2014-03-04 Bezier Curves
2014-02-20 Soft Maximum vs Hard Maximum
2013-11-13 Transformation Matrix Basics
2013-10-12 Converting To and From Polar / Spherical Coordinates Made Easy
2013-09-17 How to Test Randomness of Numbers

Machine Learning

2019-05-11 Markov Chain Text Generation
2017-12-23 C++ Differentiable Programming: Searching For An Optimal Dither Pattern
2017-03-15 Neural Network Recipe: Recognize Handwritten Digits With 95% Accuracy
2017-03-09 How to Train Neural Networks With Backpropagation
2012-10-23 B.A.M. Neural Networks


2016-10-19 Low Tech Homomorphic Encryption
2016-04-30 Shamir’s Quest: Collect Any 3 Keys To Unlock The Secret!
2015-09-05 Improving the Security of the Super Simple Symmetric Leveled Homomorphic Encryption Implementation
2015-09-05 Super Simple Symmetric Leveled Homomorphic Encryption Implementation
2014-05-18 Feistel Networks – Do They Have to use XOR?
2012-09-17 Encryption 101: Realistic Security
2012-09-16 Cryptography 101: Encryption – Asymmetric Keys
2012-09-15 Cryptography 101: Encryption – Symmetric Keys
2012-09-15 Cryptography 101: Encryption – One Time Pad
2012-09-12 Cryptography 101: Hashing


2020-01-24 IIR Audio & Data Filters – Featuring Biquads
2020-01-15 FIR Audio & Data Filters

Audio Synth / Audio Programming

2018-03-05 Granular Audio Synthesis
2016-07-01 Intro To Audio Synthesis For Music Presentation
2016-06-23 The Beating Effect
2016-06-16 Synthesizing a Plucked String Sound With the Karplus-Strong Algorithm
2015-04-19 Frequency Domain Audio Synthesis – With IFFT and Oscillators
2015-04-14 Decibels (dB) and Amplitude
2015-03-23 DIY Synth: Convolution Reverb & 1D Discrete Convolution of Audio Samples
2015-03-17 DIY Synth: Multitap Reverb
2015-03-17 DIY Synth: Delay Effect (Echo)
2015-03-16 DIY Synth: Flange Effect
2015-03-14 DIY Synth: Basic Drum
2012-06-18 DIY Synth 3: Sampling, Mixing, and Band Limited Wave Forms
2012-05-19 DIY Synth 2: Common Wave Forms
2012-05-14 DIY Synth 1: Sound Output

Quantum Programming

2015-11-06 Quantum Computing For Programmers Part 2: Multiple Qubits
2015-10-17 Quantum Computing For Programmers Part Ib: Bloch Sphere
2015-10-17 Quantum Computing For Programmers Part I: One Qubit
2015-10-12 Quantum Computing References

Network Programming

2018-6-04 A Neat Trick For Compressing Networked State Data

Soft Skills / Not Directly About Tech

2017-11-16 My Old Master: On Optimism
2017-07-03 A Tool To Debug Teams (Knoster)
2017-03-17 Plastic Bag Ban – Semi Reusable Bag Kiosks a Better Solution?
2017-01-24 My Old Master: How to Correct as a Mentor or a Teacher
2015-06-18 Adventures in Learning How to Publish a Research Paper Part 1
2015-05-24 No Bad Code, Creeping Normality and Social Structure Code Organization
2014-07-21 Situational Leadership


2021-07-11 Inverting a Button Press (Featuring Current Dividers)
2021-06-27 Resistance and Voltage Dividers
2021-06-15 Voltage, Amps, Resistance and LEDs (Ohm’s Law)

Interleaved Gradient Noise: A Different Kind of Low Discrepancy Sequence

The python code that goes along with this post can be found at In 2014, Jorge Jimenez from Activision presented a type of noise optimized for use with Temporal Anti Aliasing called Interleaved Gradient Noise or IGN ( This noise helps the neighborhood sampling history rejection part of TAA be more accurate, allowing the … Continue reading

Not All Blue Noise is Created Equal Part 2

In 2017 I wrote a couple blog posts looking at animating noise for integration over time: Recently we put out some research work I did with some other people at NVIDIA that is essentially the part three: This blog post is a follow up blog post to one I wrote in 2018 that showed some … Continue reading

Resistance and Voltage Dividers

When i first started working with electronics, i tended to think of my circuits, or even parts of my circuit, in isolation. The horror of it though is that your circuit is plugged into other things – at minimum a battery, but commonly other devices, or your house and the power grid – and those … Continue reading

Voltage, Amps, Resistance and LEDs (Ohm’s Law)

I’ve taken up learning electronics during the pandemic, and have enjoyed it quite a bit. I’ve been programming for 25+ years, so it’s nice to have something different to learn and work on that is still both technical and creative. It’s cool getting a deeper understanding of how the fundamental forces of nature work, as … Continue reading

Perlin Noise Experiments

I talk and write a lot about noise so people will sometimes ask me about Perlin noise and other types of noise used for procedural content generation. I’m not usually much help because the noise I focus on is more about sampling and stochastic rendering techniques. I was recently ray marching some Perlin noise based … Continue reading