2009-07-24 14 views
40

Pracuję nad strukturą gier i jestem nowicjuszem w OpenGL. Większość książek wydaje się nie dać jasnej odpowiedzi na to pytanie i chcę rozwijać się na moim komputerze przy użyciu OpenGL, ale wykonać kod w środowisku OpenGL ES 2.0. Moje pytanie jest dwojaki:OpenGL vs OpenGL ES 2.0 - Czy aplikacja OpenGL może być łatwo przeniesiona?

  1. Jeśli celuję w ramkę dla OpenGL na pulpicie, czy po prostu uruchomi się bez modyfikacji w środowisku OpenGL ES 2.0?
  2. Jeśli nie, to czy istnieje dobry emulator tam, PC lub Mac; czy istnieje skrypt, który mogę przekonwertować mój kod OpenGL na kod OpenGL ES, lub oznaczyć rzeczy, które nie będą działać?

Odpowiedz

38

To było około trzech lat, odkąd ostatnio robi żadnej pracy ES, więc może być nieaktualna lub po prostu pamiętać, pewne rzeczy nieprawidłowo.

  1. Nie, kierowanie na OpenGL na komputer nie jest równoznaczne z kierowaniem na OpenGL ES, ponieważ ES jest podzbiorem. ES nie implementuje funkcji trybu natychmiastowego (glBegin()/, , ...) Tablice wierzchołków są głównym sposobem przesyłania materiałów do potoku.

    Co więcej, zależy to od tego, jaki profil celujesz: przynajmniej w profilu Lite ES nie musi implementować funkcji zmiennoprzecinkowych. Zamiast tego otrzymujesz stałe funkcje punktowe; pomyśl o 32-bitowych liczbach całkowitych, gdzie pierwsze 16 bitów oznacza cyfry przed przecinkiem dziesiętnym, a następujące 16 bitów oznacza cyfry po przecinku dziesiętnym.

    Innymi słowy, nawet prostego kodu może być nieprzenośne, jeśli używa pływaków (trzeba by zastąpić wywołań gl*f() funkcji z połączeń do gl*x() funkcji.

    Zobacz, jak można rozwiązać ten problem w Trolltech's example (konkretnie plik qtwidget.cpp; to Qt przykład, ale nadal ...) Zobaczysz robią to wezwanie:

    q_glClearColor(f2vt(0.1f), f2vt(0.1f), f2vt(0.2f), f2vt(1.0f));

    ten ma na celu zastąpienia wezwanie do glClearColo. rf(). Dodatkowo używają one makra f2vt() - co oznacza zmiennoprzecinkowe na typ wierzchołka - który automagicznie przekształca argument z wartości zmiennoprzecinkowej na poprawny typ danych.

  2. Podczas gdy trzy lata temu rozwijałem kilka małych demonstracji dla firmy, odniosłem sukces, pracując z PowerVR's SDK. Jest przeznaczony dla Visual C++ pod Windows; Nie próbowałem tego pod Linuksem (nie ma potrzeby, odkąd pracowałem na firmowym komputerze).


Niewielka zmiana w celu odzwierciedlenia moich ostatnich doświadczeń z ES. (07 czerwca 2011)

  • Dzisiejsze platformy prawdopodobnie nie korzystać z profilu Lite, więc prawdopodobnie nie trzeba się martwić o stałym punkcie dziesiętnych
  • Przy przenoszeniu kodu do telefonu stacjonarnego (np iOS) całkiem prawdopodobnie będziesz musiał zrobić, przede wszystkim te, a nie wiele więcej:
    • zastąpić glBegin()/glEnd() z tablicami wierzchołków
    • wymienić kilka telefonów z funkcjami takimi jak glClearColor() z połączeń, takich jak glClearColorf()
    • przepisać okienkowy i układ wejściowy
    • jeśli kierowania OpenGL ES 2.0, aby uzyskać funkcjonalność modułu cieniującego, będziesz teraz mieć całkowicie zastąpić stałej funkcji rurociąg wbudowanego w zachowaniu z shaderów - przynajmniej te, które podstawowe o stałej reimplement funkcja pipeline
  • Naprawdę ważne: o ile twój system mobilny nie jest ograniczony pamięcią, naprawdę chcesz sprawdzić, czy używasz kompresji tekstur do swojego układu graficznego; na przykład na urządzeniach z systemem iOS będziesz przesyłać dane skompresowane przez PVRTC do chipa
+0

2/http: //www.imgtec.com/PowerVR/insider/sdkdownloads/ które archiwum dla platformy Linux? Jestem pewien, że możemy emulować glBegin na szczycie implementacji GLES – RzR

+0

@rzr: Emulowanie glBegin() jest z pewnością możliwe, ale może być złym pomysłem. Zamiast tego możesz zrestrukturyzować kod. Na tej stronie będziesz chciał pobrać archiwum "PC Emulation" dla OpenGL ES 1.1 lub OpenGL ES 2.0. –

+0

celem jest przede wszystkim zapewnienie zgodności ze źródłami, dbanie o wydajność, po prostu tworzenie starszych aplikacji ... - http://rzr.online.fr/q/opengl – RzR

2

Z mojego rozumienia OpenGL ES jest podzbiorem OpenGL. Myślę, że jeśli powstrzymasz się od używania trybu natychmiastowego, takiego jak glBegin() i glEnd(), powinieneś być w porządku. Nie zrobiłem wiele z OpenGL w ciągu ostatnich kilku miesięcy, ale kiedy pracowałem z ES 1.0, o ile nie używałem glBegin/glEnd, cały kod, którego nauczyłem się ze standardowego OpenGL, działał.

Wiem, że symulator iPhone'a obsługuje kod OpenGL ES. Nie jestem pewien co do Androida.

Oto Windows emulator.

+0

Symulatory SDK na pewno uruchomią kod OpenGL ES, w zależności od wersji interfejsu API obsługiwanej przez urządzenie wirtualne. Znacznie wolniej niż prawdziwe urządzenie. – davenpcj

+0

Co więcej, emulator Androida obsługuje tylko OpenGL ES 1.x. Zgłasza wyjątek w przypadku podania kodu OpenGL ES 2.0. To musi być przetestowane na urządzeniu obsługującym wersję 2.0. To może się zmienić za kilka tygodni z Ice Cream Sandwich, ale nie liczę na to: postawa programistów polega na tym, że testowanie na urządzeniu jest prostsze, więc aktualizacja emulatora nie jest tak ważna. –

4

W OpenGL ES 2.0, którego używają nowe gadżety, musisz również dostarczyć własne shadery wierzchołków i fragmentów, ponieważ stary rurociąg o ustalonej funkcji zniknął. Oznacza to konieczność samodzielnego wykonania obliczeń cieniowania itp., Co byłoby dość skomplikowane, ale można znaleźć istniejące implementacje na tutorialach GLSL.

Mimo to, ponieważ GLES jest podzbiorem pulpitu OpenGL, możliwe jest uruchomienie tego samego programu na obu platformach.

+3

+1 To bardzo dobrze odpowiedź, która prawdopodobnie doprowadzi do najbardziej produktywnego podejścia (unikaj refaktoryzacji, pisz kod jako programowalny w VBO od samego początku). –

+1

ES2 nie jest ścisłym podzbiorem pulpitów GL, ES3 jest. –

3

Znam dwóch projektów, aby zapewnić tłumaczenie GL między pulpicie i ES:

  • glshim: Znaczne stałym rurociągiem do wsparcia 1.x, 2.x ES podstawowe wsparcie.

  • Regal: Wszystko na ES 2.x.

+0

Ostatnio znalazłem także Regala, wygląda całkiem nieźle. –

+0

Znalazłem Regal bolesny w użyciu, jednak :( – lunixbochs

0

Opcja 3) Można użyć biblioteki takiej jak Qt do obsługi kodu OpenGL za pomocą wbudowanych funkcji opakowania. Daje to możliwość użycia jednej podstawy kodu (lub minimalnie innych baz kodu) dla OpenGL i budowania dla większości platform, jakie chcesz. Nie musiałbyś go przenosić na każdą inną platformę, którą chciałbyś obsługiwać. Qt może nawet wybrać kontekst OpenGL na podstawie używanych funkcji.