OpenGL has a huge variety of extensions and versions that often allow improved graphical effects, improved performance, and cleaner implementations. Use of these features has to be balanced against compatibility - older hardware or older graphics drivers may not support the newer features, or may have bugs that make the features unusable.
0 A.D. doesn't have the development resources to compete with modern commercial games in terms of fancy graphics, but we have the opportunity to exploit niches that commercial games can't reach. The whole of Linux is one niche; users with old or low-end computers who aren't regular modern gamers are another. So it's valuable to put a strong emphasis on compatibility, shifting the balance away from newer OpenGL features. This page documents the balance point currently chosen as of March 2011.
We don't discuss performance much here - this is more about whether the game runs at all.
This is the main design target, with the following minimum requirements:
- GL_VERSION 1.3.
- GL_ARB_fragment_program and GL_ARB_vertex_program (the old assembly syntax). This is almost universally supported: from Alpha 4 it looks like 2% of users are missing this (and they're ancient hardware that will probably never work fast enough), whereas 14% are missing GLSL, and GLSL has more performance and compatibility bugs, so GLSL has an unacceptable compatibility cost but ARB programs are acceptable. This increases code complexity compared to GLSL, but not hugely, and it's much more powerful and flexible than fixed-function multitexturing.
- GL_ARB_depth_texture and GL_ARB_shadow. Everything with ARB program support also supports these.
- GL_EXT_framebuffer_object. Almost everything with ARB program support also supports this.
- GL_EXT_texture_compression_s3tc. Allows better performance and significantly lower memory usage. Very widely supported, but missing on various Linux drivers and it's easy to automatically decompress textures as a fallback.
- GL_ARB_fragment_program_shadow. Allows better performance and better quality for shadow rendering, but not universally supported and it's easy to have an equivalent fallback behaviour.
- GL_ARB_fragment_shader and GL_ARB_vertex_shader (GLSL). Allows significantly more complex graphical effects, and significantly more concise shader implementations. We should use this only for optional effects for higher-end hardware (e.g. advanced water shader with dynamic reflections etc) when it's infeasible to implement with ARB programs.
Slightly below baseline
- If GL_ARB_depth_texture/GL_ARB_shadow/GL_EXT_framebuffer_object are missing, shadows are disabled.
Much below baseline
It's nice to basically run on low-end systems, at least for testing and so we can show the user an error message, and also as a fallback for users with severely buggy drivers. Ideally the game should run without crashing on the WinXP software implementation (OpenGL 1.1), though the rendering can be arbitrarily buggy. Ideally it shouldn't look terrible or unplayable on anything with GL_ARB_multitexture, though any non-critical features can be omitted (shadows, particles, FoW object shading, decent water, etc).