Experimenting with the 3D visuals now. I want it to look like what you'd get with modern rendering techniques but only 1-bit display technology. Legibility will be the main challenge so the actual geometry will likely be pretty simple. I'm just getting a handle on Maya modeling though so for now the test geometry is a little too basic.
Normal rendering:
Dithered naively to 1-bit:
Well that doesn't look good to me. It could be improved with diffusion dithering but I don't want to just take a 24-bit image and dither it to 1-bit. I'd rather the scene be more stylized and easier to interpret. To me that means traced edges.
Basic wireframe rendering:
Straight-up wireframe rendering looks terrible. I want something to define boundaries between surfaces, not where triangles are. And even if I liked this look it's surprisingly not easy to get with modern rendering techniques. Wireframe rendering isn't supported in OpenGLES and performance-wise it's really bad on desktop cards. This needs to be done in a shader.
Unity Pro's built-in edge detection shader:
This generates edges based on depth and normal differences. Not bad, but it has a few key problems that make it feel wrong to me: missing edges and thick lines:
In the old days classic wireframe renderers plotted 1-pixel-thick lines directly, which means you'd never see these kinds of errors. It's a minor thing but I swim in a sea of minor things.
To get exactly what I want, I wrote a custom shader that has two steps:
Step 1: Give each poly face a random color based on the object's position and face normal.
Step 2: Use a post-processing shader to draw pixel-perfect lines separating each color area.
Perfect. (The doubled pixels in some spots here are due to adjacent edges in my shitty test geometry.) This technique has the benefit of giving me direct control over where the lines are. I plan to add texture influence over the color areas so I can put internal lines on faces.
Combining the lighting information with the wireframe, I can also switch to white-on-black lines for the dark areas:
Or add back the pattern dithering:
That's a bit overboard though. If I end up using dithering like this it'll probably be limited to a single shade:
The next step will be moving past this simple test geometry into something closer to the final level of detail. I'll probably try to build out this aft section of the ship while continuing to work on the rendering features.
It feels good to get back into shader programming. Still happy with Unity. I wish Maya had a modifier stack like Max.