Я новичок в мире 3D OpenGL / DirectX и узнал, что спецификации OpenGL 4.1 и GLSL только что были выпущены сегодня.
Мой друг дал мне Красную книгу для OGL v2.1, но, насколько я прочитал, 3.x и 4.x сильно отличаются от 2.x, и многие вещи устарели.
Могу ли я использовать книгу, чтобы начать изучать основы 3D и CG, или лучше найти более новую копию?
Ответы:
В такие времена я всегда иду в 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 даже тогда.
источник
Я бы предложил придерживаться пересечения 2.1 и 3. Все еще есть много оборудования и драйверов, которые поддерживают только OpenGL 2.1, но практики, поощряемые ядром OpenGL 3 , лучше. Это учебное пособие является хорошим началом (учит OpenGL 2.0 без функций, которые были объявлены устаревшими в версии 3).
источник
Я бы сказал, что это не бесполезно.
Зачем? Что ж, хотя остальной мир поддерживает 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, тем не менее, все еще полезно и останется таковым в течение довольно долгого времени.
источник
Ответ 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.
источник
Для игр, которые не требуют больших изменений OpenGL, представленных только в более новых версиях, использование только 3.x + ограничивает вас серией nvidia 8 и выше (не уверен, что на других поставщиках графики вы захотите посмотреть это). Поэтому, если вы не используете функции 3.x +, вы просто создаете искусственный лимит, мешающий людям со старыми, но достаточно мощными видеокартами играть в вашу игру.
По этой причине я настоятельно рекомендую изучить совместимое с прямым набором и новые версии, а затем выбрать самую низкую версию, в которую вы можете эффективно продвинуть свою игру. Вы можете
В ответ на другой вопрос я также отмечу, что OpenGL: ES 2.0 удаляет конвейер фиксированных функций, поэтому он более эквивалентен 3.0, чем 2.1. Также всегда поддерживает различные функции для поддерживаемой версии gl во время выполнения.
источник
Я бы сказал, что изучать OpenGL с помощью вашей Красной книги - это просто, просто игнорируйте те вещи, которые не рекомендуются в более новых версиях (например, glBegin (), glEnd () - вместо этого используйте VBO). Большая часть функциональности в более новых версиях уже была доступна через расширения.
источник
Я в основном согласен с thbusch. Но я бы не стал полностью игнорировать устаревшие API-интерфейсы: в них все еще слишком много кода, который их использует. Я бы уделил им гораздо меньше внимания. Нет смысла, например, в изучении glBegin (), glEnd () достаточно тщательно, чтобы написать собственный код, используя их. Но вы должны узнать их, когда увидите, и иметь представление о том, что они делают.
Тем не менее, стоит хотя бы раз прочитать всю Красную книгу, даже если вы не строите пример кода и выполняете упражнения, включающие функции, которые были прекращены в OpenGL 3.x.
источник
Краткий ответ:
Нет. Изучение 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
: Избегайте их. Может быть хорошо для быстрого экспериментирования, но есть и другие лучшие способы сделать то же самое.Вопрос, где я первоначально разместил этот ответ, оказался дубликатом, поэтому я размещаю его здесь.
источник
Я не верю, что это плохая идея. Многие концепции GL охватывают все версии OpenGL и, в конечном счете, помогут вам. У меня есть несколько книг по OpenGL 10 лет назад, которые до сих пор помогают. Я бы сказал, что если вы новичок в OpenGL и есть несколько лучших книг, которые старше, вы многому научитесь, и код все еще должен работать. Большая часть OpenGL обратно совместима (я считаю).
источник
Я советую вам сначала изучить современные вещи и просто притвориться, что устаревших вещей не существует, пока они вам не понадобятся.
Устаревшие вещи могут быть полезны в некоторых случаях, например, если вы пытаетесь запрограммировать что-то, поддерживающее только 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 и рендеринг без шейдеров. Это позволяет учиться без необходимости делать все за один раз.
Но кроме этого это должно быть пропущено, если это возможно.
Я предлагаю вам проверить мой ответ здесь и здесь для получения более подробной информации.
источник