A downloadable game for Windows, macOS, and Linux
About the Game
OMDO plays just like DOOM, except every frame is a random dot autostereogram. If you don't know what that is, you should read more about it here, but the gist is that you have to either go cross-eyed or wall-eyed in order to see the game. Otherwise it just looks like a bunch of random dots.
The first three maps should be fully functional, thanks to DoomLoader (see below). It helps to be familiar with those maps beforehand, but not necessary. You can switch between cross and parallel view, depending on what you're most comfortable with.
Regular DOOM controls for the most part. WASD and mouse to move and look. Space to use, left click to shoot. If you hit a wall at the end of a corridor it's probably a door, try hitting space.
Stuff I Used
I used DoomLoader, an amazing Unity asset package made by Risto Paasivirta for loading DOOM WAD files directly into Unity. Only the first DOOM WAD is included, which is available as shareware on the wiki.
The autostereogram algorithm was originally written in C in a paper published by Harold Thimbleby, Stuart Inglis, and Ian Witten. A webapp called MagicEye.js adapted it to JS, and I made a very similar version in C# for Unity.
Unzip and run the exe
- v2 updateJun 18, 2018
Log in with itch.io to leave a comment.
This game looks clever. But it needs to be updated for me to play it on mac 10.15.
Really clever idea! I could see some square and rectangular shapes but had a lot of trouble finding monsters...
You did the great job. For the moment I found only 2 things really training eyes, one of them is your beautiful OMDO and the next one is the video attached here (parallel version available as well):It would be so good if you add some hot keys to adjust the angle for crossed eyes. I actually can't see the scene because of the strabismus. When I focus on the display my eyes already cross a little and the scene becames to reveal in front of the screen... but then my eyes wrongly focuse it and it disappears. I see 'flashes' and trying to stabilize them somehow but it's hard. I can't for the moment :( And I think I'm not alone. Don't you want to add a little improvement?
This really looks sick, and a version that runs on the web would be nice.
This is fun. I've liked this kind of thing ever since trying the Quake 2 SIRD mod. Is there source available? I'd like to try tinkering with the algorithm.
How did you do the menu system? I would very much like to know how to do that.
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:
Really interresting and amazing experience. The problem is that I have difficulties to see ennemies lol
I still don't understand to this day why I can't see the damn picture. I have no visual impairments, and I've tried everything... apart from that this is some insane shit! Very clever and original.
intriguing! haha, I am almost blind in one eye (stereoblind they call it)- so I've never been able to see these images in any capacity, even as a kid. Still cant :P Haha, but that's how you know its an interesting phenomenon (autostereograms).
This is the coolest thing since sliced bread. However, I really wish I could enjoy the levels without dying right away. What I really want is a nomonsters option... but maybe the way you're importing the wad would make that difficult to do?
I can see perfectly fine, even see the imp fireballs fly by...but holy crap what difficulty is this on? I play zdoom on ultra-violence with ease and this is near impossible. That second room that has 5 or so enemies in it brings me to less than 20hp almost no matter what I do, then the room with slime after that is simply not possible to go into without being instantly killed by enemies that are outside of render distance. I've also noticed there's no button on the pillar in the room to the left of the start.. Not sure if thats because its the shareware version or what.
Is anyone else experiencing really low frame rates at 4k? Also, plz make the reticle bigger, and make there be two, one in each part of the stereogram so that it doesn't melt my brain to aim. If the reticle was easier to see that'd be cool too.
Just some feedback on current playability... I find the ++ render distance is best by far......I can kill the first 5 NPC's and get my self a shot gun, but i cant find my way out of the first chamber.
Some people are commenting that they get head aches or eye strain...for myself it is quite the opposite, I would much prefer to view in the parallel mode, i find it far less straining on the eyes.
okay, found the way out...yep, this thing is playable
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 how you apply colour, the paradigm shift comes when you realise consecutive frames can be use to "stabilize" the autostereogram
On the left is a single colour stereogram. RGB (0.5, 0, 0.5)
On the right is the same stereogram but it's colour is mainly distributed between left and right. RGB (1,0,0) & (0, 0, 1)...(i have included 1 matched pixel to help with alignment)
In the distributed stereogram your eyes will fight for dominance but if you swap the location of left and right on each consecutive frame you will negate this....we used a simple gif animator to test this. But if you stay very still and stare long enough you will see the effect.
The trick would be to distribute the colour in such a way that the image can't be seen(well) outside of the parallel and crossed modes.
Now I can run it on Mac. Thank you!
It's quite difficult to see the picture, I see corridors, but have never seen enemies. If it's possible to make watching simpler, it would be nice.
NPC's appear to render "better" when render distance is set to the lowest as it appears to give the same amount of layers across a smaller depth of field.
I tried for a while to focus, didn;t work. Then my eyes flashed, then I got a splitting headache. Maybe it's not for me lol. Neat idea though.
The animation of the bullet hitting the render has an effectively infinite number of layers....you should be able to have an infinite number of layers in your render instead of just a few if you examine what is happening there and implement it into the "pipeline".
There is no bullet (raycast), what you see is probably bullet explosion hitting wall.
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 have been consulting with a colleague and very good friend about this, a neuroscience specializing in vision science.... you will gain a massive improvement in a persons susceptibility and vision stability by making the random "dot" aspect ratio longer in the vertical, so it becomes a random "strip" autostereogram"(e.g. 1 pixel wide x 5 pixel high)...there may also be ways to optimize the "randomness" using the irrational "Phi" in whatever algorithm you are using....we have discussed ways to make the image full colour with alternating and mixed RGB between both images, frame rate will be limiting... looking so much forward to seeing this develop.....
From what i can see you are using a 3x3 as a pixel....if you shift the 3x3 each frame by 2 pixels in both x and y you can achieve an effective "screen resolution". FYI 2/3 is a Fibonacci ratio... but as mentioned you will benefit from an aspect ratio longer in the vertical. Perhaps a 2Hx5V with the pixel shifting 3H and 8V each frame(again this is using Fibonacci)
I can see you are using 4? colours in your random colour...if you use 3(RGB) you should be able to implement full colour. Just split your actual colour "randomly"(phi) across both images in a "randomly" cycling manner...giving an average of the actual colour.
Full colour and full screen resolution are the easier bit.
Infinite depth is possible when each frame consists of part of an image from each depth.
At the moment you are displaying 16? depths on each frame...so display 16 shifting depths..... shift the depth of each of those depths by a fraction of 0.618(phi) of the space between each depth but only render part of each depth in a "random" distributed cycle across the screen.. so each 2x5 pixel on one frame either side of the screen has a partner(or at most a partner in the frame before of after it), but each adjacent 2x5 pixel will likely represent a different depth and each pixel on the screen is likely changing on each frame..... this should give you your "infinite" depth auto stereogram. ( limited only by the screen resolution)
Phi is irrational and will be impossible to work with so using the rational Fibonacci's will make this possible :
0, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584,
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 stereogram consists of essentially 2 images constructed of noise that has been shifted...distribute the RGB colour across each image and across frames(across space and time) so say you want a pixel to be purple..the left and right corresponding 2x5 pixel groups might be a collection of red and blue, (#FF0000 and #0000FF) in a random distribution across the screen and across sequential frames...
The big improvement will come if you can manage to implement the depth shifting which i feel comes hand in hand with the pixel shifting...this will give you full screen resolution and infinite depth......and it negates aliasing.
Might sound hard to believe, but I had this very idea about 12 months ago so I've had some time to think about this. But we were to use idtech4 BFG and integrate other c+ physics simulators to develop and train A.I. Our principal programmer had R.L issues so we never got around to really starting. I hope you appreciate what you are about to unleash....turning every 2D screen into a 3D puppet show, the games will be one thing....the applications in real-time medical imaging.....well...let's just say you're a pioneer sir, and it's a real honor to greet you...
pardon me, i should not be so presumptuous....perhaps a mam.
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...
Can you give us a brief description of your "mashing".....i am gathering from other comments that you averaged? and rounded? render to 16? depths.... can you shift these depth locations on each sequential frame?... be a major step
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.
Do the original Half-Life!
After update to version 2.1 Its much better, but i think enemies should not shoot at player when they are out of render at least those hitscanners. Zombiemans.
Also a good addition would be possibility to run this with original wads. If you also could do something with invisible doors, maybe indicate them with a symbol that will popup at different layer than door, when a player is close? (Something simple, triangle maybe?)
This can turn to another yet very different port of doom. It needs polishing but it is possible.
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!
The only issue I have is that the moment that I get hit, my eyes refocus because of the red fresnel effect. Is there any way to fix this?
Once I got the hang of the stereoscopic view I can now switch my brain instantly into it. Once I switched my monitor into 144hz it was MUCH easier as well, I was seeing some flickering/tearing from the refresh rate on 60hz. Is there a way to get unity to use exclusive fullscreen? That would help with people that have G-Sync monitors and a second screen, you can't get it to work outside exclusive fullscreen (not windowed fullscreen like unity usually runs)
It's weird though, I see some circles in the 3d view when I look around (they are 3d, cylinders i guess would be a better description) it's probably an artefact of the view distance.
I wonder if there is any way to add a slight tint to the enemies to make them stand out more, maybe make the dots darker or lighter in that area (no idea how this kind 3d effect works).
The distance also seems exaggerated, like everything is way further away than it is.
Maybe it could be cool to add a normal-view toggle (like a hotkey) to see the normal rendering (even without textures), it could help people figure out what they are supposed to see.
I love the idea so far, what effect would making the noise finer or coarser have? What about if it changes faster or slower. I imagine it would affect the 3d effect, but can it be finer and still work?
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!
Game is very good after those v2 fixes (render distance and grayscale) but it's still crashing because of RAM overload (it is able to load over 12GB and then crash).
Sorry about that; should be fixed now in v2.1. Just a weird issue with textures not being garbage collected.
To run on CentOS 7 I had to do:
sudo yum install glibc.i686 libstdc++.i686 gtk2-devel-2.24.31-1.el7.i686 mesa-dri-drivers.i686 mesa-libGL-devel.i686 mesa-libGLU-devel.i686 mesa-libGLU.i686
It is a great idea but at the moment this game is unplayable, due to range that player can see. I made a screenshot that show player range, the stereogram on my image is Cross eyed.
Right now enemies can spot player at too great distance so player doesn't have any chance with them.
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.
I can see the enviroment fine but the enemies are practically invisible.. :(
Yes this is true. Enemies can spot player at too far away distance when player cannot see them yet. You need to be very close like 3 meters from them to see.
Is it weird that I can see magic eyes no problem but can't even make out these still images, much less the game? I can even see the images produced by that applet just fine.
Is there any way to switch this from parallel convergence to cross-eyed convergence?
I'm absolutely useless at doing these the normal way, but cross eyed I can get them almost instantly.
Yeah, there's an option on the main menu for each method.
Enemies are very hard to see if they are far. I would suggest you to reduce their view range.
After playing 7-10 minutes this game started to run badly. I had screen freezes and then after some more time game window stopped to respond.
It's to hard to see.
Whe need Mac.
Can you make a version for Linux, please?
I added Mac and Linux, but I'm not set up to test them at the moment. Leave a comment if you have any issues. :)
I tried it and the game loads, but I can't see anything. I can see the effect in your screenshots without problem. Nothing appears to change when I try to move. Here's a screenshot and below is the settings used for it. I also tried other settings, but couldn't get something that I could see. I'm on Ubuntu MATE 18.04 with Nvidia GTX 960 graphics and 2560x1440 resolution.
That's crazy, when I started to actually see stuff I was totally weirded out!