opengl legacy что это
Всё об OpenGL в Dota 2
Уже несколько лет назад разработчики добавили в клиент поддержку технологий OpenGL и Vulkan. Мы вам рассказываем, что это за технологии, как их скачать и установить, а также почему поддержка данных API настолько важна для корпорации Valve и Dota 2.
Что такое OpenGL Support и Vulkan Support?
Для того, чтобы организовать взаимодействие одного приложения с другим в рамках выполнения определенной общей цели используется API (интерфейс программирования приложений). Он фактически улучшает связь между игрой и видеокартой, чтобы повысить производительность графики. OpenGL — это API, который используется при написании приложений с двухмерной и трехмерной графикой, одним из главных преимуществ которого является кроссплатформенность. Прямой аналог и главный конкурент этой технологии — DirectX, разрабатываемый корпорацией Microsoft.
История внедрения OpenGL и Vulkan в Dota 2
В сентябре далекого 2015 года компания Valve анонсировала внедрение поддержки OpenGL в Dota 2. К подобному решению компания подходила долго и планомерно — так, одной из основных причин для принятия подобного решения стал выпуск собственного железа, которое работает под управлением операционной системы Steam OS, основанной на одном из дистрибутивов Linux. Проблема усугублялась тем, что в среде Linux было невозможно скачать и запустить приложения, адаптированные под Windows. В связи с этим, компании пришлось искать решение — OpenGL. Именно данный набор API позволил компании перейти от версии Dota 2, предназначенной сугубо для Microsoft Windows к мультиплатформенному аналогу.
Вскоре после этого, компания-разработчик OpenGL решила выпустить обновленную версию своего продукта, которому судьбой было предначертано стать будущим конкурентом новинки от Microsoft — DirectX 12. Изначально «наследник» был известен как «новое поколение OpenGL», иначе говоря, «glNext». Впоследствии названием для нового детища стало слово «Vulkan». Новая версия сохранила столь необходимое для Dota 2 преимущество в мультиплатформенной поддержке — версия позволяла скачивать и запускать игры на таких платформах, как Windows, Linux и Mac OS.
В то же время, ещё одним из решающих факторов к внедрению Vulkan в Dota 2 стало то, что DirectX 11 и OpenGL были созданы с учетом одноядерных процессоров — в результате одно ядро управляет большинством различных процессов, в то время как остальные работают с низкой скоростью, а иногда и вовсе отключены. Новинка поддерживала процессоры с несколькими ядрами и потоками, что позволяло игре максимально продуктивно использовать все возможности устройства. Также, по заверениям разработчиков, Vulkan, в сравнении с OpenGL, уже на момент своего выхода позволял передавать намного большую часть требуемых задач от процессора к видеокарте. Это позволяло вывести опыт игроков в Dota 2 на совершенно новый уровень.
К сожалению, более слабые устройства оказались не способны на поддержку новинки. Изначальными требованиями к установке были следующие спецификации:
OpenGL/FAQ
Содержание
Что такое OpenGL?
OpenGL — это имя для спецификации, которая описывает поведение системы рендеринга на основе растеризации. Он определяет API, через который клиентское приложение может управлять этой системой. Система рендеринга OpenGL тщательно определена, чтобы сделать аппаратные реализации допустимыми.
Поставщики оборудования, люди, которые делают графические процессоры, несут ответственность за написание реализаций системы рендеринга OpenGL. Их реализации, обычно называемые «драйверами», переводят команды OpenGL API в команды GPU. Если определенная часть оборудования не может реализовать всю спецификацию OpenGL с помощью оборудования, поставщик оборудования должен по-прежнему предоставлять эту функцию, как правило, с помощью программной реализации функций, отсутствующих в оборудовании.
Чем НЕ является OpenGL?
OpenGL API имеет дело только с рендерингом графики. OpenGL не предоставляет функции для анимации, синхронизации, ввода-вывода файла, обработки формата файла изображения, графического интерфейса пользователя и так далее. OpenGL занимается только рендерингом.
Что такое GLUT?
GLUT — это не OpenGL. Это не часть OpenGL; это просто библиотека, которая используется некоторыми пользователями для создания окна OpenGL.
Кто поддерживает спецификацию OpenGL?
Спецификация OpenGL поддерживается комитетом Khronos Group, называемым OpenGL Architectural Review Board (ARB). Первоначально ARB была организацией, спонсируемой SGI, но она была принята Khronos Group.
OpenGL с открытым исходным кодом?
Нет, OpenGL не имеет исходного кода. GL — это спецификация, которую можно найти на офиц. сайте. Он описывает интерфейс, который использует программист, и ожидаемое поведение. OpenGL — это открытая спецификация. Любой может скачать спецификацию бесплатно. Это отличается от стандартов и спецификаций ISO, которые требуют денег для доступа.
Что такое Mesa3D?
Где я могу скачать OpenGL?
OpenGL не является программным продуктом. Это спецификация.
В Mac OS X реализация Apple OpenGL включена в ОС.
В Windows производители оборудования (такие как NVIDIA или AMD/ATI) используют спецификации для написания собственной реализации, поэтому OpenGL включен в поставляемые драйверы. Однако владельцам ноутбуков необходимо посетить производителя вашего ноутбука и загрузить драйверы от них.
Обновления ваших графических драйверов обычно достаточно, чтобы получить последнюю реализацию OpenGL для вашего графического оборудования. Этого достаточно для тех, кто хочет использовать приложения, требующие OpenGL.
Для программистов установка драйверов обычно недостаточна. Вам нужно будет загрузить указатели на функции OpenGL вручную или автоматически с помощью библиотеки. Более подробную информацию об этом можно найти на офиц. сайте, на странице «Начало работы».
Есть ли OpenGL SDK?
Фактически, OpenGL SDK нет. Существует коллекция веб-сайтов, некоторые (устаревшее) документации, а также ссылки на руководства, все можно найти на офиц. сайте. Но это не SDK.
NVIDIA и AMD имеют свои собственные SDK, оба из которых имеют различные примеры кода для OpenGL.
На каких платформах есть GL?
OpenGL ES часто поддерживается во встроенных системах, но OpenGL ES — это API, отличный от обычного OpenGL.
Что такое контекст OpenGL и зачем окно для рендеринга GL?
Вы должны создать контекст GL, чтобы вызовы функций GL имели смысл. Вы не можете просто написать минимальную программу, такую как эта:
Выше, программист просто хочет получить информацию об этой системе (без рендеринга чего-либо), но она просто не будет работать, потому что с драйвером GL не было установлено никакой связи.
Вы должны создать окно и правильно инициализировать контекст OpenGL из него. Затем вы должны сделать текущий контекст GL ( wglMakeCurrent для Windows и glXMakeCurrent для *nix).
Как мне сделать закадровый рендеринг?
Некоторые люди хотят делать закадровый рендеринг без отображения окна.
Наиболее очевидным решением является создание окна, которое будет нормальным для приложения OpenGL, но не показывать его. После того как окно и контекст созданы, вы можете выполнять вызовы функций GL как обычно.
Однако из-за теста владения пикселями все рендеринг в буфере кадров по-умолчанию скрытого окна будет иметь неопределенные значения пикселей. Таким образом, вы должны сделать FBO и сделать это. Если вы решили не создавать FBO и предпочитаете использовать буфер, существует риск, что он не будет работать.
Существуют расширения OpenGL, которые позволяют создавать контексты, в которых нет окна или кадрового буфера по-умолчанию.
Как это работает на Windows?
Все версии Windows поддерживают OpenGL.
Когда вы компилируете приложение, вы связываетесь с opengl32.dll (даже в Win64).
Когда вы запускаете вашу программу, opengl32.dll загружается и проверяет в реестре Windows, есть ли настоящий драйвер GL. Если есть, он загрузит его. Например, имя драйвера GL от ATI начинается с atioglxx.dll, а драйвер GL от NVIDIA — nvoglv32.dll. Фактические имена могут меняться в зависимости от версии выпуска.
Для этого есть несколько вспомогательных библиотек, выполняющих то, что обычно называется библиотеками загрузки расширений.
Важно знать, что opengl32.dll принадлежит Microsoft. Никто не может изменить это. Вы не должны заменять его. Вы не должны отправлять заявку с этим файлом. Вы также не должны отправлять nvoglv32.dll или любой другой системный файл.
Пользователь несет ответственность за установку драйвера, предоставляемого Dell, HP, nVidia, ATI/AMD, Intel, SiS и т. д. Хотя не стесняйтесь напоминать им об этом.
Как мне узнать, какую версию OpenGL я использую?
Чтобы получить последнюю версию, поддерживаемую вашим графическим процессором, обязательно обновите драйверы видео. Поддержка GL включена в драйверы вашей видеокарты. После того, вы можете заметить, что ваша версия GL, например, 2.1. Как вы можете получить последнюю версию? Это зависит от вашего GPU. Возможно, ваш графический процессор не поддерживает ничего более высокого, поэтому производитель вашей видеокарты не предоставляет более высокую версию. В этом случае вы можете либо купить новую видеокарту, либо попробовать Mesa3D (это средство визуализации программного обеспечения) — http://www.mesa3d.org.
Почему моя версия GL только 1.4 или ниже?
Есть три причины, по которым вы можете получить неожиданно низкую версию OpenGL.
В Windows вы можете получить версию с низким GL, если при создании контекста вы используете не ускоренный формат пикселей. Это означает, что вы получаете реализацию OpenGL по-умолчанию, которая является версией 1.1.
Решение этой проблемы заключается в том, чтобы быть более осторожным в выборе формата пикселя. Дополнительную информацию можно найти на офиц. сайте.
Другая причина низкой версии OpenGL состоит в том, что производители вашей видеокарты (и, следовательно, производители ваших видео драйверов) не предоставляют современную реализацию OpenGL. Есть много несуществующих поставщиков видеокарт. Однако, из существующих, это, скорее всего, произойдет с интегрированными графическими процессорами Intel.
Intel имеет тенденцию относительно постепенно выводить свои интегрированные графические процессоры, отказываясь от поддержки интегрированных графических процессоров, выпущенных всего несколько лет назад. Как только они откажутся от поддержки, они не будут предоставлять новые драйверы, которые предоставляют более высокие версии OpenGL. NVIDIA и AMD обеспечивают долгосрочную поддержку своих графических процессоров.
Другая причина заключается в том, что вы не установили драйверы видеокарты после установки ОС.
Обязательно запросите OpenGL с glGetString и убедитесь, что возвращаемые значения имеют смысл.
Мультииндексированный рендеринг
Это означает, что каждый атрибут вершины (позиция, нормаль и т. д.) имеет свой собственный индексный массив. OpenGL (и Direct3D, в этом отношении) не поддерживают это напрямую; они допускают только один индексный массив, который одинаково индексирует все массивы атрибутов (кроме Instanced arrays).
При работе с такими данными у вас есть два варианта. Вы либо корректируете данные в соответствии с моделью единого индекса OpenGL, либо делаете что-то другое. Первый — это традиционный подход.
В V линии определяют массив позиций («вершина», но это неправильно). В VN линии определяют массив нормалей. А линии vt определяют массив текстурных координат.
В F линии определяют грани многоугольника. Каждый набор чисел представляет одну вершину: комбинацию положения, нормали и координат текстуры (в данном случае). Таким образом, каждый полигон/поверхность имеет 3 вершины.
Значения строк f представляют собой индексы на основе 1 в ранее определенных массивах. Первый индекс переходит к первому определенному массиву, второй — к следующему и т. д.
В этом случае для каждой грани грани все три индекса одинаковы. Но формат OBJ не требует этого: f 1/1/1 2/2/2 3/2/2 f 5/5/5 6/6/6 3/4/5
Здесь вершины 3/2/2 и 3/4/5 — это разные вершины, несмотря на то, что обе используют индекс позиции 3.
Обычная вещь, которую нужно сделать, это преобразовать наборы индексов полигона в фактические отдельные индексы. Это требует дублирования некоторых данных в различных массивах атрибутов, чтобы они все имели одинаковую длину.
В качестве альтернативы возможно использование шейдерных механизмов для непосредственного использования этих данных. Для этого вместо прямой передачи данных о положении/нормали и т. д. Вы передаете атрибуты вершины, которые являются индексами полигона. Vertex Shader будет затем использовать эти показатели, чтобы принести фактические позиции/нормали и т. д. из массивов самих по себе.
Фактические массивы могут быть предоставлены VS с помощью ряда инструментов. Текстуры, как правило, слишком сложны для работы с этой целью, но текстуры буфера предоставляют удобный способ произвольного доступа к буферу из VS. UBO слишком малы для моделей с приличной стороной, но SSBO обычно могут иметь произвольный размер.
glClear и glScissor
Masking
Как я могу проверить на ошибки GL?
OpenGL хранит очередь накопленных кодов ошибок OpenGL, сгенерированных при обращении к его API. Когда не удается выполнить API OpenGL, он помещает код ошибки OpenGL в эту очередь.
Есть два альтернативных метода, которые приложение может использовать, чтобы обнаружить, когда генерируются ошибки OpenGL, и локализовать их источник:
Первый намного проще.
Какой формат файла 3D я должен использовать?
Новички часто задаются вопросом, какой формат файла 3D для своих данных меша использовать для своего проекта.
OpenGL не загружает файлы; поэтому вы можете использовать любой формат меша/сетки по вашему желанию. Это также означает, что вы должны предоставить соответствующий код загрузки самостоятельно; OpenGL не поможет вам.
Существует несколько вариантов форматов файлов с различными возможностями. Все эти форматы (и не только) могут быть загружены библиотекой Open Asset Import.
Использование памяти
Кажется, часто думают, что в драйвере OpenGL есть утечка памяти. Некоторые пользователи пишут простые программы, такие как эта:
и они замечают, что их использование памяти увеличивается каждый раз, когда вызывается их функция отображения. Это нормально. Драйвер может выделить некоторое пространство памяти, и, поскольку драйвер в основном черный ящик, мы не знаем, что он делает. Драйвер может выполнять некоторую работу по оптимизации во вторичном потоке или готовить некоторую область буферизации. Мы не знаем, что он делает, но утечки памяти нет.
Некоторые пользователи вызывают glDeleteTextures или glDeleteLists или одну из других функций удаления, и они замечают, что использование памяти не уменьшается. Вы ничего не можете с этим поделать. Драйвер осуществляет свое собственное управление памятью и может временно отказаться от освобождения. Следовательно, это не утечка памяти.
Кто управляет памятью? Как OpenGL управляет памятью?
Цель этого раздела — ответить тем, кто хочет знать, что происходит, когда они распределяют ресурсы и на видеокарте заканчивается VRAM. Такое поведение не задокументировано в спецификации GL, поскольку оно не касается системных ресурсов и системного дизайна. Дизайн системы может отличаться, и GL старается оставаться нейтральным в системе. Некоторые системы не имеют видеокарты. Некоторые системы имеют встроенный процессор/графический процессор с общей оперативной памятью.
Что означает Unresolved External Symbol? Некоторые новички пытаются скомпилировать свою программу GL и получают ошибки компоновщика, такие как:
и аналогичные ошибки компоновщика, связанные с другими функциями GL и, возможно, функциями GLU и другими функциями из других библиотек.
Приведенный выше пример относится к Microsoft Visual C++, но вы также можете получить ошибки компоновщика от других компоновщиков. Чтобы компоновщик выполнял свою работу, он должен знать, какой файл библиотеки он должен искать.
Для VC++ 2010 вы можете нажать Project в меню. Выберите Свойства. Из этого диалогового окна свойств, слева, Свойства конфигурации. Drop Linker. Нажмите на вход. На правой стороне написано «Дополнительные зависимости». Введите имя файла библиотеки и двоеточие. Для OpenGL это будет opengl32.lib. Для GLU это будет glu32.lib.
Кроме того, вы можете добавить эти строки:
Очевидно, мы не можем перечислить, что вам нужно сделать для каждой IDE. Вам нужно искать в Интернете или в руководствах. Вы должны знать, как использовать вашу IDE и ваш конкретный язык программирования.
В случае gcc пользователь вводит команду в CLI:
Это потому, что вы используете GLU, и вы не связали снова библиотеку GLU. Команда, которую вы должны ввести:
Что означает Not Declared In This Scope?
Некоторые новички пытаются скомпилировать свою программу GL и получают ошибки компиляции, такие как:
Вы, вероятно, не включили правильный заголовок OpenGL. Заголовок gl.h может не включать в себя все, что вам нужно. Вы должны использовать библиотеку загрузки OpenGL; в противном случае вам придется использовать glext.h, найденный в реестре OpenGL. Это также означает, что вам нужно вручную загружать функции OpenGL.
Могу ли я предварительно скомпилировать мои шейдеры?
GL 4.1 добавляет возможность компилировать программу и загружать двоичный файл программы из драйвера GL. Однако эти двоичные файлы зависят от графического процессора и драйвера. Нет гарантии, что они будут работать на других графических процессорах. Действительно, нет гарантии, что они будут работать на одном и том же графическом процессоре; изменения драйвера могут сделать старый двоичный файл несовместимым. Цель этой функции — один раз скомпилировать и сохранить на жестком диске для будущих запусков, но с возможностью использовать исходный источник, если произойдет обновление драйвера.
OpenGL OpenGL 4.6 или ARB_gl_spirv предоставляет возможность использовать шейдеры на языке SPIR-V, а не на GLSL. Это позволяет предварительно скомпилировать шейдер GLSL в SPIR-V, а затем загрузить его через интерфейс SPIR-V. Вы также можете предварительно скомпилировать свой шейдер из других языков или даже изобрести свой собственный, если он генерирует OpenGL-потребляемый SPIR-V.
Много маленьких 2D текстур
Эта техника также называется текстурным атласом.
Некоторые пользователи спрашивают о том, как объединить множество небольших 2D-текстур в одну большую 2D-текстуру (1024 x 1024 или что-то большее). Таким образом, вы можете избежать вызова glBindTexture и, возможно, получить некоторую производительность. Да, вы можете сделать это, но вы также должны следить за координатами текстуры в ваших моделях. Вы также должны остерегаться фильтрации текстур, потому что линейный фильтр может вызвать течение текселей (выборочная соседняя субтекстура).
Другое решение состоит в том, чтобы использовать текстуры 2D-массивов. Это решает проблему, которая присутствует в случае использования трехмерной текстуры, как описано выше. Слои массива в текстуре должны быть одинакового размера и формата.
Рендеринг шрифтов и текста
GL не отображает текст, потому что GL — библиотека низкого уровня. Он обрабатывает основы, такие как рендеринг точек, линий и треугольников, и любую технику, которая может появиться в будущем. Для отрисовки текста вам либо нужна сторонняя библиотека, либо вы делаете это самостоятельно.
Один из самых простых способов — создать текстуру со всеми символами. Затем визуализируйте много квадратов на экране и нанесите текстуру на карту персонажей.
Вы также можете иметь текстуру со словами или полными предложениями, которые вы можете визуализировать с помощью четырехугольника.
Вы также можете использовать функции своей ОС и получить доступ к шрифтам и сделать из них текстуры. Затем нанесите текстуру на карту для четырех квадратов.
Устаревшие вопросы OpenGL
Все эти ответы касаются удаленных возможностей Legacy OpenGL.
Поддерживают ли современные графические процессоры конвейер с фиксированными функциями? Современные графические процессоры больше не предоставляют специализированное оборудование для выполнения конкретных вычислений в конвейере OpenGL. Все сделано с шейдерами. Для сохранения совместимости драйвер GL генерирует шейдер, который эмулирует фиксированную функциональность.
Являются ли glTranslate/glRotate/glScale аппаратно ускоренными? Нет, нет известных графических процессоров, которые выполняют это.
Эти функции устарели в GL 3.0. Вы должны иметь свою собственную математическую библиотеку, создать свою собственную матрицу, загрузить свою матрицу в шейдер. Есть несколько библиотек, которые вы можете использовать для этого.
Как визуализировать в пиксельном пространстве
Установите определенную матрицу проекции:
Полноэкранный квад
Пользователи часто спрашивают, как сделать полноэкранный квад. Как должна выглядеть матрица проекции?
В GL на основе шейдеров шейдеру GLSL даже не нужна матрица. Вы можете просто сделать это
Вершины для вашего четырехугольника (или 2 треугольников) должны быть <-1,0, −1,0, 0,0>, <1,0, −1,0, 0,0>, <1,0, 1,0, 0,0>, <-1,0, 1,0, 0,0>.
Должен ли я использовать списки отображения, массивы вершин или объекты буфера вершин?
Списки отображения и массивы вершин были с GL с самого начала. Буферные объекты вершин были введены с GL 1.5. Хотя все они могут использоваться для визуализации примитивов, они не одинаковы и имеют отличные свойства:
И списки отображения, и массивы вершин являются устаревшими функциями OpenGL. Спецификация вершин теперь в основном делается с объектами буфера вершин и объектами массивов вершин в современном OpenGL. В качестве общего совета вы должны воздерживаться от использования устаревших конструкций в новых приложениях OpenGL.
Зачем ограничивать до 8 источников света?
Конвейер с фиксированной функцией OpenGL имеет концепцию максимального количества источников света для визуализации. У шейдеров нет источников света. Вы можете использовать шейдеры для рендеринга любого количества источников света, но вы должны построить эту среду в инструментах, которые дают вам шейдеры.
В фиксированной функции OpenGL часто спрашивают, почему GL поддерживает максимум 8 источников света. Это неправда, GL не накладывает максимум 8 источников света. Это накладывает минимум 8 огней. Ваша комбинация драйверов и графических процессоров может поддерживать более 8, но большинство из них ограничивают себя до 8. Причина в том, что она не становится заметной, когда на одной поверхности светит более 3 или 4 источников света. Так что на самом деле 8 — это чрезмерное число.
Например, если у вас есть город и уличные фонари, вам, вероятно, нужно более 8 уличных фонарей. Решение состоит в том, чтобы разделить улицы вашего города на участки, где только 3 источника света воздействуют на каждую поверхность.
Например, если вы выполняете эффекты частиц, где каждая частица является источником света, и у вас есть, возможно, 1000 частиц, это фактически безумное количество источников света для рендерера в реальном времени для старого оборудования (пример: оборудование, которое поддерживает GL 1.5). Вы можете обойтись всего одним источником света для всей группы частиц.
Теперь давайте посмотрим на это с другой точки зрения. В старой игре использовались огни? На самом деле они этого не сделали. Многие старые игры использовали световые карты для статических поверхностей. Для движущегося объекта они сами вычислили освещение, или оно было предварительно вычислено (он же объем света).
Что такое GLU?
GLU расшифровывается как OpenGL utility library (служебная библиотека OpenGL) и предоставляет удобные функции, наслоенные на унаследованные функции OpenGL. Популярные примеры функциональности GLU:
что в принципе облегчает процесс вычисления матрицы вида и проекции, которая будет использоваться во время рендеринга. Однако обе функции используют и/или должны использоваться в контексте унаследованной функции, называемой стеком матриц, и соответствующих функций манипулирования матрицей, которые делают их непригодными или недопустимыми в современных приложениях OpenGL, которые не намереваются использовать устаревшую или удаленную функциональность.
Если вы пишете приложение, которое использует современный OpenGL, то есть ядро OpenGL 3.0 или выше, рекомендуется либо написать свой собственный код, либо использовать стороннюю библиотеку, которая либо вообще не работает в OpenGL, либо использует OpenGL 3.0 или выше. Основные особенности и список подходящих сторонних библиотек можно найти здесь.
Legacy OpenGL
In 2008, version 3.0 of the OpenGL specification was released. With this revision, the Fixed Function Pipeline as well as most of the related OpenGL functions and constants were declared deprecated. These deprecated elements and concepts are now commonly referred to as legacy OpenGL. Legacy OpenGL is still supported by certain implementations that support core OpenGL 3.1 or higher and the GL_ARB_compatibility extension. Implementations that do not expose this extension do only offer features defined in the core OpenGL specification the implementation is based upon.
Note: There is a distinction between the above extension and the corresponding profile which was introduced with OpenGL 3.2.
Contents
Implementations of compatibility contexts
Both AMD and NVIDIA provide backwards-compatible implementations at least on Windows and Linux. Apple does only provide an implementation of the core profile and supports core OpenGL 3.2 on Mac OSX. Intel provides an implementation for Windows up to OpenGL 3.1 with Sandy Bridge CPUs and OpenGL 4.0 with Ivy Bridge CPUs. However, Intel’s Linux open-source driver developers have recently stated that they will not provide backward-compatibility on Linux.
Detecting legacy OpenGL
Although by no means exhaustive, the following examples are common in most legacy OpenGL applications.
Other regularly employed facilities are the matrix stack and matrix manipulation commands:
Fixed-Function lighting is found in most legacy applications as well. For that purpose, command such as:
are used to coarsely approximate real-world lighting with either flat shading or Gouraud shading.
Removed functionality
A comprehensive list of all functionality removed from core OpenGL 3.1 and higher can be found in Appendix E of the OpenGL 3.0 specification. The following enumeration shows some important areas that are affected by removal.
Reasons to avoid legacy OpenGL
Much of the functionality that was promoted to core OpenGL 3.0 was available as extensions before the specification was released. However, most of the features already moved away from legacy concepts like immediate mode vertex attribute specification and offered advantages in one or more of the following fields.
Performance
Depending on the number of vertices the geometry to be drawn is made up of, this will lead to a vast number of commands just to specify the vertex attributes. Client-side vertex arrays eliminate the CPU overhead by providing a way to large chunks of attributes with only a few API calls. However, they do not eliminate the need to transfer data to the GPU every time glDrawArrays or glDrawElements are called.
Vertex Buffer Objects use fewer API calls while storing all attributes in GPU memory, eliminating both above mentioned drawbacks. Vertex Array Objects offer even more facilities to reduce the number of API calls, yielding, if all prerequisites are met, only two function calls are needed for geometry of arbitrary complexity (though vertex throughput performance is more complicated than simply the number of API function calls).
Flexibility using shaders
As already mentioned above, shading programs allow for replacement of formerly fixed-function processing stages. Indisputably, shaders offer flexibility which is unmatched by the fixed-function pipeline and there is no point in arguing against them, since programmable shading is a direct reflection of the capabilities of the underlying hardware. Among countless examples depicting the effects possible with shaders, here are just a few which are noteworthy:
Complex Lighting Models
Fixed-function OpenGL provides only two local lighting models which actually attempt to simulate real-world lighting: flat shading, which produces values for a whole primitive and Gouraud shading which produces values at vertices which are then interpolated across the primitive. With shaders, the lighting model can be arbitrary, albeit still local. For instance, implementing per-pixel Phong shading in GLSL is a very common use-case.
Although supported by extensions as fixed functionality, shadow mapping using a render-to-texture approach and doing the mathematics involved directly in shaders is much more flexible and much less tedious. GLSL also offers dedicated functions to ease shadow-map lookups.
Among effects in this category are toon shading and cel shading.
Hardware Geometry Instancing
Moved to core in OpenGL 3.1, dedicated draw calls and corresponding GLSL 1.40 built-ins make this technique easy to use. Using legacy OpenGL, the developer had to either use the matrix stack and render an geometry multiple times, possibly using immediate-mode functions, or use arrays of object-to-world transformation matrices and also render geometry multiple times to achieve the same effect.
There are many ways to animate geometry. It can be as simple as a translation or rotation but it can also be a fully fledged character animation system. It can also mean doing no transformation of geometry at all, e.g. when transforming only texture coordinates to achieve certain effect with textures. Legacy application would often employ the matrix stack to achieve this. All of the above can be implemented using shaders and, depending on the algorithm, without much or any intervention from the application.
All of the above can also be combined into multiple permutations of shading programs yielding even more effects.
Compatibility
OpenGL ES 2 and 3 don’t support immediate mode. If the application is supposed to portable or compatible with mobile devices, the legacy options is not available. Also, although a new application which is supposed to work on more than one platform, e.g. Windows and Linux, drivers might not expose the compatibility extension and thus only support OpenGL 3.0 or higher core features. If so, the application will not work if only a legacy code path exists. Furthermore, if vendors should decide to drop the compatibility extension at some point, i.e. publish drivers only implementing the core profile, the same problem will arise. Writing applications that use only OpenGL 3.0 or higher core features have the advantage of being not only conforming to version 3.0 but also all other versions up to 4.3 and currently there are no known plans to deprecate more features. This means that applications are future proof regarding driver support on all major platforms until explicitly stated otherwise by hardware vendors.
Using the most recent OpenGL version
Remember: OpenGL is not a library, it is a specification. Like TCP/IP isn’t a library; TCP and IP simply define communication protocols, which libraries can implement.
You should always use the latest driver version. But OpenGL versions correspond in part to hardware facilities. The major version numbers for OpenGL generally represent tiers of hardware. For example, OpenGL 3.x is roughly equivalent to Direct3D 10-level hardware. OpenGL 4.x is roughly equivalent to Direct3D 11-level hardware.
So to use OpenGL 4.x features (hardware-based features that is. There are several features of 4.x that are available in 3.x hardware as extensions) means to confine your program to only running on 4.x hardware.
GL 3.x hardware is widely available these days, though 4.x hardware has been around for several years now and will only become more widely available. Which you choose is up to you and your needs.