The Last of the Jaggies
It took me two and a half years, but I freakin' FINALLY murdered the last surviving jaggies.
I started out using a typical edge detection post-process effect for the glowing edges. Then for a while I was supersampling the edges. Then I switched to a new system based on GL_LINES, which finally gave me some nice anti-aliasing. As a refresher, here's the comparison:
This has worked pretty well for the most part, except for a few cases where I got Z-fighting between the solid geometry and the lines. It looked like this:
I tried to mitigate this by restoring the depth buffer with a shader that sampled multiple pixels, taking the farthest one, but it wasn't enough.
A lot of times it was more subtle than the above example. The anti-aliasing would get cut off by the depth buffer:
Long story short, turns out drawing lines on top of solid objects is a common problem in 3D modelling software, and thus OpenGL has a built-in solution called glPolygonOffset. You render the solid geometry with a specially calculated depth offset that takes the depth derivative into account. So polygons that have a larger depth differential get offset more.
Rendering the whole scene with this offset messed things up for my culling system, so I settled on drawing the scene once normally, then instead of restoring the depth buffer later for edge rendering, I render the whole scene again in a depth-only pass with the polygon offset enabled.
It works beautifully:
Shotgun kick
I'll leave you with this gif of a feature I threw in yesterday. The shotgun has a teensy bit of kick now.
It's a minor thing in the grand scheme, but it makes me happy.