Projects I’m working on and things I’m learning.

I don’t know why you’re here, but I’m glad that you are. Leave a comment, and I’ll reply when I have time. Feedback, questions, and personal thoughts are welcome!

  • Designing A Shader Language For My Engine

    Over the past six months, I took a break from writing because I simply couldn’t find a way to make it fit into my personal life, which had become unusually busy. Even so, I have been able to make time to tinker with some game-adjacent projects. As life is thankfully calming down a bit, I’m realizing that I’ve accumulated a healthy backlog of posts that I’m excited to start working through. To start off, I’m beginning a series on the design and implementation of a custom shader language, which I’m calling “slim” for now.

  • Specular Lighting Nuances in the Phong Model

    The Phong lighting model can produce some pretty realistic looking simulated light, considering its simplicity. To give a very brief summary, it includes 3 components: ambient, diffuse, and specular lighting. When combined, these components produce a believable lighting effect. The specifics of this model are described elsewhere on the internet, but I wanted to share some nuances that I encountered while implementing the specular component.

  • Real Time Speech to Text With Whisper

    Some friends and I were curious whether we could believably mimic a human phone caller using LLMs. We imagined a system where users can dial in, speak to a computer, and have an experience that feels truly human. Aside from generating sensible responses, the system would need to keep a conversational cadence, avoiding awkward pauses.

  • The Journey So Far: Update 1

    After returning to game engine development after some time off, it feels like a great time to reflect on what I’ve built and what’s next. I’m quite happy with the way things are shaping up, and I’m getting closer to the point where I think it makes sense to start exploring physics.

  • C++ Project Structure Revisited

    As I was setting up my first non-trivial C++ project, my guiding principal became, “do whatever works, address problems as they arise”. I wrote a quick CMake file to compile a short list of source files and dependencies into a binary, which I used to create my first working graphics application. However, when I tried to add some basic unit testing capabilities, I hit a wall. This led to some significant configuration and organization improvements that I think are worth sharing.

  • Homogeneous Coordinates and Trivial Matrix Transformations

    Imagine a 5 second clip from your favorite game. Maybe you’re holding a corner to block enemy players from their objective. Or, maybe you’re locked onto an enemy and dodge-rolling away from an attack. Maybe you’re spinning the camera around your character to admire some cool looking armor you spent the last few hours grinding for.

  • 2D Projection and the Dot Product

    In the context of graphics programming, linear algebra can feel like a set of magic rules that, if applied correctly, produce realistic looking simulations of 3D space. Applying these rules is easy but, at the same time, completely unsatisfying without understanding why they work. So, as a first step, I decided to break down one of the simplest, most foundational operations of linear algebra: the dot product.

  • Graphics Programming and Processing

    Graphics have always been a complete black box to me, and I would venture to guess that most programmers feel the same way. I attribute this to the fact that graphics are often only accessible through several layers of (usually leaky) abstraction. For example, most web developers have optimized an application by avoiding repaints or utilizing hardware acceleration during animations. But what does this actually mean, under the hood? How do we interface with graphics hardware as programmers? How do pixels end up on the screen?

  • Goals and Project Setup

    A journey of a thousand miles starts with a single step. Most of the time, it doesn’t matter which direction that step takes you — only that you take it. In this case, a reasonable first step might include articulating a goal, then getting something trivial working toward that end.

  • The Case for a Custom Game Engine

    I am building a game engine, and I know next to nothing about how they work. As I progress, I’ll document my thoughts and learnings here.