Весь смысл низкоуровневого API состоит в том, чтобы сделать его как можно более минималистичным и переносимым. Придание ей объектно-ориентированной архитектуры не позволило бы этого:
- Полиморфизм добавляет ненужные накладные расходы на вызов функции.
- Это вынуждает вас использовать довольно сложное соглашение о вызовах, которое уменьшает мобильность.
- Вы не можете обернуть объектно-ориентированную архитектуру, чтобы сделать ее процедурной, но вы можете сделать наоборот; поэтому имеет смысл сделать вещи максимально гибкими. Если хотите, написать объектно-ориентированную оболочку вокруг OpenGL тривиально.
Наконец, вам действительно следует усомниться в том, чему вас учили об ООП. Несмотря на то, что ваш колледж или университет может вам сказать, ООП не является панацеей от разработки программы. Есть очень веские причины, почему в C ++ STL нет абсолютно никакой объектной ориентации (и в большинстве случаев Boost).
Объектная ориентация полезна в некоторых случаях, но вы должны узнать, когда она полезна, а когда нет, и ни при каких обстоятельствах не следует верить, что все, что не является ООП, является «плохим стилем».