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:
Recent community posts
Yeah, the door is basically invisible at the moment; that's the main reason I recommended knowing the map beforehand. I'll fix that in the next update, with some kind of indicator that you're looking at a door.
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.
While I appreciate the praise, most of the work was done by the guys who wrote the paper, and the guy who wrote DoomLoader. I just mashed the two together. :)
And thanks for all the suggestions; I'm definitely going to look into them. Maybe I should start a discussion board for this...
That's a cool idea. I've never heard of an autostereogram like that, but I'm certainly willing to try it. The only problem I can think of is that edges of objects might look more aliased.
Also really interested in adding color, but I'm not sure what you mean by alternating between both images.
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.
Added an option for nearest neighbor (change filter mode in the options). It makes the image much sharper, but I don't notice much difference in the stereogram effect. Let me know if it helps; I might make it the default if people prefer it.