http://blog.wolfire.com/2010/01/Why-you-should-use-OpenGL-and-not-DirectX (4 years old, but still worth the read).
That is the worst pro-GL link to be sharing, such that I can't resist pointing out how densely packed with lies it is... it would take too long to debunk the whole article, so cherry picking a single line:
"On the other hand, if you use OpenGL, you get faster and more powerful graphics features than DirectX 11, and you get them on all versions of Windows, Mac and Linux, as well as the PS3, Wii, PSP, DS, and iPhone."
* OpenGL is faster than D3D9, but much slower than D3D11 (in terms of both CPU-side and GPU-side costs), not faster! Even though it's faster than GL, D3D11 is much slower than it should be, which is why AMD has created Mantle to replace it.
* PS3, Wii, PSP and DS do not use OpenGL; they each use a different proprietary API specific to that device.
* Windows has at least 3 different (and differently-broken) GL implementations, with different performance characteristics - you must test (and rewrite parts of) your code on all 3 implementations to ensure you're on the "fast path" for all three.
* Linux is a clusterfuck of outdated ports of the broken windows drivers, or differently broken open-source drivers.
* Mac is ok, but always lags behind supporting the latest version of the specification.
* iPhone uses GLES 1, 2 and 3... which is so slow and badly specified that they've now replaced it on iOS8 with their own proprietary API.
* Other mobile phones also use GLES as above, but like on Windows, there are umpteen different implementation each with their own bugs and performance pitfalls. You must test (and rewrite parts of) your code for every different device that you want to support.
And one point of my own:
* Each of the 3 Windows implementations contains GL 1, 2, 3, 4, the sub-versions, and vendor-specific extensions. Writing a game that's portable across a range of hardware generations, say GeForce8 to GeForce700 (even if just for a single OS!) requires re-writing parts of your code several times for different versions of the API / different extensions being available. Then when you want your game to be portable across vendors (Intel, AMD, nVidia), you then need to re-write parts of your code again to deal with different breaches of the specification, performance behaviors and available extensions. Then when you want your game to be portable across OS's, you need to rewrite parts of it again. At this point, you've done so much patching of your rendering code for special cases and workarounds, that you really haven't saved any time by using a single "portable" API. You may as well have used one API for Windows, one for Mac, and one for Linux -- it would've taken the same amount of time and effort. Id' argue that having 5 independent versions of the rendering back-end is better than 1 version full of 100 special cases, because the code will be cleaner and easier to maintain.
In fact, this is what most "AAA" games do -- they use D3D9x on Xbox360, GCM on PS3, GXM on PSP, GX on Wii, GNM on PS4, D3D11x on XboxOne, D3D11 on WinVista+, D3D11.1 on Win8+, D3D9 on WinXP, OpenGL 3/4 on Mac, OpenGL 2/3/4 on Linux, perhaps OpenGL 2/3/4 on Windows, GLES 2/3 on mobiles, Metal on iOS8 and Mantle on Win7+AMD!
A 'AAA' might be made up of a million lines of code, but only about 3000 of those actually use the underlying graphics API. That means we're arguing over 0.3% of the code-base here!
Porting a game from one API to another is only a few man-month's of work. Also, once you've learned one graphics API, you can learn another one in just days, because the concepts will be almost identical. So GL portability is just a pipe-dream not a reality, plus it's also just a red-herring because it's not actually an important issue.
David Rosen should be ashamed of that blog post... I don't know why he's never taken it down or published corrections.
That said... this isn't a GL vs D3D thread, so let's not turn it into one
Edited by Hodgman, 07 July 2014 - 07:34 PM.