The development of Selaco demonstrates that raw power is not the only path to visual realism. The team has managed to extract performance and graphical quality from GZDoom, an engine based on the veteran Doom Engine, by implementing a software-based dynamic lighting system that rivals modern rendering techniques. This technical achievement, combined with an environment destruction system based on predefined volumes and an advanced particle emitter, makes Selaco a case study on how to optimize limited tools to achieve AAA results.
Reverse Engineering: Lighting, Particles, and Destruction in GZDoom 🛠️
To achieve dynamic lighting, the developers modified GZDoom's rendering pipeline, replacing flat shading with a per-pixel lighting model that calculates soft shadows in real-time on 2.5D geometry. This is accomplished by injecting custom GLSL shaders that simulate bounced lighting without the need for hardware raytracing. The particle system, meanwhile, was rewritten from scratch to support collisions against the map and heat decay, enabling explosions that melt virtual metals. Environment destruction was implemented through a system of dynamic sectors that swap high-detail textures (created in Photoshop) and 3D rubble models (modeled in Blender) upon impact, all without breaking the engine's block structure.
Lessons for Indie Developers: Craftsmanship Over Engine 🎨
Selaco shows that the true limit of a game engine is not its age, but the creativity to modify it. By using Blender to create optimized polygonal assets and Photoshop for textures with normal maps and ambient occlusion, the team has built a bridge between traditional pixel art and modern photorealism. For the independent developer, the lesson is clear: mastering modeling and texturing tools can compensate for the lack of an AAA engine. The key lies in understanding the base engine's strengths and forcing it to do what it was not designed to do, without losing its classic identity.
What was the biggest technical challenge the Selaco team faced when implementing dynamic lighting in GZDoom without sacrificing the classic engine's performance?
(PS: shaders are like mayonnaise: if they break, you have to start all over again)