Czy nauka OpenGL 2.1 jest dziś bezużyteczna?


44

Jestem nowy w świecie 3D OpenGL / DirectX i dowiedziałem się, że specyfikacje OpenGL 4.1 i GLSL zostały właśnie wydane dzisiaj.

Mój przyjaciel dał mi Czerwoną Księgę dla OGL v2.1, ale, o ile czytałem, 3.x i 4.x znacznie różnią się od wersji 2.x i wiele rzeczy jest obecnie przestarzałych.

Czy mogę skorzystać z książki, aby rozpocząć naukę podstaw 3D i CG, czy też lepiej jest znaleźć nowszą kopię?


10
Nie wiem dużo o OpenGL / DirectX, ale lubię grać w gry na maszynie, która ma ponad rok. Wyobrażam sobie, że twoja wiedza przed wersją 3.x OpenGL byłaby korzystna dla moich nawyków gry. Tylko myśl.
Simurr

Nie podoba mi się sposób, w jaki to pytanie jest sformułowane. Czy potrafisz stworzyć grę w OpenGL 2.1 ? Odpowiedź: ostateczne Tak . Co przez to rozumiesz jako bezużyteczny ? Czy możesz nauczyć się podstaw 3D w starszej książce lub przestarzałym API? Znów ostateczne tak . Czy to najlepszy najlepszy sposób, aby to zrobić? Prawdopodobnie nie .
bobobobo

Odpowiedzi:


18

W takich czasach zawsze wybieram się do ankiety sprzętowej Steam: http://store.steampowered.com/hwsurvey/ - zobaczysz, że penetracja rynku systemów klasy DX10 / 11 wynosi prawie 80%; jest to zasadniczo równoważne z GL3.3 lub nowszym. Te 80% jest ograniczone do użytkowników Vista / 7 - dodaj GPU DX10 / 11 z XP, a wzrośniesz do nieco ponad 90%.

Pamiętając o tym, że mówimy tu o nieco bardziej zapalonych graczach, musisz zacząć myśleć o swojej grupie docelowej. Czy to osoby, na które chcesz kierować reklamy? Czy zamiast tego celujesz w osoby z bardziej zaawansowanym sprzętem? Co z grafiką Intela? Co z użytkownikami komputerów Mac i Linux? To są wszystkie pytania, na które musisz sam odpowiedzieć, więc ogólne wytyczne są najlepsze, jakie możesz uzyskać.

Co więcej, musisz wziąć pod uwagę fakt, że jeśli zaczynasz uczyć się dzisiaj z zamiarem wysyłki czegoś, patrzysz na okres około jednego roku, zanim tam dotrzesz (chyba że rozmawiamy o naprawdę trywialnych / prostych przypadkach). Przy utrzymującym się tendencji wzrostowej możliwości gfx, oczekujemy, że do tego czasu będziemy blisko 100% wykorzystania sprzętu GL3.3 +.

Następnie weź to pod uwagę przy GL2.1 lub niższym, będziesz się uczył i używał okropnej, starej, bzdurnej bzdury, nawet jeśli ograniczysz się do shaderów i podzbioru VBO GL2.1 (wersje GLSL na niższym poziomie są nieprzyjemne w użyciu , a VBO strumieniowe są prawie bezużyteczne bez GL_ARB_map_buffer_range) - GL3.3 + wprowadził znacznie ładniejsze (i bardziej wydajne) sposoby radzenia sobie z wieloma rzeczami, lepiej wykorzystasz sprzęt odtwarzacza (i będą wdzięczne za za to) i poświęcisz więcej czasu na pisanie produktywnego kodu zamiast na walkę z interfejsem API, który tak naprawdę nie chce z tobą współpracować.

No i oczywiście jest przerażająca sytuacja kierowcy. Trudnym, ale prawdziwym faktem jest to, że sterowniki GL w systemie Windows są w opłakanym stanie - NV obsługuje rzeczy, których nie powinny, AMD nie obsługują rzeczy, które powinny, a dzięki Intelowi naprawdę musisz ograniczyć się do funkcjonalności GL, dla których istnieją odpowiednik w D3D. Im nowsza wersja GL_VERSION, tym bardziej prawdopodobne jest, że napotkasz błędy sterowników, ale dla GL3.3 rzeczy są teraz dość stabilne.

Podsumowując, przy braku jakichkolwiek innych informacji (odbiorców docelowych itp.) Wybrałbym GL3.3 jako linię bazową (być może wykorzystując funkcjonalność z wyższych wersji GL_VERSION, gdzie jest ona dostępna i gdzie nie zakłóca bazy kodu zbyt wiele), chyba że istniałby bardzo konkretny i definitywnie określony powód, aby pójść niżej (i chciałbym być absolutnie w 100% tego pewien, zamiast używać niejasnego pojęcia „ ale co z tymi ze starszym sprzętem ”). W tym drugim przypadku nie schodziłbym poniżej GL2.1 i nawet wtedy chciałbym uzyskać jak najwięcej funkcji 3.x.


Świetny punkt na GL3.3 ~ = DX10 / 11 i statystykach sprzętu Steam.
Nate

Aby zaktualizować te statystyki - DX10 / 11 GPU + Vista / 7 wynosi teraz ~ 88%, dodaj kolejne 4,38% dla DX10 / 11 GPU + XP i patrzysz dość wygodnie na ponad 90% penetracji. Uptake rośnie o wiele szybciej niż się spodziewałem, kiedy napisałem ten oryginalny post.
Maximus Minimus,

„GL3.3 + wprowadził znacznie ładniejsze (i bardziej wydajne) sposoby radzenia sobie z wieloma rzeczami” - Jak wypada 3.2 w porównaniu? Użytkownicy komputerów Mac nie otrzymują jeszcze wersji 3.3. Zakładam, że jest prawie tak samo, ale nie chcę zakładać zbyt wiele.
michael.bartnett

38

Sugerowałbym trzymanie się skrzyżowania 2.1 i 3. Wciąż jest dużo sprzętu i sterowników, które obsługują tylko OpenGL 2.1, ale praktyki zalecane przez rdzeń OpenGL 3 lepsze. Ten samouczek to całkiem dobre miejsce na rozpoczęcie (uczy OpenGL 2.0 bez funkcji, które zostały przestarzałe w 3).


3
+1 za samouczek Joe Groffa. Poprowadzi Cię przez cały proces w rozdziale 2. A każdy dodany kod „narzędziowy” to tylko dwie funkcje: jedna do odczytu pliku (dla GLSL) i jedna do odczytu obrazów TGA (i równie dobrze możesz użyć innej bibliotekę obrazów lub napisz własny program ładujący, gdy przykład zacznie działać). Wszystko inne zostało wyjaśnione i stanowi część samouczka.
michael.bartnett,

18

Powiedziałbym, że to nie jest bezużyteczne.

Dlaczego? Cóż, podczas gdy reszta świata obsługuje OpenGL 3.xi 4.0, Mac OS X nadal obsługuje tylko OpenGL 2.1. I OpenGL ES, który jest używany na większości, jeśli nie na wszystkich, przenośnych platformach, jest nadal szeroko obsługiwany we wszystkich wersjach: 1.0, 1.1 i 2.0; które są z grubsza porównywalne odpowiednio z OpenGL 1.4, 1.5 i 2.1.

Więc dopóki OpenGL ES 1.0 nie zniknie całkowicie z powierzchni Ziemi, wiedza o OpenGL 2.x nie będzie marnotrawstwem.

Oczywiście nie oznacza to, że korzystanie z OpenGL 3.x lub 4.0 na platformach, które go obsługują, nie ma żadnej wartości.

Aktualizacja: Od wydania systemu Mac OS X Lion (10.7) profil OpenGL 3.2 Core jest teraz obsługiwany na komputerach Mac. W tej wersji przestarzałe duże części OpenGL 1.x mają na celu uproszczenie interfejsu API. Użytkownicy starszych wersji OS X (i niższej grafiki Intel) są nadal ograniczeni do OpenGL 2.0 i 2.1. Znajomość OpenGL 2.x jest jednak nadal przydatna i pozostanie taka przez dłuższy czas.


Snow Leopard obsługuje większość rozszerzeń OpenGL 3 - nawet shadery geometrii.
Axel Gneiting

@Alex Obsługa „większości” rozszerzeń nie oznacza, że ​​obsługiwany jest podstawowy GL3. I mówimy tylko o 3.x
Matias Valdenegro

@Axel Gneiting: To po prostu nie to samo. Większość interesujących funkcji OpenGL 3.0+ nie jest dostępna jako rozszerzenia. Istnieje wiele podstawowych zmian.
greyfade

12

Odpowiedź mh01 obejmowała wiele podstaw, więc dodam kilka dodatków.

OpenGL ES

Porozmawiajmy o ES 2.0 vs. desktop GL 2.1 vs. desktop GL 3.3. Na potrzeby tej dyskusji termin „GL XY” będzie odnosił się do wersji OpenY XY na komputery stacjonarne, natomiast „ES XY” będzie odnosić się do OpenGL ES XY

Strukturalnie , ES 2.0 ma więcej wspólnego z rdzeniem GL 3.3 niż z GL 2.1. GL 3.3 i ES 2.0 są oparte na czystym shaderze. Oba oparte są wyłącznie na obiektach buforowych. Itd. GL 2.1 ma wiele pułapek wydajności i kodowania, które ułatwiłyby napisanie aplikacji GL 2.1, która nie byłaby łatwa do przeniesienia na ES 2.0.

Jednak pod względem składni języka cieniowania GLSL ES 1.00 (mapowanie do ES 2.0) wygląda znacznie bardziej jak GLSL GL 2.1 niż GL 3.3. attributeI varyingsłowa kluczowe nie istnieje w 3.3 rdzenia; używa ini out, co jest o wiele bardziej spójne i rozsądne, gdy masz do czynienia z więcej niż 2 etapami cieniowania (dlatego ES 3.0 zastosował składnię GL 3.3).

Łatwo jest zmapować pojęcia wyuczone w GL 3.3 do ES 2.0. Jeśli więc nauczysz się GL 3.3 z dowolnego z różnych narzędzi do tego, zrozumiesz, jak pracować w świecie ES 2.0. Musisz oczywiście dowiedzieć się, gdzie jest ten podzbiór (tj. Rzeczy, które GL 3.3 może zrobić, czego nie potrafi ES 2.0), ale pojęcia są takie same.

Mapowanie składni GLSL, aby można było kopiować shadery z jednego do drugiego, jest nieco trudniejsze. Ale tak naprawdę wystarczy kilka # definicji w odpowiednich miejscach. Ponadto GLSL 3.30 ma kilka funkcji kompatybilności ES, takich jak highpi tak dalej (które nie robią nic w GLSL na pulpicie).

Więc zyskujesz coś dla ES 2.0, ucząc się z GL 3.3 zamiast GL 2.1.


8

W przypadku gier, które nie wymagają większych zmian w OpenGL widocznych tylko w nowszych wersjach, użycie tylko wersji 3.x + ogranicza Cię do serii nvidia 8 i wyższych (nie jestem pewien, czy inni dostawcy grafiki chcieliby to sprawdzić). Jeśli więc nie korzystasz z funkcji 3.x +, po prostu tworzysz sztuczny limit, powstrzymując ludzi korzystających ze starszych, ale posiadających wiele potężnych kart graficznych.

Z tego powodu zdecydowanie zaleciłbym poznanie podzbioru zgodnego z nowymi wersjami i nowszych wersji, a następnie wybranie najniższej wersji, w którą można skutecznie wbić swoją grę. Możesz

Zauważy również w odpowiedzi na inne pytanie, że OpenGL: ES 2.0 usuwa potok stałej funkcji, więc jest to bardziej odpowiednik 3.0 niż 2.1. Również zawsze obsługuje różne funkcje dla obsługiwanej wersji gl w czasie wykonywania.


4

Powiedziałbym, że zapisz się, aby nauczyć się OpenGL za pomocą swojej Czerwonej Księgi, po prostu zignoruj ​​te rzeczy, które są przestarzałe w nowszych wersjach (jak glBegin (), glEnd () - zamiast tego użyj VBO). Większość funkcji w nowszych wersjach była już wcześniej dostępna za pośrednictwem rozszerzeń.


4

W większości zgadzam się z thbusch. Ale nie zignorowałbym całkowicie przestarzałych interfejsów API: wciąż jest za dużo kodu, który ich używa. Jednak poświęciłbym im znacznie mniej uwagi. Nie ma sensu, na przykład, w nauce glBegin (), glEnd () wystarczająco dokładnie, aby napisać własny kod, używając ich. Ale powinieneś je rozpoznać, kiedy je zobaczysz i mieć pojęcie o tym, co robią.

Nadal warto przynajmniej raz przeczytać całą Czerwoną Księgę, nawet jeśli nie zbudujesz przykładowego kodu i nie wykonasz ćwiczeń obejmujących funkcje wycofane z OpenGL 3.x.


3

Krótka odpowiedź:

Nie. Nauka OpenGL 2.1 to dobry pomysł, nawet dzisiaj, pod warunkiem, że poznasz „dobre części”.

Długa odpowiedź:

OpenGL można zasadniczo podzielić na dwie części: „Dobre części” i „Starsze funkcje”.

Szczerze mówiąc, nie widzę większych korzyści w uczeniu się starszych funkcji („funkcja stała”). Jednak znaczna część OpenGL 2.1 (dobre części) jest nadal dostępna po stosunkowo niewielkich zmianach.

Dlatego nauka niektórych części OpenGL 2.1 może być korzystna. W szczególności OpenGL ES 2 jest obecnie bardzo popularny, a ES 2 jest głównie (ale nie do końca) podzbiorem OpenGL 2.1. Do programowania 3D w smartfonach niezbędny jest OpenGL ES 2.

Więc co jest „dobre”? Zasadniczo wszystko, co jest w „głównym profilu” OpenGL 3.x (w przeciwieństwie do „profilu zgodności”) i / lub w OpenGL ES 2.

  • Shadery wierzchołków i fragmentów: naucz się ich
  • Tekstury: wciąż dobre.
  • Matryce: Wiedza o tym, jak działają, jest korzystna, ale glLoadIdentitytego rodzaju funkcje są przestarzałe i należy ich unikać
  • Światło: wiedza o tym, jak można symulować światło w grafice komputerowej, jest przydatna, ale glLightfvnależy unikać innych stałych funkcji oświetlenia.
  • Bufory tablic: Dobrze
  • glBegin, glVertex, glColor, glEnd: Unikać ich. Może być dobry do szybkiego eksperymentowania, ale są też inne lepsze sposoby, aby zrobić to samo.
  • Wyświetl listy: Unikaj

Pytanie, w którym pierwotnie zamieściłem tę odpowiedź, okazało się duplikatem, więc ponownie ją tutaj zamieszczam.


1

Nie wierzę, że to zły pomysł. Wiele koncepcji GL obejmuje wszystkie wersje OpenGL i nadal ostatecznie Ci pomoże. Mam wiele książek OpenGL sprzed 10 lat, które wciąż pomagają do dziś. Powiedziałbym, że jeśli jesteś nowy w OpenGL i istnieją lepsze książki, które są starsze, nauczysz się dużo, a kod powinien nadal działać. Większość OpenGL jest kompatybilna wstecz (jak sądzę).


1

Radzę najpierw nauczyć się nowoczesnych rzeczy i udawać, że starsze rzeczy nie istnieją, dopóki ich nie potrzebujesz.

Nieaktualne rzeczy mogą być przydatne w niektórych przypadkach, na przykład, jeśli próbujesz zaprogramować coś, co obsługuje tylko OpenGL 1.5 lub starszy (można go znaleźć na starszych kiepskich netbookach i starszych systemach MacOS), OpenGL ES 1.x (starsze iPhone'y i Android przed wersją 1.6) lub OpenGL SC (podzbiór Saftey Critical, jeśli programujesz wyświetlacz na myśliwcu). Na przykład Minecraft jest oparty na OpenGL 1.3, więc może obsługiwać naprawdę stary sprzęt (ale nawet to ma opcję „zaawansowaną”).

Może być również przydatny, jeśli chcesz wyświetlać piksele na ekranie i nie przejmować się robieniem tego we właściwy sposób.

Przydaje się polegać na niektórych funkcjach, które OpenGL domyślnie wykonuje podczas nauki, takich jak konfigurowanie rzutni od -1,0 do 1,0 i renderowanie bez programów cieniujących. Pozwala to na naukę bez konieczności robienia wszystkiego za jednym razem.

Ale poza tym, jeśli to możliwe, należy go pominąć.

Sugeruję sprawdzenie mojej odpowiedzi tutaj i tutaj, aby uzyskać bardziej szczegółowe informacje.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.