Photo of Cody Coker
  
Cody Coker
Graphics & rendering engineer.
Durham, NC Lead engineer at Moth + Flame Probably listening to Alex G

I write shaders and rendering systems. Mostly in Unity, mostly in HLSL, mostly on mobile XR hardware where the frame budget is unforgiving and the tile-based GPU has very tile-based opinions.

The work I care about lives at the intersection of what looks beautiful and what fits inside 11 milliseconds. That intersection is small, and finding the version of a beautiful idea that lives there is the whole gig.

Contents
01

Raymarched planetary volumetric clouds/atmosphere

Clouds wrapped around a sphere, generated by particles moving according to simulated wind bands that we then stamp a heightmap onto as they drift across the planet. The raymarch shader samples the heightmap to determine density along each ray.

Naive raymarching of a planetary atmosphere is brutal. One trick is temporal amortization: render a fraction of the pixels every frame, write them into a history buffer, and reproject the history forward as the camera moves. Another trick is extensive use of precomputed LUTs to reduce the cost of raymarching itself.

02

GPU-driven volumetric dust with persistent accumulation

A Mk19 automatic grenade launcher kicks up an absurd amount of dust, which can be a genuine targeting concern. The training app needed that to feel right: long-lasting plumes that settle slowly and accumulate with repeated impacts.

The approach I went with was a 2D heightfield projection. Each explosion writes a circular density-and-height stamp into a world-spanning RenderTexture. A compute shader handles diffusion and natural settling. The raymarching shader uses 3D worley noise to erode the dust for a more organic appearance. The player position is static and the experience is overcast, so I was able to get away with some low-iteration, subtle lightmarching to enhance the dimensionality of the dust. And since the dust is visually low-frequency (and accompanied by separate, higher-frequency particle effects), quarter res rendering with temporal amortization met both our visual and performance goals.

03

Screenspace planetary borders via jump flooding

Province borders on a planet sphere, the way Paradox grand strategy games render them on flat maps. The obvious approach (bake borders into an equirectangular texture) breaks at the poles where the projection compresses one axis into a singularity. It doesn't work for spheres (at least if you want them to look good).

The fix is to do the whole thing in screen space. Render an intermediate province ID buffer, then run jump flooding across the buffer to compute, for each pixel, the distance to the nearest pixel of a different province ID. Boom, beautiful undistorted borders on a spherical planet.

04

Multithreaded ECS-based Earth-scale terrain

Whole-planet terrain that builds itself as you fly around it. New mesh chunks are generated asynchronously on a DOTS job system as the camera moves, so the main thread never stalls waiting on geometry. Chunks stream in across frames and hand their finished meshes back when ready.

Each chunk's surface is procedurally generated from a planetary heightmap index map, and then further modified by a coarse global height texture. Every pixel points at a specific heightmap to sample, letting different regions pull from purpose-built high-fidelity terrain instead of one stretched global texture. Parallel jobs do the per-vertex sampling and mesh construction.

At Earth scale, float precision falls apart thousands of kilometers from the origin and geometry starts to jitter. A floating origin system continuously recenters the world on the camera, keeping everything close to zero so positions stay precise no matter how far you've travelled.

05

Indirect flight path rendering

Battlespace-scale F-16 engagement telemetry rendered as procedural flight-path geometry. A compute shader builds the ribbon mesh directly from the telemetry buffer each frame and issues a DrawIndirect call, so the CPU never touches vertex data.

06

Performant instanced indirect text rendering

Rendering a massive amount of on-screen text without the per-character draw call overhead that normally makes that impossible. Characters are drawn as SDF quads via a single instanced indirect draw call, so all text in the view costs only one call regardless of how much is on screen.

The performance additionally comes from CPU-side data locality: character instance data is cached and laid out for sequential access so the CPU can rip on it with minimal cache misses (this is where the fade behavior lives). Per-instance fade is computed from the view, letting every label fade in and out smoothly against the camera for next to nothing. It's basically TextMeshPro after it decided to start lifting and glow up. (I accidentally typed TexMexPro just now and now I'm hungry.)

07

Part-highlighting shader system

The interaction layer behind every Procedures module. Custom fresnel emission shader marks interactive parts, a proximity term drives error highlighting that responds to hand position, and a dithered fade lives entirely in the opaque pipeline to dodge alpha-blending cost on tile-based mobile GPUs.

08

GPU quadtree planetary LOD

Continuous level of detail with the entire quadtree living and updating on the GPU. The CPU never sees a node or a triangle. The quadtree subdivides toward the camera. Every leaf node carries a compact bit-packed key: three bits for the cube face, then two bits per level encoding which of the four children it descends into, with the highest set bit marking the node's depth. The full path (the patch's position and size) is recovered straight from the key with bit ops.

Each frame the tree is refined by ping-ponging two append/consume buffers: a compute pass consumes the current set of leaves and writes the next generation. Leaves close to the camera split into four children; leaves that have fallen far back collapse into their parent; the rest pass through untouched.

The surviving leaves emit their triangles into an append buffer that's drawn directly with DrawProceduralIndirect. A tiny helper pass turns the appended triangle count into the vertex count for the indirect draw args via CopyCount and an indirect dispatch, so the GPU drives its own draw with zero readback. The CPU's whole job each frame is handing over the camera matrices and kicking off the dispatches.

09

GPU atmospheric pressure simulation

A personal project: a space station whose hull you can breach. The interior is a grid where every cell carries pressure, velocity, temperature, and a gas mix, tagged as open, wall, or vacuum. It's built from the ship's actual tile layout, so walls seal rooms, an open door connects two of them, and the edge of the world is open space sitting at zero pressure.

Every fixed step a compute shader runs a diffusion relaxation pass over the whole grid: each cell pulls its pressure toward the average of its eight neighbors, the same kind of iterative solve behind stable-fluids diffusion, converging over successive frames. Walls are masked out with branchless comparisons rather than if branches, so air only moves between connected cells and a sealed room holds its room pressure indefinitely. Velocity falls straight out of the pressure gradient (gas accelerates from high pressure toward low) and any cell exposed to space is pinned at zero, turning a breach into a sink the entire compartment drains toward.

Blow a hole in the hull and those cells flip to open vacuum; the solver does the rest, evacuating the room in a rush of decompression that settles once it's resealed or fully empty. The velocity field is pulled back to the CPU with an async GPU readback (no pipeline stall) and fed into the particle systems, so dust and debris get dragged toward the gap along the real airflow. It runs in real time on grids up to 1024×1024 at about a million cells a step using ping-pong buffers.

10

Log-depth vertex reprojection

Planetary rendering at solar system scale spans absurd depth ranges far outside of a single camera's typical view frustrum. This approach "squashes" far away vertices back into the camera's view frustrum, modifying the depth buffer and calculating scale and foreshortening to make objects look correctly distant.

You can see in the example that the camera's far plane only has a depth of 10 meters, but it still correctly renders objects out an arbitrary distance.

11

Separable downsampled gaussian blur

A blur used across a mobile app with 100k+ daily active users, so it had to be cheap. The standard separable trick of two 1D passes instead of one 2D kernel plus downsampled render to hit the frame budget on low-end hardware. This was years ago and they're still using it. 😎

Software I've shipped. Most of it is VR training built at Moth + Flame for defense and enterprise customers. A few earlier projects from before that.

Each one was a real product with users, deadlines, and the kind of scope creep that comes from building things people actually depend on.

Contents
01

Procedures

VR training for procedure-based aircraft repair, maintenance, and operation. Deployed to 20+ military organizations across 70+ training modules covering 10 to 20 different airframes.

I built the custom highlighting and feedback shader system that powers the interaction layer of every module: stencil-buffer outlines, world-space proximity-driven error highlighting that responds to hand position, and a dithered fade implemented in the opaque pipeline to avoid alpha-blending costs and transparency artifacts on tile-based mobile GPUs.

I also built the procedure-authoring toolchain, including an Electron-based app that talks to Unity over local WebSocket so producers and external authors can resolve part references against a live scene without needing the Unity editor open.

02

Conversations

VR training catalog covering difficult interpersonal conversations: performance reviews, difficult feedback, sensitive topics. Around 10,000 enterprise users across 150+ training modules.

The piece I'm proudest of is the in-VR module editor I built for the creative studio team. It became essential to the studio's module production pipeline. The team could iterate on visual appearance, dialogue pacing, and camera blocking directly in headset rather than through Unity editor roundtrips.

03

Mk19 Training

VR training for the Mk19 automatic grenade launcher. The interesting rendering constraint here was the static user position: the operator stays at the weapon, looking outward. That meant we could lean hard into a texture-projection rendering technique that delivered photorealistic visuals for a fraction of the cost of a general-purpose lighting solution.

The other notable piece is the GPU-driven volumetric dust system, which I cover in detail under Work / 02.

04

F-16 BFM Training

VR training app that lets F-16 pilots visualize basic fighter maneuvers (BFM) from both first-person and god's-eye perspectives. Real engagement telemetry feeds into the app and gets rendered as procedural flight path geometry.

The path rendering is GPU-driven indirect: a compute shader builds the mesh from the raw telemetry data each frame and issues an indirect draw command from the resulting buffer. The CPU does almost no work in the rendering hot loop.

05

Orbital Space Defense Training

VR scenario placing the user in the role of a Space Force operator navigating a control-room encounter with a hostile foreign space asset. Developed solo end-to-end with very positive reception from the customer.

The smallest project on this list and one of the most satisfying. Tight scope, clear stakes, room to actually polish.

06

myKonami Slots

Free-to-play social casino app built on the Konami slots license, with hundreds of thousands of daily active users. I architected critical user-facing features across the live Unity/C# client, working inside the constraints of a mature codebase shipping on a fast release cadence.

I also wrote a performant separable Gaussian blur used throughout the app for backgrounds and transitions, tuned to stay cheap on the low-end mobile hardware that made up a meaningful slice of the player base.

07

JXNMetro360 Augmented

An augmented reality mobile app that projects an interactive map of the Jackson, MS metro onto a physical printed map. Used by the economic development team to walk industry prospects through featured sites across the region.

From the earlier chapter of my career when I was the "creative technology" person at a regional economic development organization. A small project, but the one that convinced me I wanted to keep building immersive software.

Resume

Last updated May 2026 · Also available as a PDF.
Download PDF
CODY COKER
Graphics & Rendering Engineer · Lead XR Engineer

Graphics engineer with a decade of shipped Unity and C# work and a specialization in real-time rendering on tile-based mobile GPUs. I write HLSL, build scriptable render features, ship volumetric effects, and spend a lot of time profiling on-device to understand what the GPU is actually doing. Currently lead engineer at Moth+Flame, where I carry the rendering architecture for VR training products in use by thousands of enterprise and military users.

Professional Experience

Lead XR Software Engineer · Moth+Flame

Remote · April 2023 – Present

Lead engineer carrying the graphics and rendering architecture across a multi-product VR training catalog deployed to enterprise and military customers. Team of 3 covering what was previously around 8, so the role spans more than just rendering: graphics, build pipeline, networking, business logic, and developer tooling. Products ship natively to Quest, Pico, Focus, and desktop VR, with current work targeting Apple Vision Pro and Quest 3.

  • Shipped custom shaders, scriptable render features, and volumetric effects across the product line. Photorealistic and stylized art directions, all inside native mobile XR frame budgets.
  • Optimized rendering on Quest using the full mobile XR profiling stack: RenderDoc (Meta fork), Unity Profiler and the Frame and Rendering Debuggers, Perfetto, ovrgpuprofiler, and Meta Quest Developer Hub.
  • Built our CI/CD pipeline from scratch. Four platforms (Quest, Pico, Focus, desktop VR), per-build content packaging for offline-deployed customers, automated APK signing, distribution to downstream training endpoints.
  • Built developer tooling that let non-engineers produce training content at scale: a full in-VR module editor used extensively by the creative studio team, and a separate Electron-based authoring app for aircraft maintenance procedures. The authoring app talks to Unity over a local WebSocket (so technical producers can resolve references against the live scene, while external authors don't need Unity at all) and syncs to a server backend for parallel multi-author collaboration with live updates.
  • Led code review, technical mentorship, and engineering documentation across the team.

Products I worked on at Moth + Flame:

  • Procedures. VR training for aircraft repair, maintenance, and operation. Deployed to 20+ military organizations across 70+ modules covering 10+ airframes. Completely overhauled legacy architecture and built the full rendering solution and procedure-authoring tooling.
  • Conversations. VR training catalog for difficult interpersonal conversations. Around 10,000 enterprise users across 150-ish modules. Built the in-VR module editor that became essential to the studio's content pipeline as well as numerous other client-side features and some backend work.
  • Mk19 Training. VR training for the Mk19 automatic grenade launcher. Texture-projection rendering exploits the static user position to ship photorealistic visuals at low cost. Volumetric dust system with persistent accumulation (see Selected Work).
  • F-16 BFM Training. VR training for F-16 pilots (later expanded to F-15 and F-35 teams), visualizing tactical engagement geometry from first-person and god's-eye views. Procedural flight-path geometry built indirectly from real telemetry.
  • U.S. Space Force Orbital Space Defense Training. Built solo, very well-received. VR scenario placing the user as a Space Force operator handling a control-room encounter with a hostile foreign space asset.

Senior XR Software Engineer I–II · Moth+Flame

Remote · May 2021 – April 2023
  • Owned and shipped major features across Conversations and Procedures. Custom shaders for both photorealistic and stylized art directions on mobile VR hardware.
  • Cleaned up tightly coupled legacy rendering and mechanics to make them extensible and per-product configurable.
  • Worked directly with PMs, designers, and the creative studio team to take training modules from concept to shipped product.

Software Engineer · PLAYSTUDIOS

Remote · July 2020 – May 2021
  • Owned critical user-facing features in myKonami Slots, a mobile Unity and C# free-to-play title with hundreds of thousands of daily active users.
  • Wrote custom shaders for high-fidelity visuals on low-end mobile hardware, including a separable Gaussian blur used across the app and still in production years later.

Creative Technology Director · Greater Jackson Alliance

Hybrid Remote · Nov 2016 – July 2020
  • Self-initiated technical product work in support of regional economic development. Operated with broad autonomy to identify problems and build solutions.
  • Built JXNMetro360 Augmented, a Unity and Vuforia AR mobile app that projects an interactive map of the Jackson, MS metro onto a physical printed map, used to walk industry prospects through featured sites.
  • Captured aerial drone photogrammetry of industrial sites and processed it into digital-twin 3D models used for remote site visualization and analysis. This was well before "digital twin" was a marketing term, and the work was self-initiated.
  • GIS analysis and data visualization for industry-attraction campaigns.

Personal Projects

Aminal Space

2024 – Present · Unity, C#, HLSL

Solo-developed contemplative colony builder set across a stylized solar system. The cloud and atmosphere, Earth-scale terrain, and GPU quadtree LOD in the Selected Work section are all from this project.

Project EXO

2018 – Present · Unity, C#, HLSL · projectexo.webflow.io

Science-informed, near-future space strategy simulator with deeply simulated emergent systems. The SDF text rendering in the Selected Work section originated here, alongside JFA-based screenspace borders and log-depth reprojection. More on the portfolio site.

Songs of the Eons

2017 – 2020 · Unity, C#, C++ · patreon.com/SongsOfTheEons

Highly simulation-driven nearest-neighbor Goldberg polyhedron-based planetary-scale fantasy sandbox where the player guides civilizational evolution across eons on a planet generated from real geomorphological processes.

Technical Skills

Graphics & Rendering · HLSL shader authoring, Unity SRP (URP/HDRP), Scriptable Render Features, custom render passes, ShaderGraph, Vulkan/Metal rendering concepts, Forward+/deferred rendering, PBR and stylized lighting, volumetric raymarching, GPU compute, indirect rendering, GPU-driven culling, custom post-processing

XR Platforms · Meta Quest 2/3/Pro, Apple Vision Pro (visionOS), Pico, HTC Focus, OpenXR. Single-pass stereo, fixed foveated rendering, TBDR-aware strategy.

Profiling & Optimization · RenderDoc (Meta fork), Unity Profiler / Frame Debugger / Rendering Debugger, Perfetto, ovrgpuprofiler, Meta Quest Developer Hub. Frame-budget management, draw-call reduction, overdraw analysis, bandwidth/ALU/latency bottleneck diagnosis.

Languages & Engines · C# (10+ years, Unity), HLSL, GLSL, C++, JavaScript/TypeScript, Python. Unity 5 through Unity 6, Unity DOTS/ECS. Rust.

Tooling & Pipeline · Custom editor extensions and inspectors, in-engine and external content-authoring tools, multi-platform CI/CD for Unity, asset bundling and per-build content packaging.

Education

B.S. Geography, University of Southern Mississippi, 2012–2016
Continuing self-directed coursework · Pluralsight, Udemy, FreeCodeCamp (C#, C++, Unity, software design patterns, frontend).

References available upon request.

re: ai slop

tl;dr The software world is in a period of paradigm shift, and we're all trying to figure it out. The potential productivity gains are undeniable, but as with any new paradigm, there be dragons. I've identified two failure modes in adopting an agentic AI-assisted workflow: structural drift and "noetic rot."

This wasn't written with AI. If you're like me, you're probably just had a sigh of relief.

I've been on the hiring side for a while now. At this point, not knowing where an engineer stands on AI feels like not knowing if they live on Earth or Mars, so I wanted to write up my thoughts directly here since, if you're on this website, you're probably eyeballing me for a role.

AI-assisted coding has a very real place. It's less than what the AI hype bros are posting about on LinkedIn, and it's more than what a curmudgeonly graybeard wants to admit. Wholesale rejection of the benefits of AI-assisted engineering is just as reactionary and lacking nuance as wholesale adoption.

Here's how I see it: we're transitioning to a higher level of abstraction, much like we did with the invention of the compiler. No one questions the benefits of the compiler - it's a bedrock technology in the software development ecosystem. The compiler allowed us to lower the footprint of implementation in our cognitive space and allocate more of that space to higher-level abstraction. AI represents a similar leap.

However, there are qualitative differences between AI and compilers that make the analogy fall apart, and which reframe AI as something more novel. Chiefly, compilers are deterministic. You may not know the machine code, but you know that a symbol or syntax is going to give you the exact same machine code every time. Once something is written, it is set in stone. On the other hand, AI is inherently probabilistic. If I tell Claude to write a to-do app, it's going to give me wildly varied results every single time I submit the prompt. It accomplishes the requirements I laid out, sure, but I, as the engineer, never know what I'm going to get. (Perhaps my analogy should have been to the invention of the box of chocolates rather than the compiler.)

There are two primary failure modes I've identified with this reliance on a probabilistic technology: structural drift and noetic rot.

Structural drift

"Structural drift" is the problem that AI is a firehose. You can blast out implementation cheaply and it (usually) works. As a codebase grows more complex, however, it can become structurally incoherent. Engineers give heavy consideration to devising abstract structures and bounds that make a given software ecosystem make sense, and which gives scaffolding to future extension in a sustainable way. Over-reliance on AI softens these boundaries. The structure drifts over time. The codebase loses its scaffolding. Early on in a project, this is hard to notice. The context is limited enough that everything feels like a win. As a project scales though, it becomes discombobulated. The areas of ownership become ill-defined. It becomes a mess.

The solution to this, I think, is to build with the intent of handling the bandwidth and rate of change of code in a way that maintains the overall structural health of a product. The abstract structure is first class, not the code. It's where a great deal of an engineering team's cognitive effort should go. In this paradigm, the previously unwieldy firehose of AI can become a well from which to quickly fill the boxes we've carefully laid out with water.

Noetic rot

The second failure mode I've identified is "noetic rot." (Yes, I coined that term, primarily because I like the word "noetic.") This isn't a problem with AI - it's a problem with the human in the human-AI loop. The tool makes it possible to commit to a technical direction without careful consideration or understanding. You can rabbit-hole into elaborate solutions for problems that were fundamentally solvable in much simpler and more elegant ways. You can ship something that works without being able to explain why. Unfounded confidence is the failure mode, and the speed of the tool compounds it.

The mitigation is honest skepticism. A good engineer should read every line. Don't accept anything you couldn't have written yourself. If you don't understand it, you either learn about it or you don't ship it. Telling the AI to "do the thing" isn't engineering. It's, frankly, intellectually lazy.

The analogy I use is a dentist. I don't trust a dentist who can't extract a tooth without help. If they reach for AI to ideate about an unfamiliar problem, fine. But if they screw it up, that's on them. They should have had the discipline to understand and verify before doing the work. Engineering is the same. The line is mine because I committed it. "An LLM wrote that" is not an answer when something breaks at 3 AM.

In practice

In my day to day, here's what it looks like for me: I lean on agents for boilerplate, scaffolding new files, generating test cases, comments (excellent for that) and exploring unfamiliar APIs or languages. I use them as a first-pass sounding board to poke holes in my own logic before I commit to it. I don't give them any reign over the parts of the codebase where I need to know what is happening at a hardware level. Rendering hot loops, shader logic, anything performance-critical. For those, I may execute highly targeted agentic delegation if it's appropriate, but more often, I just write it myself, for two reasons: one, because the friction of reviewing can be higher than the time saved if I already know exactly what I want to do; and two, because these are areas I find it important to keep healthy, well-exercised muscles around. Reading an agent's output is like going for a walk every day - you should just do it. Writing is like lifting weights and running - if you want to be the best at your craft, it's necessary. The work of good engineers is not valued because we are pedestrians, it is valued because we are athletes.

There are domains where the tools are nowhere close to reliable, and graphics is one of them. Visual artisanship in particular. The problem space is too broad and the solution space is too intuitive for a token machine. Performance optimization is the same story. The hardware constraints are too specific and the search space too wide. An engineer who told me they used an agent to optimize their GPU memory budget is not an engineer I would trust.

I could talk about this for hours. If you want to, hit me up.

The easiest way to reach me is email. I tend to reply within a day.

If you're hiring for a senior-level graphics engineering role, I'm open to opportunities. Otherwise I'm always happy to talk shop about rendering, mobile XR, or whatever you're stuck on.