I've spent the last few weeks rewriting the core component of my engine, the voxel pipeline. This encapsulates the whole process from density function to a triangle mesh. In terms of functionality the pipeline is essentially the same, but now is (almost) entirely implemented using OpenCL. In fact the OpenGL/OpenCL interop is used so that the generated mesh lives and dies exclusively on the GPU.
Thursday, 4 June 2015
Wednesday, 29 April 2015
QEF implementations for C++/GLSL and OpenCL
I've created a github repo to hold QEF implementations. The repo currently contains a version created by Leonard Ritter (@paniq) which is a stripped down version of the original implementation by /u/unzret from my previous post. I've also forked that to create an OpenCL version, and added that to the repo too.
These implementations are completely free for any purpose which is an improvement over the reference implementation's license (which was free for non-commercial use). Moreover, this implementation is suitable for use on the GPU which is a technical improvement on the reference version.
I know a lot of people reading this blog are using C# so perhaps someone wants to contribute a C# port? Ideally the repo would be a single resource for QEF code so no one else ever has to write it!
These implementations are completely free for any purpose which is an improvement over the reference implementation's license (which was free for non-commercial use). Moreover, this implementation is suitable for use on the GPU which is a technical improvement on the reference version.
I know a lot of people reading this blog are using C# so perhaps someone wants to contribute a C# port? Ideally the repo would be a single resource for QEF code so no one else ever has to write it!
Tuesday, 10 March 2015
Engine overview
This post will be describing at a fairly high level how my engine works in the last video I posted to YouTube. There are a few places where I go into some more detail as these were either requested explicitly by someone or I have been asked about them multiple times. If there's anything you'd like expanded upon let me know in the comments.
Friday, 20 February 2015
Updated Sample Application
I've updated the sample Dual Contouring implementation to use a new QEF implementation. You can now find the sample on Github.
The previous QEF implementation was from the original reference code and was under a non-commercial license. The new implementation is completely free for any purpose and is, I think, a lot more readable than the old implementation. This new implementation was written by /u/unzret who contacted me on Reddit.
Sunday, 9 November 2014
Implementing Dual Contouring
If you've read the Dual Contouring paper and the ProcWorld post From Voxels To Polygons but haven't been able to get an implementation working, then this post is for you. I've put together a Dual Contouring implementation and added it to a Github repo. The rest of this post will explain how it works.
Sunday, 28 September 2014
Dual Contouring: Seams & LOD for Chunked Terrain
There was a mistake in the original version of this post, the second last selectionFunc was a duplicate of the previous entry in the table. The table has now been corrected. Apologies to anyone who was tearing their hair out trying to debug that one!
Then about a year ago, EverQuest Next was announced. Far from using blocky Minecraft style graphics EQN looked like a typical AAA game. I wanted to know how this was possible, and quickly discovered that I already knew -- it was based on the Procedural World project. I realised Miguel was really on to something here, and the next day started on a new voxel renderer. I set myself a goal: learn how this technology worked by creating a Dual Contouring renderer that would be capable of handling large terrains.
Introduction
A couple of years ago I read these blog posts (1, 2) on 0 FPS, and like a lot of programmers decided I should write one of these voxel renderers. I implemented Marching Cubes first, but I was unhappy with the way terrain looked using MC -- it was far too blocky. I then implemented Naive Surface Nets and was pleased that I now had smooth terrain, but I soon discovered that Surface Nets couldn't support sharp features, like a 90 degree angle. That meant it would never be possible to have both a smooth terrain and a realistic looking building produced by the Surface Nets algorithm. I was aware of Dual Contouring from the 0 FPS posts, and my main source of information Miguel Cepero's Procedural World blog. Dual Contouring sounded like a significant step up in difficulty from Surface Nets, and I was quite skeptical about how feasible it would be to use Dual Contouring in a game. I never tried to upgrade my renderer to use DC and my interest in the project faded.Then about a year ago, EverQuest Next was announced. Far from using blocky Minecraft style graphics EQN looked like a typical AAA game. I wanted to know how this was possible, and quickly discovered that I already knew -- it was based on the Procedural World project. I realised Miguel was really on to something here, and the next day started on a new voxel renderer. I set myself a goal: learn how this technology worked by creating a Dual Contouring renderer that would be capable of handling large terrains.
Subscribe to:
Posts (Atom)