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 position
być 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.
Perfect - dokładnie to, czego potrzebowałem. Dziękuję Ci. :) – zeboidlund
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". –
@NicolBolas jest niepoprawny. Specyfikacja wyraźnie stwierdza "również tagi na funkcjonalność ARB_explicit_attrib_location" – Speed