Які версії 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, або всі інші речі. В цілому, я просто розгублений у тому, яка підтримка різних версій та яку версію вивчати / використовувати.

Я також шукаю навчальні ресурси. Поки що мої результати пошуку вказують на SuperGLible OpenGL. 4-е видання має чудові відгуки про Amazon, але воно викладає 2.1. 5-е видання вчить 3.3, а в оглядах є кілька речей, які згадують про 4-е видання, і що 5-е видання не навчає належним чином нових можливостей чи чогось? В основному, навіть у навчальному матеріалі я бачу розбіжності, і я навіть навіть не знаю, з чого почати.

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

Лише побічна записка, особисто я знаю, що я ще маю багато чого навчитися заздалегідь, але мене цікавить tessellation; тому я гадаю, що це також впливає, тому що, наскільки я розумію, це лише в 4.х?

[просто btw, мій робочий стіл підтримує 4.2]


Це запитання (щодо переповнення стека) видається дублікатом: stackoverflow.com/questions/6823371/…
Anderson Green

Відповіді:


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's). У той час як безпосередній режим є пов'язаним списком, VBO - це статичний масив. Розробник знає, наскільки він великий, драйвер знає, наскільки він великий. Усі щасливі. Тому рада стандартів OpenGL (група Khronos) вирішила припинити негайний режим для 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.


2
Я думаю, ви демонструєте тут деякі упередження щодо VAO / VBO. Насправді, якби ви хотіли намалювати текстурований квадратик, у вас був би повний набір VAO / VBO, разом із уже створеними шейдерами та текстурами (під час запуску програми - ніхто не створює таких під час виконання). Малювати текстурований квадроцикл новим способом насправді є лише кількома дзвінками - правда, він завантажує складність програми в той час, коли старий спосіб викриває складність під час виконання.
Максим Мінімус

2
Але це саме те, що я мав на увазі: тепер ваша помилка може бути у ваших даних (вершинні дані та об’єкт текстури), вашій програмі шейдерів, вашому шейдерному коді, ваших матрицях, рівномірному завантаженні або прив’язці до VAO. Якщо ви починаєте з нічого , це перевіряється багато підсистем! І ви повинні стежити за набагато більшою державою.
knight666

1
Зауважте, що gDEBugger із сайту жадібного застарів. Я вважаю, що покинутий, оскільки їх форуми вже давно не працюють. Інструмент підхопив 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 виходить цього літа.

Tessellation - це функція OpenGL 4.0. Спочатку ви повинні вивчити інші види шейдерів, не кажучи вже про всі основи, але я згоден, що це цікаво - адже я написав з ним невеликий тест: http://blog.tapiov.net/post/15189341463/playing- з-opengl-4-tessellation


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