My first learner project in Java, Vond Jr. is a Java implementation of Vond, which in turn is a C++-based, retro-themed hybrid software voxel/polygon renderer.
As this is a learner project, you can expect the code at times to be silly, embarrassing, poor, sub-optimal, etc. But it'll get better.
So what will Vond Jr. do, exactly?
The original Vond implements both a ray-tracing, heightmap-based voxel renderer and a more conventional triangle rasterizer. Both renderers run on the CPU; the voxel renderer being multi-threaded via OpenMP.
In the screenshot of Vond, below, you can see the combined output of the two renderers. The terrain is drawn by the voxel renderer, and the yellow sphere by the triangle rasterizer; the latter using additional depth information from the voxel render pass to overlay its image on the landscape.
Vond Jr. sets out to do more or less what Vond does, although possibly not as a full clone of it. At first, a voxel terrain renderer will be implemented; a triangle rasterizer may follow, later.
The voxel renderer
Vond Jr.'s voxel renderer will take in a heightmap as a grayscale image, and cast rays across it to produce an image of it as a landscape of vertical voxel spans.
To produce a single frame, the voxel renderer in the original Vond traces a ray into the heightmap through each of the screen's pixels. This is a simple way to get full six degrees of freedom of camera movement, but does require a relatively high amount of computation due to the high number of rays being cast. Using C++ and OpenMP, my 3.5 GHz quad-core Haswell CPU can sufficiently maintain 60 frames per second, provided that the resolution is low enough (downscaled by 4x or more).
It remains to be seen whether adequate performance with full-screen ray tracing is possible in Java, given also that I'm not super good at optimization. If it seems not, another option is to use ray casting, which requires fewer rays - but also has fewer degrees of freedom.