Какую версию OpenGL изучать и / или использовать?

16

Итак, я новичок в OpenGL ... У меня есть общие знания по программированию игр, но мало практического опыта.

Я изучал различные статьи и книги и пытался погрузиться в OpenGL, но я нашел, что различные версии и старые и новые способы запутывают.

Наверное, мои первые вопросы: кто-нибудь знает цифры о процентах геймеров, которые могут запускать каждую версию OpenGL? Какова доля рынка? 2.x, 3.x, 4.x ...

Я изучил требования к Half Life 2, так как я знаю, что Valve обновил его OpenGL для работы на Mac, и я знаю, что они обычно пытаются поразить очень широкую пользовательскую базу, и они говорят, что минимум GeForce 8 Series. Я посмотрел 8800 GT на веб-сайте Nvidia, и в нем указана поддержка OpenGL 2.1. Что, может быть, я ошибаюсь, звучит для меня древне, поскольку уже есть 4.x. Я посмотрел драйвер для 8800GT и он говорит, что поддерживает 4.2! Немного расхождений, лол.

Я также читал о том, что XP поддерживает только до определенной версии, или OS X поддерживает только 3.2, или все виды других вещей. В целом, я просто смущен тем, сколько поддержки существует для различных версий и какую версию изучать / использовать.

Я также ищу учебные ресурсы. Мои результаты поиска пока указывают мне на OpenGL SuperBible. 4-е издание имеет отличные обзоры на Amazon, но учит 2.1. 5-е издание учит 3.3, и в обзорах есть пара моментов, в которых упоминается, что 4-е издание лучше и что 5-е издание не учит должным образом новых функций или что-то еще? По сути, даже в учебном материале я вижу расхождения и просто не знаю, с чего начать.

Из того, что я понимаю, 3.x начал совершенно новый способ работы, и я прочитал из различных статей и обзоров, что вы хотите "держаться подальше от устаревших функций, таких как glBegin (), glEnd ()", но много книг и учебники, которые я видел, используют этот метод. Я видел людей, которые говорили, что, по сути, новый способ делать вещи более сложный, а старый - плохой>.>

Только примечание, лично я знаю, что мне еще многое предстоит узнать заранее, но я заинтересован в тесселяции; так что я думаю, что это тоже важно, потому что, насколько я понимаю, это только в 4.x?

[кстати, мой рабочий стол поддерживает 4.2]

Кенмора
источник
Этот вопрос (о переполнении стека) выглядит дубликатом: stackoverflow.com/questions/6823371/…
Андерсон Грин,

Ответы:

21

Если вас интересует покрытие OpenGL, вам стоит начать с обзора оборудования Steam.

http://store.steampowered.com/hwsurvey?platform=pc

К сожалению, он, кажется, сломан прямо сейчас и не отображает статистику для видеокарт. : \

Я также читал такие вещи, как XP поддерживает только до определенной версии

DirectX 9 сопоставим с OpenGL 2.1, DirectX 10 с OpenGL 3.0 и DirectX 11 с OpenGL 4.0. Отсюда и неразбериха.

XP поддерживает все версии OpenGL, но не поддерживает DirectX 10 или выше. Именно так Microsoft хотела заставить людей перейти на Vista, но это не сработало. OpenGL является открытым стандартом, поэтому пока производители видеокарт готовы выпускать драйверы для XP, он будет поддерживать более новые версии OpenGL.

Из того, что я понимаю, 3.x начал совершенно новый способ ведения дел, и я прочитал из различных статей и обзоров, что вы хотите "держаться подальше от устаревших функций, таких как glBegin (), glEnd ()", но много книг и учебники, которые я видел, используют этот метод. Я видел людей, которые говорили, что, по сути, новый способ делать вещи более сложный, а старый - плохой>.>

Это очень большая проблема для OpenGL. По сути, в старые времена вы отправляли видео на видеокарту, используя «немедленный режим». Начните с glBegin, сделайте кое-что, закончите glEnd. Тем не менее, драйверы видеокарт не нравится это вообще . Как они могут знать, сколько вещей вы собираетесь отправить? Это будет 4 вершины для текстурированного четырехугольника или 100 000 для модели с кожей? Вот почему они ввели объекты буфера вершин (VBO). В то время как немедленный режим является связанным списком, VBO является статическим массивом. Разработчик знает, насколько он большой, водитель знает, насколько он большой. Все счастливы. Поэтому совет по стандартам OpenGL (Khronos Group) решил отказаться от немедленного режима для OpenGL 3.0 и выше. Однако это проблематично, как я покажу на простом примере.

Допустим, вы хотите отобразить текстурированный квад, начиная с нуля.

В OpenGL 2.1:

  • Установите матрицу проекции и вставьте ее GL_PROJECTION.
  • Установите матрицу вида модели и вставьте ее GL_MODELVIEW.
  • Загрузите изображение и поместите его в GL_TEXTURE_2Dручку.
  • Определите позиции, координаты текстуры и цвета для ваших вершин.
  • Привязать текстуру.
  • glBegin... glVertex2f... glTexCoord2f... glEnd.

В OpenGL 3.0:

  • Построить матрицу для проекции и просмотра модели.
  • Загрузите изображение и поместите его в GL_TEXTURE_2Dручку.
  • Определите позиции, текстурные координаты и цвета для ваших вершин и поместите их в VBO.
  • Создайте объект массива вершин (VAO) и присоедините ваши VBO.
  • Напишите шейдер для вывода текстурированного квадрата и поместите его в шейдерную программу.
  • Присоедините матрицы к шейдерной программе, используя униформу.
  • Привязать текстуру.
  • Прикрепите текстуру к шейдерной программе.
  • glDrawArrays,

Так что может пойти не так в первой версии?

  • Ваши позиции неверны.
  • Ваша вершина обмотки - неправильный путь.
  • Ваша текстура не загружается должным образом.
  • Ваша текстура не связана должным образом.
  • Ваша матрица проекции неверна.
  • Ваша матрица вида модели неверна.
  • Вы не отправляете правильные вершины.

А во второй версии у вас могут быть проблемы с вышеперечисленным и :

  • Ваши VBO не правы.
  • Ваш VAO не прав.
  • Ваш шейдер не прав.
  • Ваше связывание текстуры с шейдером неверно.

Без надлежащих средств отладки это становится серьезной проблемой. Вот почему люди говорят, что вы должны придерживаться немедленного режима. К счастью, теперь у нас есть бесплатный и отличный gDEBugger , но это не волшебная палочка .

Чтобы ответить на ваш вопрос: это зависит от вашей игры. Если вы хотите охватить широкую аудиторию (например, казуальную игру или 2D-платформер), вы должны нацелиться на 2.1. Если вы делаете эпическую космическую игру, которая все равно не будет работать на шестилетнем оборудовании, то цель 3.3. И если вам нужна последняя и лучшая версия для обеспечения совместимости в будущем, выберите целевой продукт 4.0.

knight666
источник
2
Я думаю, что вы демонстрируете некоторую предвзятость против VAO / VBO здесь. В действительности, если вы хотите нарисовать текстурированный квад, у вас будет полный набор VAO / VBO вместе с уже созданными шейдерами и текстурами (во время запуска программы - никто не создает их во время выполнения). Рисование текстурированного четырехугольника с помощью нового способа на самом деле представляет собой всего лишь несколько вызовов - по общему признанию, оно сначала загружает сложность при инициализации программы, тогда как старый способ раскрывает сложность во время выполнения.
Максимус Минимус
2
Но это именно то, что я имел в виду: теперь ваша ошибка может быть связана с вашими данными (данные вершин и объект текстуры), вашей программой шейдеров, вашим кодом шейдера, вашими матрицами, вашей равномерной загрузкой или привязкой VAO. Если вы начинаете с нуля , это много подсистем для проверки! И вы должны следить за гораздо большим состоянием.
knight666
1
Обратите внимание, что gDEBugger с сайта gremedy устарел. Я полагаю, заброшены, так как их форумы давно не работают. Инструмент был подобран AMD: gDEBugger .
MichaelHouse
2
"glBegin ... glVertex2f ... glTexCoord2f ... glEnd." Просто нет. glBegin, glVertex и т. д. никогда не были правы. glDrawArrays был представлен в OpenGL 1.1 (1997) и всегда должен использоваться поверх glBegin и End.
API-Beast
9

Некоторые статистические данные о совместимости оборудования вы можете посмотреть в обзоре Steam: http://store.steampowered.com/hwsurvey/ Хотя в нем перечислены DX10 и DX11, аппаратная совместимость такая же, как OpenGL 3 и OpenGL 4 соответственно. Обратите внимание, что состояние установки драйвера OpenGL на людях обычно хуже, чем у DX.

Windows XP не поддерживает DX10 или DX11, но OpenGL 3 и 4 должны быть в порядке, если драйверы в порядке. OSX поддерживает OpenGL 3 (максимум), в Linux вы получаете OpenGL 4 с драйверами от ATI / NVIDIA (конечно, только если это поддерживается аппаратным обеспечением).

Тогда есть также мобильные версии ES OpenGL. На самом деле, я бы посоветовал взглянуть на OpenGL ES 2.0, потому что он меньше и его легче изучать, но вам также необходимо использовать современные методы, например, шейдеры и VBO. Это также то, что используется на большинстве мобильных устройств (так что вы могли бы заняться созданием мобильных игр), а также WebGL в основном то же самое, так что вы могли бы фактически сделать все свое обучение в веб-браузере с его преимуществами быстрой разработки. OpenGL ES 3.0 выйдет этим летом.

Тесселяция - это функция OpenGL 4.0. Сначала вы должны изучить другие виды шейдеров, не говоря уже о всех основах, но я согласен, что это интересно - на самом деле я написал небольшой тест с ним: http://blog.tapiov.net/post/15189341463/playing- с-4-OpenGL-тесселляции

Тапио
источник
4
Блин, рыцарь 666 побил меня этим, с более подробным ответом. Тем не менее, часть ES стоит задуматься.
Тапио