Чи сьогодні навчання OpenGL 2.1 марне?


44

Я новачок у світі 3D OpenGL / DirectX, і я дізнався, що специфікації OpenGL 4.1 та GLSL були щойно випущені.

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

Чи можу я використати книгу, щоб почати вивчати основи 3D та CG або краще знайти нову копію?


10
Я мало знаю про OpenGL / DirectX, але мені подобається грати в ігри на машині, якій більше року. Я думаю, що ваше знання до 3.x OpenGL буде корисним для моїх ігрових звичок. Просто думка.
Сімурр

Мені не подобається формулювання цього питання. Чи можете ви зробити гру в OpenGL 2.1 ? Відповідь: остаточний Так . Що ви маєте на увазі під марним ? Чи можете ви засвоїти основи 3D із старої книги чи застарілого API? Знову остаточний так . Це найкращий-найкращий-найкращий спосіб це зробити? Напевно, ні .
бобобо

Відповіді:


18

У такі часи я завжди беру участь у опитуванні обладнання Steam: 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 або нижчою версією ви збираєтеся вчитися і використовуєте дуже багато грубої старої дурниці, навіть якщо ви обмежитеся шейдерами та підмножиною VBOs 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.
Нейт

Тільки для оновлення цих статистичних даних - графічний процесор DX10 / 11 + Vista / 7 зараз становить ~ 88%, додайте ще 4,38% для DX10 / 11 GPU + XP, і ви з комфортом дивитесь на 90% проникнення. Поглинання зростає набагато швидше, ніж я передбачав, коли робив цю оригінальну посаду.
Максим Мінімус

"GL3.3 + запровадив набагато приємніші (і ефективніші) способи поводження з багатьма речами". Користувачі 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) тепер на Mac підтримується основний профіль OpenGL 3.2. Цей випуск знецінює великі частини OpenGL 1.x для спрощення API. Користувачі старих версій OS X (та графіки низьких класів Intel) все ще обмежені OpenGL 2.0 та 2.1. Знання OpenGL 2.x все-таки корисне і залишатиметься таким протягом досить довгого часу.


Snow Leopard підтримує більшість розширень OpenGL 3 - навіть шейдери геометрії.
Axel Gneiting

@Alex Підтримка "більшості" розширень не означає, що основний GL3 підтримується. І ми просто говоримо про 3.x
Matias Valdenegro

@Axel Gneiting: Це просто не те саме. Більшість цікавих особливостей 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, щоб ви могли копіювати шейдери з одного в інший, трохи складніше. Але насправді, все, що потрібно, - це декілька #defines у потрібних місцях. Крім того, 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 під час виконання.


4

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


4

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

Все-таки варто хоча б раз прочитати всю Червону книгу, навіть якщо ви не побудуєте зразок коду та виконайте вправи, що охоплюють функції, припинені у OpenGL 3.x.


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: Уникайте їх. Можливо, це добре для швидких експериментів, але є й інші кращі способи зробити те саме.
  • Відображати списки: уникати

Питання, де я спочатку розмістив цю відповідь, виявився дублікатом, тому я репостую тут.


1

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


1

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

Застарілі речі можуть бути корисними в деяких випадках, наприклад, якщо ви намагаєтесь запрограмувати щось, що підтримує OpenGL 1.5 або старіші (їх можна знайти на старих шалених нетбуках та старих системах MacOS), OpenGL ES 1.x (на старих iPhone) та Android до 1.6), або OpenGL SC (критичний підмножина Saftey, якщо трапляється програмування дисплея на реактивний винищувач). Наприклад, Minecraft побудований на основі OpenGL 1.3, тому він може підтримувати дійсно старе обладнання (але навіть у нього є «просунутий» варіант).

Це також може бути корисно, якщо ви просто хочете отримувати пікселі на екрані і не хвилюєтесь робити це «правильним» способом.

Корисно покладатися на деякі функції, які OpenGL виконує за замовчуванням під час навчання, як-от налаштування вікна перегляду від -1,0 до 1,0 та візуалізація без шейдерів. Це дозволяє вчитися без необхідності робити все за 1 хід.

Але крім цього, це можливо пропустити.

Я пропоную вам перевірити мою відповідь тут і тут для отримання більш глибокої інформації.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.