I'm a complete beginner in graphics programming and want to learn more about the current graphics APIs. I've just finished reading this amazing "The history of opengl vertex data" article and really liked it. Can someone summarize or point me to some great resources about the history of other APIs?
I'd also love to hear your opinion about the current state of graphics APIs. What do you like and dislike? What is your favorite or preferred choice? And why? Also, what does a good graphics API in your mind look like? And how to know if one is good or bad?
I remember writing games using the DirectDraw API, when graphics cards had hardware acceleration, but only for 2D. (graphics processor, not GPU) It was mostly bit blitting on pixel buffers performed by letting the CPU tell fixed function hardware how to process data between buffers of graphics memory using different flags manipulating the integer processing.
Then I bought my first 3D accelerated Direct3D 6 graphics card, a pre-owned Matrox G400 card. It had fixed function hardware for bump-mapping, but none of my games used the non-standard features. https://en.wikipedia.org/wiki/Matrox_G400
The next Direct3D 7 graphics card, a Hercules 3D prophet, had a fixed function feature called Transform and lighting. https://developer.download.nvidia.com/assets/gamedev/docs/TransformAndLighting.pdf
During the era of Direct3D 8 graphics cards. I had a dedicated Sound Blaster Live 1024 sound card, with 4.1 surround sound and hardware EAX effects (used in games like Red Faction), This also became pointless, when Microsoft scrapped hardware accelerated sound, just to have the same crappy implementation on their newly released XBox. OpenAL provided an alternative, but not all games and sound cards supported OpenAL, so I could not longer use the expensive sound card.
With Direct3D 9, I started programming in vertex and pixel shader assembly. All this was again pointless, because GPU assembler was no longer allowed in the next shader model, because Direct3D 11 wanted everyone to use Microsoft's experimental and horribly broken HLSL compiler. https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/dx9-graphics-reference-asm-ps-instructions-ps-1-x
All the articles about new features in Direct3D 11 were comparing performance and features against Direct3D 9, because nobody used the Direct3D 10 API used to push sales of Windows Vista (I never even installed Vista). The Direct3D 11 API was also backwards compatible with older graphics cards using feature levels, so I could target the Direct3D 10 feature level and run on older cards using the Direct3D 11 API. Nobody cared if it would run on Vista or not, because nobody could run Vista.
When Direct3D 12 was not available on Windows 7, I just gave up on Windows completely and switched to Linux, which has Vulkan and software rendering.
Can someone summarize or point me to some great resources about the history of other APIs?
If you have not seen this - https://fgiesen.wordpress.com/2011/07/09/a-trip-through-the-graphics-pipeline-2011-index/
Not exactly history, but a good read to what graphics APIs & hardware evolved in early 2010s.
Thanks for sharing your experience!
I remember writing games using the DirectDraw API, when graphics cards had hardware acceleration, but only for 2D. (graphics processor, not GPU)
I thought GPU stands for graphics processing unit? What did you mean when you said "not GPU"?
During the era of Direct3D 8 graphics cards. I had a dedicated Sound Blaster Live 1024 sound card, with 4.1 surround sound and hardware EAX effects (used in games like Red Faction), This also became pointless, when Microsoft scrapped hardware accelerated sound, just to have the same crappy implementation on their newly released XBox.
I'm a little confused here. Your sound card was for your PC, right? What did it have to do with Xbox's crappy implementation? Also, just curious, what graphics card did you have in that era?
When Direct3D 12 was not available on Windows 7, I just gave up on Windows completely and switched to Linux, which has Vulkan and software rendering.
How has your experience been so far? Is Vulkan better than Direct3D 11 and 12? And what do you prefer: Vulkan or Direct3D 11?
Imho, D3D11 is way better API. Look for D3D12 and Vulkan only if you are CPU bottlenecked for your render command submission. If you are not, then there's no advantage, just more complex API, and if you're writing too simple code it will work actually slower. Only real reason from Vulkan is if you need to use RayTracing or MeshShader functionality on Linux. Because OpenGL cannot do that. But on Windows D3D12 offers that just fine.
People just didn't call them GPUs before 3D acceleration, just referred to them as graphics cards. The first thing people noticed were that blocky pixels were replaced with a smooth bi-linear, tri-linear or anisotropic interpolation (depending on game settings).
I had many different graphics cards. When Deus Ex invisible war was released, I bought a PNY Verto graphics card that was among the first with DirectX 9 compatibility and programmable shaders, these early cards capable of stencil shadows did not have an external exhaust for hot air, so I had to open my window during winter and sit with warm clothes to avoid overheating the CPU with hot air from the GPU. Then it turned out that the game wasn't even a good sequel to the original.
Microsoft replaced DirectSound with a cheap software reference implementation, so that games would sound the same on PC and XBox. In theory, it would be nice if they could have the same features as Sound Blaster Live (sounded like having an orchestra in your room with surround speakers), but Microsoft were no sound specialists (sounded flat and stiff without any environmental feeling nor smoothness). If you don't have hardware sound acceleration anymore, it's much better to just call the media layer directly and write your own sound mixer writing a stream of waves directly to the speakers for more control over the same performance.
Direct3D 11 was the best API when it comes to balancing power and usability, but Vulkan lets me play the latest AAA games on Linux.
Direct3D 11 has annoying manual padding of shader arguments, which is padded for different machine word lengths between CPU and GPU. Direct3D 12 does not new features I want so far, but staying with Direct3D 11 and Windows 7 forever is obviously not a long term solution.
When my new computer came with Windows 10, the system broke backward compatibility with so many USB gadgets that I could not even connect to the internet. Windows 7 was no longer supported by new motherboards. Then I installed Manjaro Linux and all my gadgets (router, MIDI synth, stylus, web camera) worked either out of the box or with one line to install them. Installing GPU drivers was actually easier on Manjaro than on Windows.
Vulkan still has the legacy from OpenGL of associating samplers with images, which can be worked around but coupling unrelated things makes it harder to keep an engine's implementation clean. None of the GPU APIs offer the same functional purity that a software renderer can offer, because they all tie resources to contexts, making regression testing more difficult.