Billboard Sprite World

I’ve been working on and off on this project for the last couple of years. I wanted to make a world entirely out of billboard sprites. These are some recordings I made during the beginning of development in 2015:


This was all rendered on a Swing JPanel, which was pretty inefficient. I’ve since switched to OpenGL, but at the time I didn’t know any better.

Here are executable jar files of some versions if you’re interested:

A couple of months later I was figuring out how to render a floor/ceiling grid and made some recordings. I’ve ended up not using it in the end since I moved on to full 3D movement later on.


Almost a year later I decided to pick up this project again. I had a course on computer graphics and gained some knowledge of OpenGL, but I didn’t know how to use it in Java up until this point. Then I discovered LWJGL and I was able to relatively easily migrate from a Swing Canvas to legacy OpenGL. The performance was still pretty terrible, so I started from scratch in modern OpenGL and it got pretty weird.


Then I needed a faster way to choose which objects to render than checking them individually, so I implemented an octree data structure to render groups of nearby objects. A node is subdivided after a maximum amount of objects are added and it redistributes its objects to its 8 child nodes. It also allows for a fast way to raycast through all objects, which I used to detect collision with the player.


A few months ago I really got back into it and improved terrain generation using perlin noise and implemented some rendering optimizations.


And that’s where I’m at right now ;D
Try the latest version here:

  • F to switch between orbit/first person camera.
  • In orbit mode: Middle mouse button to rotate, shift + middle mouse button to move around, scroll to zoom and click to focus on an object.
  • In first person mode: WASD to move, g to disable gravity, choose a sprite with number keys, left click to place, right click to remove, scroll to move cursor
  • F3 for viewing octree nodes, v to toggle vsync, b to toggle normal/additive blending