2012-03-09 11 views
11

Z tego, co przeczytałem, wydaje się, że OpenGL ES 2.0 nie jest niczego, co jest jak OpenGL 2.1, co jest tym, co wcześniej zakładałem.OpenGL ES 2.0 vs OpenGL 3 - Podobieństwa i różnice

Co jest ciekaw, czy OpenGL 3 jest porównywalny do OpenGL ES 2.0. Innymi słowy, biorąc pod uwagę, że zamierzam stworzyć silnik gry zarówno na komputery, jak i na Androida, czy są jakieś różnice, o których powinienem wiedzieć w szczególności w odniesieniu do OpenGL 3.x + i OpenGL ES 2.0?

Może to również obejmować wersje OpenGL 4.x.

Na przykład, jeśli zacznę czytać książkę this, czy tracę czas, jeśli planuję przenieść silnik na Androida (oczywiście używając NDK;))?

Odpowiedz

20

Z tego co czytałem wynika, że ​​OpenGL ES 2.0 nie jest coś jak OpenGL 2.1, która jest, co zakłada się sprzed.

Zdefiniuj "nie przypomina". Desktop GL 2.1 ma wiele funkcji, których nie ma ES 2.0. Istnieje jednak najczęściej wspólny podzbiór dwóch elementów, które działałyby na obydwu (chociaż trzeba będzie krówki, aby załadować tekstury, ponieważ istnieją tam pewne istotne różnice).

Pulpit GL 3.x zapewnia wiele funkcji, których nieobsługiwany ES 2.0 po prostu nie obsługuje. Obiekty framebufferów są rdzeniami 3.x, podczas gdy są rozszerzeniami w wersji 2.0 (a nawet wtedy otrzymujesz tylko jeden obraz docelowy bez innego rozszerzenia). Istnieje sprzężenie zwrotne transformacji, tekstury całkowite, jednolite obiekty buforów i shadery geometrii. Są to wszystkie specjalne funkcje sprzętowe, które nie są dostępne w ES 2.0 lub są dostępne tylko za pośrednictwem rozszerzeń. Niektóre z nich mogą być zależne od platformy.

Ale na pulpicie GL 3.x dostępne są również dobre funkcje interfejsu API. Jawne lokalizacje atrybut (layout(location=#)), VAOs itp

Na przykład, jeśli zacznę czytać tę książkę, ja tracę czas, jeśli mam zamiar portu silnik do Android NDK (używając oczywiście;))?

To zależy od tego, ile pracy zamierzasz wykonać i co możesz zrobić, aby działało. Przynajmniej powinieneś przeczytać na temat tego, co robi OpenGL ES 2.0, abyś wiedział, jak to się różni od pulpitu GL.

Łatwo uniknąć rzeczywistych funkcji sprzętowych. Rendering do tekstury (lub do wielu tekstur) jest czymś, o co prosi twój algorytm. Podobnie jak sprzężenie zwrotne transformacji, shadery geometrii itp. Tak więc, ile potrzebujesz, zależy od tego, co próbujesz zrobić, i mogą istnieć alternatywy w zależności od algorytmu.

To, na co łatwiej wpaść, to wygoda funkcji pulpitu GL 3.x. Na przykład:

layout(location = 0) in vec4 position; 

Nie jest to możliwe w ES 2.0. Podobna definicja byłaby:

attribute vec4 position; 

To będzie pracować w ES 2.0, ale nie przyczyną atrybutu positionbyć powiązany z indeksem atrybutu 0.Trzeba to zrobić za pomocą kodu, używając glBindAttribLocation, zanim program zostanie połączony. Pulpit GL także pozwala na to, ale książka, do której się łączysz, nie robi tego. Z oczywistych powodów (jest to książka oparta na 3.3, a nie stara się zachować kompatybilność ze starszymi wersjami GL).

Jednolite bufory to kolejny. Książka sprawia, że ​​korzystanie z nich jest wyjątkowo liberalne, szczególnie w przypadku macierzy o współdzielonych perspektywach. Jest to prosta i skuteczna technika. Ale ES 2.0 nie ma tej funkcji; ma tylko mundury na program.

Ponownie, możesz kodować do wspólnego podzbioru, jeśli chcesz. Oznacza to, że możesz celowo zrezygnować z używania jawnych lokalizacji atrybutów, jednolitych buforów, obiektów tablicy wierzchołków i tym podobnych. Ale ta książka też nie pomoże ci w tym.

Czy to będzie strata czasu? Cóż, ta książka nie jest przeznaczona do nauczania interfejsu API OpenGL 3.3 (robi to, ale nie o to chodzi). Książka uczy programowania grafiki; tak się składa, że ​​korzysta z interfejsu 3.3 API. Umiejętności, których się uczysz (z wyjątkiem tych, które są oparte na sprzęcie), są przesyłane do dowolnego interfejsu API lub systemu, z którego korzystasz.

Mówiąc tak: jeśli nie znasz programowania grafiki, nie ma znaczenia, jakiego interfejsu API używasz. Po opanowaniu pojęć możesz przeczytać różne dokumenty i zrozumieć, jak łatwo zastosować te koncepcje do dowolnego nowego interfejsu API.

+0

Perfect - dokładnie to, czego potrzebowałem. Dziękuję Ci. :) – zeboidlund

+0

Kwalifikator układu jest faktycznie dostępny w ES 2.0. Musisz podać "#extension GL_EXT_separate_shader_objects: enable" w swoim GLSL i nadal używasz "atrybutu" zamiast "w". –

+1

@NicolBolas jest niepoprawny. Specyfikacja wyraźnie stwierdza "również tagi na funkcjonalność ARB_explicit_attrib_location" – Speed

1

OpenGL ES 2.0 (i 3.0) to głównie podzbiór Desktop OpenGL.

Największa różnica polega na tym, że w ES nie ma starszego typu potokowej funkcji. Co to jest potok funkcji ustalonej? Wszystko, mających do czynienia z glVertex, glColor, glNormal, glLight, glPushMatrix, glPopMatrix, glMatrixMode, etc ... w GLSL stosując dowolne zmienne, które mają dostęp do danych funkcji stałych jak gl_Vertex, gl_Normal, gl_Color, gl_MultiTexCoord, gl_FogCoord, gl_ModelViewMatrix a różne inne macierze z rurociągu o ustalonej funkcji.

Jeśli korzystasz z którejś z tych funkcji, będziesz musiał wykonać pewne prace. OpenGL ES 2.0 i 3.0 to zwykłe shadery. Nie zapewniamy "3d". Musisz sam napisać wszystkie projekcje, oświetlenie, odniesienia do tekstur itp.

Jeśli już to robisz (co prawdopodobnie najbardziej współczesne gry) możesz nie mieć za dużo pracy. Jeśli z drugiej strony korzystasz z tych starych przestarzałych funkcji OpenGL, które z mojego doświadczenia są nadal bardzo powszechne (większość samouczków nadal używa tych rzeczy). Potem masz trochę pracy dla ciebie, gdy próbujesz odtworzyć te funkcje na własną rękę.

Istnieje biblioteka o otwartym kodzie źródłowym, regal, która, jak sądzę, została założona przez firmę NVidia. Powinno to odtworzyć. Należy pamiętać, że cały system o stałej funkcjonalności był dość nieefektywny, co jest jednym z powodów, dla których został wycofany, ale może być sposobem na szybkie działanie.