Jonatan Ebenholm's Portfolio

Finishing an MSc in Media Technology and Engineering at Linköping University

/ status

Now

Working on
Last course of the MSc, a volumetric cloud renderer in C++ / OpenGL, and just starting on Vulkan, a C++ physics engine and .NET.
Looking for
Software or systems engineering roles starting late 2026 / early 2027. C++, C#, Python. Especially keen on graphics, GPU, computer vision, or simulation work.
Based in
Norrköping, Sweden. Open to roles across Östergötland, and outside Östergötland for hybrid work.
WIP: Cloud Sim

Real-time volumetric clouds in C++ and OpenGL, raymarched from a compute-built 3D texture.

Minecraft Terrain Engine
Minecraft Terrain Engine

GPU-driven voxel terrain in C++20. Compute shaders build it, indirect draws render it.

WIP: DroneSim

Autonomous drone flying through procedural terrain, meshed on the fly with marching cubes.

Gesture Controller
Gesture Controller

Hand gestures drive a Godot game over WebSocket, via MediaPipe and a Keras CNN.

Pathtracer on GPU

Path tracer running entirely in a fragment shader, accelerated by a CPU-built BVH.

Solar system simulation
Solar system simulation

Blender add-on that simulates a solar system and animates it with generated materials.

Papers

Research papers and writeups.

Inverse Rendering for Industry Inspections

Jonatan Ebenholm

Master's thesis (30 HP, LiU), done at SICK IVP in Linköping. Tests whether surface scratches are easier to find in SVBRDF maps recovered by inverse rendering than in the photographs themselves. They aren't. Near-field image input found all 407 scratches and beat even ground-truth normal maps. The maps did win one case. When a material's appearance changed but its shape stayed the same, normal maps scored around 50% higher than image input, which is the useful result if you want one detector to work across materials.

Gesture Recognition for Video Game Controllers

Jonatan Ebenholm

Compares a CNN trained on HaGRID against a feed-forward network fed 21 hand landmarks from MediaPipe. The landmark version reached 100% validation accuracy, trained in under a second per epoch, and held up far better under rotation.

Simple Path Tracer with BVH Acceleration Structure

Ludwig Boge, Jonatan Ebenholm

A path tracer written entirely in a fragment shader, handling diffuse, specular, glossy and transmissive materials at near real-time rates. The BVH is built on the CPU and traversed in the shader through SSBOs.

Monte Carlo Raytracer in C++

Ludwig Boge, Jonatan Ebenholm

A Monte Carlo raytracer built from scratch in C++ for TNCG15. Solves the rendering equation across Lambertian, mirror and transparent surfaces lit by area lights, and benchmarks how shadow ray and sample counts affect quality.

AniMatch: A Content-Based Anime Recommendation System

Berkay Orhan, Jonatan Ebenholm

A content-based anime recommender using BERT embeddings and cosine similarity over title metadata. No accounts and no collaborative filtering, which sidesteps both cold-start and privacy problems.

Elemental Clash: Bachelor Thesis

Emil Larsgärde, Ludwig Boge, Jonatan Ebenholm, Gayathri Naranath, Gustaf Kronholm, Armen Abedi, Mirijam Björn

Bachelor thesis (18 HP, LiU): a Unity card game on a large touchscreen where ArUco markers and OpenCV read physical card placement. User studies with 12 participants measured the effect on tempo and stress. Written in Swedish.

Demos

Interactive 3D experiments.

Procedural Terrain

Multi-octave simplex terrain with elevation biomes, water specular and distance fog. Drag to spin.

Spinning Cube

The minimal template every other demo is built from.

Cube Demo

Five thousand cubes in a single instanced draw call. Hover one to pick it out.

Wave Experiment

A quarter of a million points rolling on a wave, animated entirely in a vertex shader.

Particle Wall

Ten thousand points on a grid, pushed around by the cursor in a vertex shader.

Hole Demo

Clipping planes cut a crater that follows your cursor, with balls rolling into it.

Education & Experience

SICK IVP / Linköping University logo

Master's Thesis: Inverse Rendering for Industry Inspections

Jan 2026 – Jun 2026

SICK IVP / Linköping University

Tested whether inverse rendering makes surface scratches easier to detect than plain photographs do. It mostly does not, but the recovered geometry still works when the material changes and the shape stays the same.

Linköping University logo

Programming Assistant, LiTHeHack

Sep 2025 – Jun 2026

Linköping University

Paid programming assistance role under LiU's LiTHeHack initiative, supporting students with their programming work.

Linköping University logo

Laboratory Assistant, Applied Transform Theory

2024

Linköping University

Guided students through lab sessions on Fourier analysis, Laplace transforms, and signal and system analysis.

Linköping University logo

Master's Degree in Media Technology and Engineering

2023 – Present

Linköping University

Specializing in computer graphics, GPU programming, video game systems programming, and machine learning.

Linköping University logo

Bachelor's Degree in Media Technology

2020 – 2023

Linköping University

Foundations in programming, applied mathematics, and media technology.

Coursework

Selected highlights from my MSc program.

Computer Graphics

  • G3D Computer Graphics6 HP4
  • AModelling Project6 HP5
  • AAdvanced Global Illumination and Rendering6 HP5
  • AComputer Graphics (Advanced)6 HP4

Machine Learning & AI

  • AMachine Learning for Social Media6 HP5
  • AArtificial Intelligence: Principles and Techniques6 HP5
  • AArtificial Intelligence for Interactive Media, Project6 HPG

Automatic Control

  • GApplied Transform Theory6 HP5
  • GSignals and Systems6 HP5
  • GAutomatic Control6 HP5
  • AModelling and Simulation6 HP4

Other

  • GElectronic Publishing6 HP5
  • GCommunication and User Interfaces6 HP5
  • GCalculus II6 HP5
  • GStatistics6 HP5

/ background

About

I'm finishing an MSc in Media Technology and Engineering at Linköping University, with the focus pulled hard toward computer graphics, GPU programming, and applied machine learning. My thesis is done. It was hosted at SICK IVP in Linköping and asked a fairly blunt question about industrial inspection: if you recover a surface's geometry and material from photographs, do scratches get easier to find than they were in the photograph? Mostly they don't. The raw images won, even when I skipped the estimation step and handed the detector perfect ground truth. What did hold up was reuse. Change how a surface looks but leave its shape alone, and the recovered geometry still finds the scratches when the image-based version can't. One 6 HP course stands between me and the degree. I'm taking it now, so November 2026.

I came at graphics through art: years of figure and gesture studies, then a media technology degree for the practicality plus the graphics angle I'd been curious about as a gamer. Code turned out to be a way to build worlds the way drawing built faces and figures. TNCG15: Advanced Global Illumination is what made me a graphics programmer proper, and TSBK07: Computer Graphics the semester after dropped me into parallel programming. I haven't really left.

Most of what I build lives on the line between graphics and systems: GPU-driven voxel engines, fragment-shader path tracers, procedurally generated worlds. Lately that's a volumetric cloud renderer in C++ and OpenGL, raymarching a 3D texture built in a compute shader. I like the work that asks you to think at two levels at once: the high-level structure of what's being rendered, and the low-level mechanics of how the GPU is actually executing it. The projects above are mostly me chasing that.

The next things are further down the stack. I've started a physics engine in C++, and I've just begun with Vulkan after a few years of OpenGL, mostly because I want the memory and the scheduling to be my problem. I'm working through .NET as well, since a lot of the engineering I want to do isn't rendering. All three are early. That's what the next year is for.

I'm looking for strong engineering work in systems, graphics, vision, or simulation. Graphics and GPU work is where I'm strongest, and industry-adjacent work in the same space as my thesis (vision, simulation, perception) is just as compelling. A full-time research role would tempt me too, if the project is the right kind of strange.

Skills

C++
C#
.NET
Python
TypeScript
OpenGL
Vulkan
Three.js
Unity
Godot
Blender
TensorFlow
OpenCV
MATLAB
React
Next.js
Tailwind CSS
Git
CMake