Чтобы узнать, какие расширения поддерживаются конкретной реализацией OpenGL, нужно передать константу GL_EXTENSIONS в функцию glGetString, которая вернет строку со списком расширений, поддерживаемых данной реализацией. Некоторые поставщики сейчас поддерживают до 100 расширений OpenGL. Быстрое увеличение количества расширений в целом является позитивным фактором для развития OpenGL, хотя и создает некоторые проблемы. Поставщикам аппаратного обеспечения легко добавить новое расширение, зато разработчикам приложений приходится сталкиваться с головокружительным количеством нестандартных возможностей. Как и любой комитет по стандартам, ARB осмотрительно относится к включению расширения в состав стандарта OpenGL, За все время существования стандарта в нем не расширили ни одной основной возможности графического аппаратного обеспечения. Создатели OpenGL, Марк Сигал (Mark Segal) и Курт Экли (Kurt Akeley), так объясняют это: «Одна из причин такого решения - производительность. Графическое оборудование обычно спроектировано таким образом, что конкретные операции должны выполняться в определенном порядке; замена этих последовательностей произвольными алгоритмами обычно недопустима». Это утверждение почти соответствовало состоянию стандарта на 1994 г. (хотя тогда уже использовались программируемые графические архитектуры). Но сегодня практически все графическое аппаратное обеспечение является программируемым. Быстрое увеличение количества расширений и необходимость поддерживать интерфейс DirectX от Microsoft просто не оставляет производителям другого выбора. (Как станет ясно из последующих глав, предоставление разработчикам доступа к этим возможностям и есть цель языка шейдеров OpenGL.)
1.3. Архитектура приложений OpenGL
Основная часть функций OpenGL API предоставляет приложению возможности рисования в некоем графическом буфере кадров, но существуют и функции для получения данных из буфера. Интерфейс ориентирован на рисование как трехмерных геометрических фигур (точек, линий, многоугольников, которые в целом называются примитивами), так и растровых изображений и рисунков.
Архитектура приложений OpenGL представлена моделью клиент-сервер. Приложение (клиент) посылает команды, которые интерпретируются и обрабатываются реализацией OpenGL (сервером). Приложение и OpenGL-cepeep могут выполняться как на одном компьютере, так и на двух разных. Архитектура OpenGL подразумевает необходимость сохранять некоторые параметры состояния во время работы приложения. Часть из них хранится в адресном пространстве приложения (клиентские состояния), но большинство - в адресном пространстве OpenGL-сервера (серверные состояния).
Команды OpenGL всегда обрабатываются в том же порядке, в котором они получены сервером. Иногда завершение их выполнения может задерживаться из-за промежуточных операций, тогда команды OpenGL буферизуются. Внеочередное выполнение команд OpenGL не разрешено. Это означает, например, что следующий примитив не будет нарисован до тех пор, пока не будет полностью закончено рисование предыдущего. Такой порядок выполнения команд справедлив также для операций чтения из буфера и запросов состояния. Эти команды возвращают результат, полностью согласованный с выполнением всех предыдущих команд.