Является ли изучение OpenGL 2.1 бесполезным сегодня?

44

Я новичок в мире 3D OpenGL / DirectX и узнал, что спецификации OpenGL 4.1 и GLSL только что были выпущены сегодня.

Мой друг дал мне Красную книгу для OGL v2.1, но, насколько я прочитал, 3.x и 4.x сильно отличаются от 2.x, и многие вещи устарели.

Могу ли я использовать книгу, чтобы начать изучать основы 3D и CG, или лучше найти более новую копию?

reefaktor
источник
10
Я не очень разбираюсь в OpenGL / DirectX, но мне очень нравится играть в игры на компьютере, которому больше года. Я предполагаю, что ваше знание pre 3.x OpenGL будет полезно для моих игровых привычек. Просто мысль.
Simurr
Мне не нравится, как этот вопрос сформулирован. Можете ли вы сделать игру в OpenGL 2.1 ? Ответ: окончательное да . Что вы подразумеваете под бесполезным тогда? Можете ли вы научиться основам 3D из старой книги или устаревшего API? Опять однозначно да . Это лучший-лучший-лучший способ сделать это? Наверное, нет .
бобобо

Ответы:

18

В такие времена я всегда иду в Steam Hardware Survey: http://store.steampowered.com/hwsurvey/ - вы увидите, что проникновение на рынок систем класса DX10 / 11 составляет почти 80%; это в целом эквивалентно GL3.3 или выше. Эти 80% ограничены пользователями Vista / 7 - добавьте графический процессор DX10 / 11 с XP, и вы получите чуть более 90%.

Имея в виду, что мы говорим о немного более хардкорных геймерах, вам нужно начать думать о вашей целевой аудитории. Это те люди, на которых вы хотите нацелиться? Вы нацеливаетесь на тех, у кого более низкое оборудование? А как насчет графики Intel? А как насчет пользователей Mac и Linux? Это все вопросы, на которые вы должны ответить сами, поэтому общие рекомендации - это лучшее, что вы получите.

Кроме того, вы должны принять во внимание тот факт, что если вы начинаете сегодня учиться с намерением что-то отгрузить, вы ожидаете минимум один год, прежде чем попасть туда (если мы не говорим о действительно тривиальных / простых случаях). Продолжая тенденцию к росту возможностей gfx, мы ожидаем, что к тому времени мы станем ближе к 100% освоению оборудования GL3.3 +.

Затем учтите, что с GL2.1 или ниже вы будете изучать и использовать очень много глупой старой чепухи, даже если вы ограничиваете себя шейдерами и подмножеством VBO GL2.1 (версии GLSL нижнего уровня неудобны в использовании и потоковые VBO практически бесполезны без GL_ARB_map_buffer_range) - GL3.3 + представил гораздо более приятные (и более производительные) способы обработки многих вещей, вы будете лучше использовать аппаратное обеспечение проигрывателя (и они будут благодарны Вы за это), и вы будете тратить больше времени на написание продуктивного кода, чем на борьбу с API, который действительно не хочет с вами сотрудничать.

И затем, конечно, есть страшная ситуация с водителем. Жесткий, но реальный факт заключается в том, что драйверы GL в Windows находятся в плачевном состоянии - NV поддерживает то, что им не следует, AMD не поддерживает то, что им нужно, а с Intel вам действительно нужно ограничиться функциональностью GL, для которой есть эквивалент в D3D. Чем новее GL_VERSION, тем больше вероятность, что вы столкнетесь с ошибками драйверов, но для GL3.3 все достаточно стабильно.

Итак, сводка заключается в том, что в отсутствие какой-либо другой информации (целевой аудитории и т. Д.) Я бы нацелил GL3.3 в качестве базового уровня (возможно, используя функциональность более высоких GL_VERSION, где она доступна и где она не нарушает кодовую базу). слишком много), если не было очень конкретной и окончательно определенной причины идти на понижение (и я хотел бы быть абсолютно на 100% уверен в этом, вместо того, чтобы использовать какое-то смутное понятие « но как насчет тех, у кого старое оборудование »). В последнем случае я бы не стал опускаться ниже GL2.1, и я бы хотел использовать как можно больше возможностей 3.x даже тогда.

Максимус Минимус
источник
Отличное замечание по GL3.3 ~ = DX10 / 11 и статистике оборудования Steam.
Nate
Просто чтобы обновить эту статистику - DX10 / 11 GPU + Vista / 7 теперь составляют ~ 88%, добавьте еще 4,38% для DX10 / 11 GPU + XP, и вы ожидаете, что уровень проникновения составит более 90%. Поглощение растет намного быстрее, чем я ожидал, когда сделал этот оригинальный пост.
Максимус Минимус
«GL3.3 + ввел намного более приятные (и более производительные) способы обработки многих вещей» - как обстоят дела с 3.2? Пользователи Mac еще не получили 3.3. Я предполагал, что это почти то же самое, но не хочу брать на себя слишком много.
michael.bartnett
38

Я бы предложил придерживаться пересечения 2.1 и 3. Все еще есть много оборудования и драйверов, которые поддерживают только OpenGL 2.1, но практики, поощряемые ядром OpenGL 3 , лучше. Это учебное пособие является хорошим началом (учит OpenGL 2.0 без функций, которые были объявлены устаревшими в версии 3).

Джейк Макартур
источник
3
+1 за урок Джо Гроффа. Он проведет вас через весь конвейер в Главе 2. И любой «служебный» код, который он добавляет, - это всего лишь две функции: одна для чтения в файле (для GLSL) и одна для чтения изображений TGA (и вы также можете использовать другую библиотека изображений или напишите свой собственный загрузчик изображений, как только вы получите пример работы). Все остальное объясняется и является частью учебника.
michael.bartnett
18

Я бы сказал, что это не бесполезно.

Зачем? Что ж, хотя остальной мир поддерживает OpenGL 3.x и 4.0, Mac OS X по-прежнему поддерживает только OpenGL 2.1. И OpenGL ES, который используется на большинстве, если не на всех, портативных платформах, все еще широко поддерживается во всех версиях: 1.0, 1.1 и 2.0; которые примерно сопоставимы с OpenGL 1.4, 1.5 и 2.1 соответственно.

Таким образом, пока OpenGL ES 1.0 полностью не исчезнет с лица Земли, зная, что OpenGL 2.x не будет пустой тратой.

Это не значит, что нет смысла использовать OpenGL 3.x или 4.0 на платформах, которые его поддерживают, конечно.

Обновление: Начиная с выпуска Mac OS X Lion (10.7), профиль OpenGL 3.2 Core теперь поддерживается на Mac. Этот выпуск не поддерживает большие части OpenGL 1.x для упрощения API. Пользователи более старых версий OS X (и графических процессоров Intel начального уровня) по-прежнему ограничены OpenGL 2.0 и 2.1. Знание OpenGL 2.x, тем не менее, все еще полезно и останется таковым в течение довольно долгого времени.

greyfade
источник
Snow Leopard поддерживает большинство расширений OpenGL 3 - даже геометрические шейдеры.
Аксель Гнейтинг
@Alex Поддержка «большинства» расширений не означает, что поддерживается ядро ​​GL3. И мы просто говорим о 3.x
Матиас Вальденегро
@ Аксель Гнейтинг: Это просто не то же самое. Большинство интересных особенностей OpenGL 3.0+ не доступны в качестве расширений. Есть большое количество основных изменений.
Greyfade
12

Ответ mh01 охватил большую часть основ, поэтому я собираюсь добавить несколько дополнений.

OpenGL ES

Давайте поговорим о ES 2.0 против настольных GL 2.1 против настольных GL 3.3. Для целей этого обсуждения термин «GL XY» будет относиться к настольной версии OpenGL XY, в то время как «ES XY» будет относиться к OpenGL ES XY

Конструктивно ES 2.0 имеет больше общего с ядром GL 3.3, чем с GL 2.1. GL 3.3 и ES 2.0 основаны исключительно на шейдерах. Они оба основаны на чисто буферных объектах. И т.д. GL 2.1 имеет много ловушек производительности и кодирования, которые позволили бы легко написать приложение GL 2.1, которое было бы нелегко переносить на ES 2.0.

Однако, с точки зрения синтаксиса языка затенения , GLSL ES 1.00 (отображение на ES 2.0) выглядит гораздо больше как GLSL GL 2.1, чем GL 3.3. attributeИ varyingключевые слова не существует в 3.3 ядра; он использует inи out, что намного более последовательно и разумно, когда вы имеете дело с более чем двумя этапами шейдера (именно поэтому ES 3.0 принял синтаксис GL 3.3).

Понятия, изученные в GL 3.3, легко сопоставить с ES 2.0. Поэтому, если вы изучите GL 3.3 для любого из различных инструментов для этого, вы поймете, как работать в мире ES 2.0. Вам, конечно, нужно выяснить, где находится подмножество (т. Е. То, что GL 3.3 может делать, а ES 2.0 не может), но концепции те же.

Сопоставить синтаксис GLSL, чтобы вы могли копировать шейдеры из одного в другой, немного сложнее. Но на самом деле все, что нужно, это несколько # определений в нужных местах. Кроме того, GLSL 3.30 имеет несколько функций совместимости ES, как highpи так далее (которые ничего не делают в настольном GLSL).

Таким образом, вы получаете что-то для ES 2.0, изучая GL 3.3 вместо GL 2.1.

Николь Болас
источник
8

Для игр, которые не требуют больших изменений OpenGL, представленных только в более новых версиях, использование только 3.x + ограничивает вас серией nvidia 8 и выше (не уверен, что на других поставщиках графики вы захотите посмотреть это). Поэтому, если вы не используете функции 3.x +, вы просто создаете искусственный лимит, мешающий людям со старыми, но достаточно мощными видеокартами играть в вашу игру.

По этой причине я настоятельно рекомендую изучить совместимое с прямым набором и новые версии, а затем выбрать самую низкую версию, в которую вы можете эффективно продвинуть свою игру. Вы можете

В ответ на другой вопрос я также отмечу, что OpenGL: ES 2.0 удаляет конвейер фиксированных функций, поэтому он более эквивалентен 3.0, чем 2.1. Также всегда поддерживает различные функции для поддерживаемой версии gl во время выполнения.

jsimmons
источник
4

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

thbusch
источник
4

Я в основном согласен с thbusch. Но я бы не стал полностью игнорировать устаревшие API-интерфейсы: в них все еще слишком много кода, который их использует. Я бы уделил им гораздо меньше внимания. Нет смысла, например, в изучении glBegin (), glEnd () достаточно тщательно, чтобы написать собственный код, используя их. Но вы должны узнать их, когда увидите, и иметь представление о том, что они делают.

Тем не менее, стоит хотя бы раз прочитать всю Красную книгу, даже если вы не строите пример кода и выполняете упражнения, включающие функции, которые были прекращены в OpenGL 3.x.

user1800
источник
3

Краткий ответ:

Нет. Изучение OpenGL 2.1 - хорошая идея даже сегодня, если вы изучаете «хорошие части».

Длинный ответ:

OpenGL можно разделить на две части: «Хорошие части» и «Устаревшие функции».

Честно говоря, я не вижу большой пользы в изучении унаследованных функций («фиксированная функция»). Тем не менее, значительная часть OpenGL 2.1 (хорошие части) все еще доступна сегодня с относительно небольшими изменениями.

Таким образом, изучение некоторых частей OpenGL 2.1 может быть полезным. В частности, OpenGL ES 2 очень популярен в наши дни, а ES 2 в основном (но не совсем) является подмножеством OpenGL 2.1. Для 3D-программирования в смартфонах, OpenGL ES 2 является обязательным.

Так что же "хорошего"? По сути, все, что есть в OpenGL 3.x «профиль ядра» (в отличие от «профиля совместимости») и / или в OpenGL ES 2.

  • Вершинные и фрагментные шейдеры: изучите их
  • Текстуры: все еще хорошо.
  • Матрицы: знание того, как они работают, полезно, но glLoadIdentityи такого рода функции устарели и их следует избегать
  • Освещение: знание того, как свет можно имитировать в компьютерной графике, полезно, но glLightfvи других функций освещения с фиксированной функцией следует избегать.
  • Буферы массивов: хорошо
  • glBegin, glVertex, glColor, glEnd: Избегайте их. Может быть хорошо для быстрого экспериментирования, но есть и другие лучшие способы сделать то же самое.
  • Отображать списки: избегать

Вопрос, где я первоначально разместил этот ответ, оказался дубликатом, поэтому я размещаю его здесь.

luiscubal
источник
1

Я не верю, что это плохая идея. Многие концепции GL охватывают все версии OpenGL и, в конечном счете, помогут вам. У меня есть несколько книг по OpenGL 10 лет назад, которые до сих пор помогают. Я бы сказал, что если вы новичок в OpenGL и есть несколько лучших книг, которые старше, вы многому научитесь, и код все еще должен работать. Большая часть OpenGL обратно совместима (я считаю).

Mungoid
источник
1

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

Устаревшие вещи могут быть полезны в некоторых случаях, например, если вы пытаетесь запрограммировать что-то, поддерживающее только OpenGL 1.5 или более раннюю версию (можно найти на старых дрянных нетбуках и старых системах MacOS), OpenGL ES 1.x (более старые iPhone и Android до 1.6), или OpenGL SC (подмножество Saftey Critical, если вы программируете отображение на реактивном истребителе). Minecraft, например, построен на OpenGL 1.3, поэтому он может поддерживать действительно старое оборудование (но даже у него есть «продвинутая» опция).

Это также может быть полезно, если вы просто хотите получить пиксели на экране и не заботитесь о том, чтобы сделать это «правильным» способом.

Полезно полагаться на некоторые функции, которые OpenGL делает по умолчанию при обучении, такие как настройка окна просмотра от -1,0 до 1,0 и рендеринг без шейдеров. Это позволяет учиться без необходимости делать все за один раз.

Но кроме этого это должно быть пропущено, если это возможно.

Я предлагаю вам проверить мой ответ здесь и здесь для получения более подробной информации.

Дэвид С. Бишоп
источник