Jakich wersji OpenGL się uczyć i / lub których używać?

16

Więc jestem nowy w OpenGL ... Mam ogólną wiedzę na temat programowania gier, ale mało praktycznego doświadczenia.

Zaglądałem do różnych artykułów i książek i próbowałem zagłębić się w OpenGL, ale różne wersje oraz stary i nowy sposób robienia rzeczy były mylące.

Wydaje mi się, że moje pierwsze pytanie brzmi: czy ktoś zna jakieś dane liczbowe na temat odsetka graczy, którzy mogą uruchomić każdą wersję OpenGL. Jaki jest udział w rynku? 2.x, 3.x, 4.x ...

Przyjrzałem się wymaganiom dotyczącym Half Life 2, ponieważ wiem, że Valve zaktualizowało go do OpenGL, aby działało na Macu i wiem, że zwykle próbują trafić do bardzo szerokiej bazy użytkowników i mówią, że przynajmniej GeForce 8 Series. Spojrzałem na 8800 GT na stronie Nvidii i wymieniono wsparcie dla OpenGL 2.1. Co, być może się mylę, brzmi dla mnie starożytnie, ponieważ jest już 4.x. Poszukałem sterownika dla 8800GT i mówi on, że obsługuje 4.2! Trochę rozbieżności, lol.

Przeczytałem także rzeczy, takie jak XP obsługuje tylko do określonej wersji, lub OS X obsługuje tylko 3.2, lub wszelkiego rodzaju inne rzeczy. Ogólnie jestem po prostu zdezorientowany, ile wsparcia jest dostępne dla różnych wersji i jakiej wersji się uczyć / używać.

Szukam również zasobów edukacyjnych. Dotychczasowe wyniki wyszukiwania wskazywały mi na OpenGL SuperBible. Czwarta edycja ma świetne recenzje na Amazon, ale uczy 2.1. Piąta edycja uczy 3.3, a w recenzjach jest kilka rzeczy, które wspominają, że 4. edycja jest lepsza i że 5. edycja nie uczy właściwie nowych funkcji czy coś takiego? Zasadniczo nawet w materiałach do nauki widzę rozbieżności i po prostu nie wiem nawet, od czego zacząć.

Z tego, co rozumiem, 3.x rozpoczął zupełnie nowy sposób robienia rzeczy i przeczytałem z różnych artykułów i recenzji, które chcesz „trzymać się z daleka od przestarzałych funkcji, takich jak glBegin (), glEnd ()”, a jednak wiele książek i tutoriale, które widziałem, używają tej metody. Widziałem ludzi mówiących, że w zasadzie nowy sposób robienia rzeczy jest bardziej skomplikowany, ale stary jest zły>.>

Na marginesie, osobiście wiem, że wciąż muszę się wiele nauczyć, ale interesuje mnie teselacja; więc myślę, że to także ma na to wpływ, ponieważ, o ile rozumiem, to tylko w wersji 4.x?

[po prostu, mój pulpit obsługuje 4.2]

Kenmore
źródło
To pytanie (dotyczące przepełnienia stosu) wydaje się być duplikatem: stackoverflow.com/questions/6823371/...
Anderson Green,

Odpowiedzi:

21

Jeśli zastanawiasz się nad zasięgiem OpenGL, dobrym miejscem do rozpoczęcia jest ankieta sprzętowa Steam.

http://store.steampowered.com/hwsurvey?platform=pc

Niestety wydaje się, że jest teraz zepsuty i nie wyświetla żadnych statystyk dla kart wideo. : \

Przeczytałem również rzeczy, takie jak XP obsługuje tylko do określonej wersji

DirectX 9 jest porównywalny z OpenGL 2.1, DirectX 10 z OpenGL 3.0 i DirectX 11 z OpenGL 4.0. Stąd bierze się zamieszanie.

XP obsługuje wszystkie wersje OpenGL, ale nie obsługuje DirectX 10 lub wyższej. W ten sposób Microsoft chciał zmusić ludzi do przejścia na Vistę, ale nie wyszło to zbyt dobrze. OpenGL jest otwartym standardem, więc dopóki producenci kart wideo będą gotowi produkować sterowniki dla XP, będzie obsługiwał nowsze wersje OpenGL.

Z tego, co rozumiem, 3.x rozpoczął zupełnie nowy sposób robienia rzeczy i przeczytałem z różnych artykułów i recenzji, które chcesz „trzymać się z daleka od przestarzałych funkcji, takich jak glBegin (), glEnd ()”, a jednak wiele książek i tutoriale, które widziałem, używają tej metody. Widziałem ludzi mówiących, że w zasadzie nowy sposób robienia rzeczy jest bardziej skomplikowany, ale stary jest zły>.>

To bardzo duży problem dla OpenGL. Zasadniczo w dawnych czasach wysyłano rzeczy na kartę wideo za pomocą „trybu natychmiastowego”. Zacznij od glBegin, zrób kilka rzeczy, a na końcu glEnd. Jednak sterowniki karty graficznej nie jak to w ogóle . Skąd mogą wiedzieć, ile rzeczy zamierzasz wysłać? Czy będą to 4 wierzchołki dla teksturowanego kwadratu lub 100 000 dla modelu bez skóry? Dlatego wprowadzili obiekty buforów wierzchołków (VBO). Podczas gdy tryb natychmiastowy jest listą połączoną, VBO jest tablicą statyczną. Deweloper wie, jak duży jest, a kierowca wie, jak duży. Wszyscy są szczęśliwi. Tak więc karta standardów OpenGL (Khronos Group) postanowiła wycofać tryb natychmiastowy dla OpenGL 3.0 i nowszych wersji. Jest to jednak problematyczne, co pokażę na prostym przykładzie.

Załóżmy, że chcesz wyświetlić teksturowany quad, zaczynając od zera.

W OpenGL 2.1:

  • Skonfiguruj macierz projekcji i włóż ją GL_PROJECTION.
  • Skonfiguruj macierz widoku modelu i włóż ją GL_MODELVIEW.
  • Załaduj obraz i umieść go w GL_TEXTURE_2Duchwycie.
  • Zdefiniuj pozycje, współrzędne tekstury i kolory dla swoich wierzchołków.
  • Zwiąż teksturę.
  • glBegin... glVertex2f... glTexCoord2f... glEnd.

W OpenGL 3.0:

  • Zbuduj matrycę do projekcji i widoku modelu.
  • Załaduj obraz i umieść go w GL_TEXTURE_2Duchwycie.
  • Zdefiniuj pozycje, współrzędne tekstury i kolory dla swoich wierzchołków i umieść je w VBO.
  • Utwórz obiekt tablicy wierzchołków (VAO) i dołącz VBO.
  • Napisz moduł cieniujący, aby wyprowadzić teksturowany quad i umieść go w programie modułu cieniującego.
  • Dołącz macierze do programu modułu cieniującego za pomocą mundurów.
  • Zwiąż teksturę.
  • Dołącz teksturę do programu do cieniowania.
  • glDrawArrays.

Co więc może pójść nie tak w pierwszej wersji?

  • Twoje pozycje są nieprawidłowe.
  • Uzwojenie wierzchołków jest niewłaściwe.
  • Twoja tekstura nie ładuje się poprawnie.
  • Twoja tekstura nie wiąże się poprawnie.
  • Twoja matryca projekcji jest nieprawidłowa.
  • Twoja matryca widoku modelu jest nieprawidłowa.
  • Nie wysyłasz odpowiednich wierzchołków.

W drugiej wersji możesz mieć problemy z powyższym i :

  • Twoje VBO są błędne.
  • Twoje VAO jest błędne.
  • Twój moduł cieniujący jest nieprawidłowy.
  • Twoje powiązanie tekstury z modułem cieniującym jest nieprawidłowe.

Bez odpowiednich narzędzi do debugowania staje się to poważnym problemem. Dlatego ludzie mówią, że powinieneś trzymać się trybu natychmiastowego. Na szczęście mamy teraz darmowy i doskonały gDEBugger , ale to nie jest magiczna kula.

Aby odpowiedzieć na twoje pytanie: to zależy od twojej gry. Jeśli chcesz dotrzeć do szerokiego grona odbiorców (na przykład zwykłej gry lub platformówki 2D), powinieneś wybrać opcję 2.1. Jeśli tworzysz epicką grę kosmiczną, która i tak nie będzie działać na sześcioletnim sprzęcie, wybierz cel 3.3. A jeśli potrzebujesz najnowszej i najlepszej kompatybilności w przyszłości, wybierz 4.0.

knight666
źródło
2
Myślę, że pokazujesz tutaj pewne uprzedzenia wobec VAO / VBO. W rzeczywistości, jeśli chcesz narysować teksturowany quad, miałbyś pełny zestaw VAO / VBO, wraz z już utworzonymi modułami cieniującymi i teksturami (podczas uruchamiania programu - nikt nie tworzy ich w czasie wykonywania). Narysowanie teksturowanego kwadratu za pomocą nowego sposobu jest w rzeczywistości tylko garstką połączeń - co prawda, nakłada się ono na złożoność programu podczas inicjowania programu, podczas gdy stary sposób ujawnia złożoność w czasie wykonywania.
Maximus Minimus,
2
Ale dokładnie to miałem na myśli: teraz twój błąd może znajdować się w twoich danych (danych wierzchołków i obiekcie tekstury), twoim programie cieniującym, twoim kodzie cieniującym, twoich matrycach, twoim jednolitym przesyłaniu lub twoim wiązaniu VAO. Jeśli zaczynasz od zera , musisz sprawdzić wiele podsystemów! I musisz śledzić o wiele więcej stanu.
knight666
1
Zauważ, że gDEBugger ze strony gremedy jest nieaktualny. Zakładam, że porzucony, ponieważ ich fora nie działały od dłuższego czasu. Narzędzie zostało wybrane przez AMD: gDEBugger .
MichaelHouse
2
„glBegin ... glVertex2f ... glTexCoord2f ... glEnd.” Po prostu nie. glBegin, glVertex itp. nigdy nie miały racji. glDrawArrays został wprowadzony w OpenGL 1.1 (1997) i zawsze powinien być używany zamiast glBegin i End.
API-Beast
9

Niektóre statystyki dotyczące kompatybilności sprzętowej można znaleźć w ankiecie Steam: http://store.steampowered.com/hwsurvey/ Chociaż wymieniono w niej DX10 i DX11, kompatybilność sprzętowa jest odpowiednio taka sama jak OpenGL 3 i OpenGL 4. Należy jednak pamiętać, że stan instalacji sterownika OpenGL na ludziach jest zwykle gorszy niż DX.

Windows XP nie obsługuje DX10 ani DX11, ale OpenGL 3 i 4 powinny działać poprawnie, pod warunkiem, że sterowniki są w porządku. OSX obsługuje OpenGL 3 (maksymalnie), w systemie Linux dostajesz OpenGL 4 ze sterownikami dostawcy ATI / NVIDIA (oczywiście tylko jeśli sprzęt to obsługuje).

Są też mobilne wersje OpenGL. W rzeczywistości sugerowałbym przyjrzenie się OpenGL ES 2.0, ponieważ jest on mniejszy, więc łatwiej się go nauczyć, ale musisz także skorzystać z nowoczesnych praktyk, tj. Shaderów i VBO. Jest to również używane na większości urządzeń mobilnych (więc możesz robić gry mobilne), a także WebGL jest w zasadzie taki sam, więc możesz właściwie robić całą swoją naukę w przeglądarce internetowej z jego zaletami szybkiego rozwoju. OpenGL ES 3.0 pojawi się tego lata.

Tesselacja to funkcja OpenGL 4.0. Najpierw powinieneś nauczyć się innych rodzajów shaderów, nie mówiąc już o podstawach, ale zgadzam się, że to interesujące - w rzeczywistości napisałem z nim mały test: http://blog.tapiov.net/post/15189341463/playing- z-opengl-4-teselacją

Tapio
źródło
4
Cholera, knight666 pobił mnie do tego, z bardziej szczegółową odpowiedzią. Mimo to warto zastanowić się nad częścią ES.
Tapio,