The menus are all just UI elements in Unity, and I scripted them myself. I'm sure there's a bunch of packages on the asset store that make it easier, but if you want to learn how to make them yourself you should check out some tutorials on Youtube. I really like Brackeys:
blogum
Creator of
Recent community posts
This is just a standard way to round to the nearest int, which needs to be done because you can't have a separation of 60.5 pixels, for example, because pixels come in wholes.
So the only things I can change that would affect the layers are DPI and mu (depth of field). There are combinations of these that give a better spread of separation, but it often turns out messing up the stereogram.
It's not quite that simple. I'm already using full 32 bit textures, so 8 bit for the grey. Greyness corresponds to z in the algorithm (z is a value between 0 and 1, representing distance from the player). It's not the granularity of the z values, but the fact that two different z values will round to the same separation value in the algorithm.
So DoomLoader basically ported DOOM to Unity. What I'm doing is running DoomLoader in the background (so it's still a 3D game, technically), but I overlay a UI texture across the screen. I have a script that takes the 3D camera feed, turns it into a render texture (just an array of the pixels that the camera would normally display to the player), applies the algorithm from the paper, and then feeds that to the UI texture as the end display.
The key is that the algorithm needs a depth map. So I made a couple shaders that almost all the objects are now using, which ignore the DOOM textures and instead make all objects greyscale, depending on their distance from the player. So underneath the stereogram, the game is just playing, and every frame looks like a depth map. I'll post an image of that below, with a high "render distance" setting.
The rounding that I've mentioned is in reference to the paper, specifically line 27 if you look at the code in Figure 3 here. The equation is s = round((1-mu*z) * E/(2-mu*z)), which will make more sense if you read the rest.
The bullet hit texture you're seeing is one of the few that I haven't converted to black and white (I'm still not sure if it should appear as close as possible like the gun, or if I should leave it as is). My stereogram script is expecting a depth map, so with this colored texture it's effectively random layers. It kinda looks like it has infinite layers, but it's the same ones as the rest of the scene. It's just that the randomness tricks your eyes a bit. With that said, there might be a way to increase the number of layers by adjusting some parameters in the algorithm. But even in the original paper, their example has some obvious layers to it.
I'm slightly hesitant to change the enemy line of sight just because I want it to play like the original. I'd rather find a solution with my visibility issues, like giving them some kind of tint.
As for loading custom wads, that'd be really cool. The only problem is that DoomLoader isn't 100% complete, and I'm not sure how it'll react if it tries to load something in a map that it isn't expecting.
Doors are definitely an issue too. I'll probably add a mesh onto them to differentiate them from walls; a little triangle is a good idea.
Thanks for the feedback!
I'm not sure about exclusive fullscreen, I'll have to look into it.
The circles are a result of how the stereogram's layers are calculated. Any given pixel will have a separation value, which rounds to the nearest integer. The separation value determines how far away it'll appear, but because of the rounding, things only appear in layers. Since the player position is represented as a point in space, you can imagine spheres around that point for each of the layer distances. So if the sphere intersects with a wall, the closer layer will look like a circle popping out of the wall. Like catalystman said, there's probably a way to get enough layers that it looks like true 3d; I just haven't figured it out yet.
Enemy tinting would be very helpful; I've been thinking about ways to do that without them being visible in the 2D "out of focus" view.
I could add a normal-view toggle pretty easily, but as it is now it would look like a depth map instead of the textured game. Still, that could be helpful.
I also have some more settings for controlling the noise, but I haven't added them all to the menu yet. I'll probably just add more settings so people can play around with them.
Thanks for all the feedback, I really appreciate it!
I added an option for a bit more viewing distance in v2. With that said, there's an unfortunate trade-off between render distance and the layers in the stereogram, which you'll notice if you adjust the option. You still won't be able to see enemies as far as I'd like, but I'm not sure what else I can do short of changing the enemy behavior.