Ответ 1
Изменить: основные изменения и некоторые более полезные аргументы, которые ускользали от многих, включая меня в течение длительного времени. Также более точно и короче.
До OpenGL 3.0 не было возможности выбрать определенную версию OpenGL. Вы всегда получаете самую высокую версию, поддерживаемую возможностями вашего драйвера и графического адаптера. Это означало, что новая функциональность ядра должна была быть совместима со старой функциональностью из предыдущих версий, иначе старые приложения могли бы сломаться при работе на более поздней версии OpenGL. Побочным эффектом от неспособности выполнить изменения в предыдущих версиях было то, что OpenGL медленно начал страдать от ползучести функции. Функциональность была добавлена вместо того, чтобы улучшить то, что уже существует. Если вы посмотрите на OpenGL 2.1, то хорошим примером может служить большое количество различных вызовов рисования.
Новый вызов создания контекста, представленный в OpenGL 3.0 , наконец, позволяет вам выбрать определенную версию OpenGL для вашего контекста, а также если вы хотите использовать устаревшие функции или нет. Это означает, что OpenGL может, наконец, изменить старую функциональность ядра, и это подразумевает больше, чем просто удаление функций, которые я видел, когда некоторые люди используют в качестве контраргумента для изменений. Это также означает изменение семантики функций, не удаляя их. Примером является выполнение функций glGen.., обязательных для генерации имен объектов, и создание шейдеров и объектов массива вершин. (Последний устарел в OpenGL 3.3, не соблюдается).
Теперь, когда это возможно, 14 лет ползучести и плохих проектных решений могут быть окончательно устранены. Что имело смысл, когда OpenGL 1.1 был представлен в 1996 году, в 2010 году это не обязательно имеет смысл. Старые функции, которые сегодня не оптимальны, были удалены, а некоторые были удалены, чтобы сделать API более общим. Примером этого является удаление вызовов gl..Pointer, таких как glVertexPointer
, в пользу glVertexAttribPointer
. OpenGL 3.x, наконец, не маркирует ваши данные шейдера как "this" и "that"; Вам решать. Также были внесены изменения в существующую функциональность, поэтому они отличаются семантикой предыдущих версий. Шейдеры были сделаны обязательными, удалив стандартную шейдерную программу 0, которая использовалась для обозначения "шейдеров, отключенных/использующих фиксированную функциональность". Поскольку обратная связь вызывает, как glDrawElements
, возвращает GL_INVALID_OPERATION, когда неверная шейдерная программа привязана, вы фактически вынуждены сначала сделать шейдер.
Но все нельзя изменить за одну ночь, поэтому OpenGL 3.x представил модель устаревания. Функциональность устарела, по крайней мере, для одной версии до ее удаления в более поздних версиях. Удаленная функциональность была перенесена в расширение OpenGL, называемое GL_ARB_compatibility. Вы можете включить эту функцию, создав профиль совместимости, в отличие от основного профиля. Это флаг в вызове создания нового контекста, который принимается из OpenGL 3.1 и более поздних версий (не в версии 3.0). Устаревшие функциональные возможности можно принудительно отключить, создав перекрестно-совместимый контекст. Опять же, это флаг создания контекста.
Итак, OpenGL 3.x - это первый шаг, позволяющий выбирать определенные версии OpenGL и прерывать совместимость с предыдущими версиями, чтобы улучшить API; как в удобстве использования, так и для отражения аппаратного обеспечения в то время, когда мы находимся.