I often see
both scholars and novices alike point out what a voxel engine is and
what it is not. 'Minecraft does not use voxels', 'Resogun does not
use voxels', and '3D Dot Heroes does not use voxels' is tossed around
a lot. I agreed with them for a long while, basing my opinion on the
fact that many, if not all of the examples thrown around are hardware
accelerated and as such are rendered using triangles as rendering
primitives. After actually writing my own voxel renderer I came to a
different conclusion about what constitutes a voxel renderer by
separating the term 'voxel', which is a spatial data structure, from
'renderer', which is an algorithm used for the visualization of
spatial data. In this post I will attempt show the logic of that
argument by examining the individual terms of 'voxel renderer' with
the hopes of showing people that the concept is far less binary than
originally thought.
The
first component of the term 'voxel renderer' is of course 'voxel'.
Thus, we should have a look at what the basic concept of voxels
means. Simply put voxels are volumetric data stored in a three
dimensional grid, meant to convey a three dimensional image. It can
therefore be said that a voxel is to three dimensions what a pixel is
to two dimensions. Therefore, a way to think of a single voxel is to
imagine a singularly colored, axis aligned cube (although it is
ultimately the renderer that decides how to visualize the input
data). It should also be noted that a cube is really only a
convenient way of imagining a voxel. A cube is a volume defined by
six points in an unrestricted three dimensional space, while a voxel
is a single grid cell in an axis aligned space. As such cubes are
free to move around the space, while a voxel is forever confined to
the location of the cell in which it resides. Because of this we can
really only say that a voxel is represented by a cube rather than
actually being a cube.
Voxels
can often contain more data than a color. They can also contain many
properties that describe the surface that the voxels are representing
such as surface normals and roughness. However, voxels will not need
to contain information about position or size since their position is
defined by their relation to one another in the voxel grid, while
their size is homogenous along the individual axis. However, voxel
volumes can be made to rotate and move independently of other,
separate voxel volumes by attaching individual transformation
parameters to each volume for the engine to regard when handling the
data.
Given
the information provided above it should be obvious that any game
storing spatial data in a three dimensional grid can be said to use
voxels in one form or another. Yet, another interesting facet of
voxels is the rendering of voxels. A game engine encompasses many
components that work together in tandem. Undeniably, one of those
components is the renderer, which is often the single most
characteristic and generally identifiable component in an engine.
'Renderer' is an umbrella term for all kinds of visualization
algorithms; rasterizers, ray casters, ray tracers, splatters and so
on, but it also has a much broader significance by encompassing
things like transformation, hidden surface removal, and lighting and
shadowing amongst other things.
Taken
at face value, 'voxel renderer' does not make any pretense to dictate
the actual algorithm used in the rendering process. In fact, it does
not dictate anything except the predominant use of voxels in the
process. A predominant use of voxels should be an obvious
prerequisite when determining if a renderer is a voxel renderer since
the term voxel is used as a classification of the renderer.
Classifying by something other than a main characteristic feature
would be misleading. However, 'renderer' is a much too open ended
term to actually mean much (try substituting the word 'pixel' for
'voxel' in 'voxel renderer', and it should become abundantly clear
just how without any meaning term is). Additionally, 'voxel
renderer', as it stands, has not been used in such a was as to load
it with a specific meaning regarding what method of delivery is
employed in the rendering process. Therefore, the only prerequisite
for a correct use of the term 'voxel renderer' is then the use of
voxels as the main source of data used for rendering.
This
leads to the question 'when are voxels considered the main source of
rendering information'? It is common knowledge that modern day
graphics cards provide an ad
hoc
solution for rendering triangles. Barring the use of OpenCL or the
like, any rendering algorithm that seeks to accelerate the process
via hardware has to ultimately render primitives as triangles.
However, a voxel is converted into triangles merely as a final step
to in the rendering process, which arguably is the smallest segment
of the rendering pipeline. Aside from that, the mere fact that a
voxel is rendered as a set of triangles does not mean that the end
result is not a voxel. Rasterization is merely a delivery method for
rendering voxels and should not, in and of itself, exclude a renderer
that otherwise predominantly uses voxels from being considered a
voxel renderer.
In
conclusion, voxels are a form of spatial data, while rendering is a
form of visualization algorithm. Voxel rendering is a form of
algorithm (unspecified) used for the visualization of voxels. Thus,
many different things can be considered voxel renderers, as long as
there is a predominant, albeit not necessarily persistent, use of
voxels throughout the renderer so as to not undermine the classifying
term. Other than that, the definition is very open ended and may be
used liberally until practice establishes a narrower use for the
term.
No comments:
Post a Comment