townengine/third-party/stb/docs/stb_voxel_render_interview.md
2024-07-08 03:44:20 +03:00

7.0 KiB

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!