Minecraft Acid Interstate V5

Apr 14, 2024

I made another one.

The following is an adaptation of the description on the YouTube video, with more details in it.

This took a lot longer than expected, overall just over a month. After RED DESERT, I wanted to make another video - I didn't feel like it fitted the style of the previous acid interstate videos, it was very short, and it wasn't as good as it could be as a result of the limitations imposed by working from a laptop (i.e everything being laggy as hell).

The three main improvements I made over RED DESERT were the synchronised time cycle, the torches, and the new shader.

The Synchronised Time Cycle

This was an absolute bastard to get working, mainly due to my own incompetence - specifically a misunderstanding of how variables worked in GLSL. Within a vertex shader, you can declare a variable as out, for example out vec3 position. You can then access this in a fragment shader with in vec3 position. The problem was that I assumed you could access these between any shader program, when in fact you can only access it in the same program - i.e if you declare it as out in gbuffers_terrain.vsh, you can only declare it as in in gbuffers_terrain.fsh. You can't rotate the sun in the shader, so instead you have to rotate the terrain when rendering the shadow map, but also apply this rotation to the position you read from the shadow map at. The ideal way to do this is just to pass the shadow position through to the shader rendering shadows, but this wasn't working with my incorrect method.

I tried an alternative method by writing a datapack which would set the time based on the player's X position, but it turns out the server will only update the time of day so many times per second. I'll also say that datapack programming is something I wouldn't wish upon my worst enemy, and the fact SethBling managed to write an entire physics engine with it is a true feat of humanity.

Instead, I switched shaders.

The New Shader

As time went on, I was becoming less happy with the aesthetic of Sildur's shaders, as it didn't really match that of Acid Interstate V3 or V4. Bruce and Riley of course, used SEUS V10, but this shader basically doesn't work in modern versions of Iris and the code is also pretty hard to understand. Instead, I chose to use Ebin, which Bruce developed alongside Acid Interstate V3. This matched the Acid Interstate aesthetic a lot better, and also had a built in time override, which was very useful. A big problem with RED DESERT was the shadows, the main thing being that they aren't affected by the acid. You can tell in RED DESERT, because the terrain that's quite high up has no shadows cast on it. The easy solution is to just apply the acid in the shadow map as well, but then you end up with the terrain casting a shadow when it blocks out the sun. You can see this in an older WIP version of my video. This is really only a problem in the first part.

The solution is to, in gbuffers_terrain, write the position before the acid to a texture, and read that in when applying the shadows, using the original position to calculate the position in the shadow map. Similarly, the original normal must also be passed through, in order to calculate the 'old type' lighting.

The Torches

This one was significantly less technical. I wrote a web app which lets me write torch positions to a json file by pressing my numpad keys to the beat, which you can use at https://projects.jbritain.net/interstate-assembler/. I then just modified my terrain copying script to add the torches as well.

The Colours

I definitely didn't get the colours perfect here, but they were a lot better than RED DESERT. I didn't do any colour grading in post because I don't know how to do that, instead I just set the colour of the grass in a resource pack. I spent a fair bit of time talking to Land Hooman and TruDruChocolateMilk trying to get the colour right.

The Terrain

When I did RED DESERT, I didn't really think too much about the terrain, and I could never figure out how the terrain used in the other videos was generated - I just assumed it was with a lot of world editing - turns out it's just the corner farlands! The terrain was all generated in Minecraft 1.20.2 with the Modern Beta mod. The first, second, and fourth parts are just normal farlands. The fourth part is actually the same terrain as the second part, just shifted upward. The third part uses the 'beta isle lands' preset in Modern Beta, and in this case I used WorldEdit to cut out a horizontal slice of the terrain to run the rails through. Unfortunately on most seeds the floating islands don't generate, but according to Bruce they're generally more likely to when the seed is a power of 2.

Recording and Rendering

The rails are actually powered rails and the cobblestone is actually redstone blocks, changed with the resource pack. This was because the best way I could find to record a camera path at a constant speed and load the chunks at the right time was to literally just sit in a minecart and record with the replay mod. This is a horribly slow process since the entire video is about 40 minutes across at normal minecart speed, meaning it would take a total of roughly 80 minutes to set up the camera path (in the replay editor you have to sit through the entire replay in order to place a keyframe at the end).

At a guess, this took about 17 hours to render, I did the first half in segments due to lack of patience and then left the second half rendering when I was out for the day. I might do a 360 version but it depends if I'm willing to spend the time rendering it. Prism Launcher says I spent about 270 hours with the game open on the two instances I used but I did leave it in the background occasionally.

The motion blur was done with frame blending in Adobe Premiere Pro, which required me to record at 1x speed and then speed it up in Premiere.

Final Thoughts

I learned a lot making this, and I'm now working on my own shaderpack. TOPAZ is slowly dropping songs from his new album this year, so if any of the songs befit an Interstate V6, I'll probably make one.

This website is made entirely in vanilla HTML and CSS, templated with Nunjucks, and served by Express.js. Sometimes you don't need a UI framework!