174 lines
7 KiB
Markdown
174 lines
7 KiB
Markdown
|
# An interview with STB about stb_voxel_render.h
|
||
|
|
||
|
**Q:**
|
||
|
I suppose you really like Minecraft?
|
||
|
|
||
|
**A:**
|
||
|
Not really. I mean, I do own it and play it some, and
|
||
|
I do watch YouTube videos of other people playing it
|
||
|
once in a while, but I'm not saying it's that great.
|
||
|
|
||
|
But I do love voxels. I've been playing with voxel rendering
|
||
|
since the mid-late 90's when we were still doing software
|
||
|
rendering and thinking maybe polygons weren't the answer.
|
||
|
Once GPUs came along that kind of died off, at least until
|
||
|
Minecraft brought it back to attention.
|
||
|
|
||
|
**Q:**
|
||
|
Do you expect people will make a lot of Minecraft clones
|
||
|
with this?
|
||
|
|
||
|
**A:**
|
||
|
I hope not!
|
||
|
|
||
|
For one thing, it's a terrible idea for the
|
||
|
developer. Remember before Minecraft was on the Xbox 360,
|
||
|
there were a ton of "indie" clones (some maybe making
|
||
|
decent money even), but then the real Minecraft came out
|
||
|
and just crushed them (as far as I know). It's just not
|
||
|
something you really want to compete with.
|
||
|
|
||
|
The reason I made this library is because I'd like
|
||
|
to see more games with Minecraft's *art style*, not
|
||
|
necessary its *gameplay*.
|
||
|
|
||
|
I can understand the urge to clone the gameplay. When
|
||
|
you have a world made of voxels/blocks, there are a
|
||
|
few things that become incredibly easy to do that would
|
||
|
otherwise be very hard (at least for an indie) to do in 3D.
|
||
|
One thing is that procedural generation becomes much easier.
|
||
|
Another is that destructible environments are easy. Another
|
||
|
is that you have a world where your average user can build
|
||
|
stuff that they find satisfactory.
|
||
|
|
||
|
Minecraft is at a sort of local maximum, a sweet spot, where
|
||
|
it leverages all of those easy-to-dos. And so I'm sure it's
|
||
|
hard to look at the space of 'games using voxels' and move
|
||
|
away from that local maximum, to give up some of that.
|
||
|
But I think that's what people should do.
|
||
|
|
||
|
**Q:**
|
||
|
So what else can people do with stb_voxel_render?
|
||
|
|
||
|
**A:**
|
||
|
All of those benefits I mentioned above are still valid even
|
||
|
if you stay away from the sweet spot. You can make a 3D roguelike
|
||
|
without player-creation/destruction that uses procedural generation.
|
||
|
You could make a shooter with pre-designed maps but destructible
|
||
|
environments.
|
||
|
|
||
|
And I'm sure there are other possible benefits to using voxels/blocks.
|
||
|
Hopefully this will make it easier for people to explore the space.
|
||
|
|
||
|
The library has a pretty wide range of features to allow
|
||
|
people to come up with some distinctive looks. For example,
|
||
|
the art style of Continue?9876543210 was one of the inspirations
|
||
|
for trying to make the multitexturing capabilities flexible.
|
||
|
I'm terrible at art, so this isn't really something I can
|
||
|
come up with myself, but I tried to put in flexible
|
||
|
technology that could be used multiple ways.
|
||
|
|
||
|
One thing I did intentionally was try to make it possible to
|
||
|
make nicer looking ground terrain, using the half-height
|
||
|
slopes and "weird slopes". There are Minecraft mods with
|
||
|
drivable cars and they just go up these blocky slopes and,
|
||
|
like, what? So I wanted you to be able to make smoother
|
||
|
terrain, either just for the look, or for vehicles etc.
|
||
|
Also, you can spatially cross-fade between two ground textures for
|
||
|
that classic bad dirt/grass transition that has shipped
|
||
|
in plenty of professional games. Of course, you could
|
||
|
just use a separate non-voxel ground renderer for all of
|
||
|
this. But this way, you can seamlessly integrate everything
|
||
|
else with it. E.g. in your authoring tool (or procedural
|
||
|
generation) you can make smooth ground and then cut a
|
||
|
sharp-edged hole in it for a building's basement or whatever.
|
||
|
|
||
|
Another thing you can do is work at a very different scale.
|
||
|
In Minecraft, a person is just under 2 blocks tall. In
|
||
|
Ace of Spades, a person is just under 3 blocks tall. Why
|
||
|
not 4 or 6? Well, partly because you just need a lot more
|
||
|
voxels; if a meter is 2 voxels in Mineraft and 4 voxels in
|
||
|
your game, and you draw the same number of voxels due to
|
||
|
hardware limits, then your game has half the view distance
|
||
|
of Minecraft. Since stb_voxel_render is designed to keep
|
||
|
the meshes small and render efficiently, you can push the
|
||
|
view distance out further than Minecraft--or use a similar
|
||
|
view distance and a higher voxel resolution. You could also
|
||
|
stop making infinite worlds and work at entirely different
|
||
|
scales; where Minecraft is 1 voxel per meter, you could
|
||
|
have 20 voxels per meter and make a small arena that's
|
||
|
50 meters wide and 5 meters tall.
|
||
|
|
||
|
Back when the voxel game Voxatron was announced, the weekend
|
||
|
after the trailer came out I wrote my own little GPU-accelerated
|
||
|
version of the engine and thought that was pretty cool. I've
|
||
|
been tempted many times to extract that and release it
|
||
|
as a library, but
|
||
|
I don't want to steal Voxatron's thunder so I've avoided
|
||
|
it. You could use this engine to do the same kind of thing,
|
||
|
although it won't be as efficient as an engine dedicated to
|
||
|
that style of thing would be.
|
||
|
|
||
|
**Q:**
|
||
|
What one thing would you really like to see somebody do?
|
||
|
|
||
|
**A:**
|
||
|
Before Unity, 3D has seemed deeply problematic in the indie
|
||
|
space. Software like GameMaker has tried to support 3D but
|
||
|
it seems like little of note has been done with it.
|
||
|
|
||
|
Minecraft has shown that people can build worlds with the
|
||
|
Minecraft toolset far more easily than we've ever seen from those
|
||
|
other tools. Obviously people have done great things with
|
||
|
Unity, but those people are much closer to professional
|
||
|
developers; typically they still need real 3D modelling
|
||
|
and all of that stuff.
|
||
|
|
||
|
So what I'd really like to see is someone build some kind
|
||
|
of voxel-game-construction-set. Start with stb_voxel_render,
|
||
|
maybe expose all the flexibility of stb_voxel_render (so
|
||
|
people can do different things). Thrown in lua or something
|
||
|
else for scripting, make some kind of editor that feels
|
||
|
at least as good as Minecraft and Infinifactory, and see
|
||
|
where that gets you.
|
||
|
|
||
|
**Q:**
|
||
|
Why'd you make this library?
|
||
|
|
||
|
**A:**
|
||
|
Mainly as a way of releasing this technology I've been working
|
||
|
on since 2011 and seemed unlikely to ever ship myself. In 2011
|
||
|
I was playing the voxel shooter Ace of Spades. One of the maps
|
||
|
that we played on was a partial port of Broville (which is the
|
||
|
first Minecraft map in stb_voxel_render release trailer). I'd
|
||
|
made a bunch of procedural level generators for the game, and
|
||
|
I started trying to make a city generator inspired by Broville.
|
||
|
|
||
|
But I realized it would be a lot of work, and of very little
|
||
|
value (most of my maps didn't get much play because people
|
||
|
preferred to play on maps where they could charge straight
|
||
|
at the enemies and shoot them as fast as possible). So I
|
||
|
wrote my own voxel engine and started working on a procedural
|
||
|
city game. But I got bogged down after I finally got the road
|
||
|
generator working and never got anywhere with building
|
||
|
generation or gameplay.
|
||
|
|
||
|
stb_voxel_render is actually a complete rewrite from scratch,
|
||
|
but it's based a lot on what I learned from that previous work.
|
||
|
|
||
|
**Q:**
|
||
|
About the release video... how long did that take to edit?
|
||
|
|
||
|
**A:**
|
||
|
About seven or eight hours. I had the first version done in
|
||
|
maybe six or seven hours, but then I realized I'd left out
|
||
|
one clip, and when I went back to add it I also gussied up
|
||
|
a couple other moments in the video. But there was something
|
||
|
basically identical to it that was done in around six.
|
||
|
|
||
|
**Q:**
|
||
|
Ok, that's it. Thanks, me.
|
||
|
|
||
|
**A:**
|
||
|
Thanks *me!*
|