Hirdetés

Alkalmazásfejlesztés badára: Célkeresztben az OpenGL ES

OpenGL mobilon

Ahhoz, hogy kihasználjuk a Wave-ben (és az egyéb jövőbeli badás készülékekben) rejlő grafikus erőt, muszáj az OpenGL ES API-hoz nyúlnunk. Ez az előző bejegyzésben kitárgyalt OpenGL API átportolása beágyazott rendszerekre, mint például játékkonzolokra, PDA-kra és mobiltelefonokra. Hasonlóan az OpenGL-hez, ez is ingyenes és többfajta platformon használható. A szabványt a Khronos Group nevű non-profit csoportosulás gondozza, melynek tagjai között megtalálhatók a legnagyobb grafikus hardverek gyártói: nVidia, 3DLabs, Sun és Intel.

Mivel manapság divatos a mobiltelefonokba is grafikus chipet pakolni, a Wave esetében sincs ez másképp: a GPU-ja (erről bővebben később) az 1.1 és 2.0 OpenGL ES verziókat támogatja. Hogy miért kell kiírni mindkettő? Az API-nak jelenleg három elérhető verziója van (és egy negyedik, amit még hegesztenek). A két legfőbb vonal, az 1.x és 2.x között kompatibilitási gondok vannak. Bár egy 2.0-t implementáló készüléktől azt várnánk, hogy támogassa az 1.x-es API-kat is, sajnos nem teszi, így árnyékra vetőtünk, itt bizony szó sincs visszafele kompatibilitásról. A lényeg a szabvány definiálásában rejlik: az ES 1.0-t az OpenGL 1.3-hez, az 1.1-et az 1.5-hez, míg a 2.x-et a 2.0-hoz képest definiálták.

Kezdjük az elején, az ES 1.0 az OpenGL 1.3 lecsupaszításának is tekinthető, csak a legtöbb nagy számításigényű parancsokat kivették belőle. Csak néhányat említenék meg ezek közül, a teljesség igénye nélkül: négyszög- és poligon-rajzolás (igen, csak a háromszög és a vonal maradt), kétoldali megvilágítás, 3D textúrázás, saját clip pane definiálása (A clipping azt jelenti, hogy a jelenet azon elemeit, melyek "férnek bele" a kamera által megjelenített területbe, eldobjuk, azaz ezeket nem rendereljük ki. Egyedi clip pane megadásával mi mondhatjuk meg, hogy hol "vágjuk el" az ojektumokat, optimális beállításokkal akár komoly sebességnövekedés is elérhető, lásd kép). Viszont ki is bővítették a "sima" OpenGL-hez képest, az elosztott rendszerekben található gyengébb hardver miatt a koordinátákat fixpontos típusokkal adhatjuk meg az eddigi lebegőpontos típusok helyett (double, float), valamint a kódolási szemantika is változott.

A clipping tulajdonságai
A clipping tulajdonságai

A következő lépcső az 1.1, ami kiterjeszti az 1.0-t multitextúrázással, automatikus mipmap generálással (mipmap - egy textúrának többféle méretét is eltároljuk az alap textúra mellett, emiatt, ha át kell méretezni renderelés során, a kisebbet nem a főtextúránkból kell explicit előllítani, hanem már ott figyel a memóriában, ez nagyban meggyorsítja a renderelést, lásd kép). Itt már definiálhatunk saját clip pane-t, használhatunk úgynevezett buffer objectet (renderelés a memóriából) és vertex alapú részecskerendszereket, valamint számos egyéb objektum is megjelent.

Mipmap: egy textúrát különféle felbontásokban tárolunk
Mipmap: egy textúrát különféle felbontásokban tárolunk

Akinek ez nem lenne elég, az sem kell, hogy szomorkodjon: elérhető hozzá egy Extension Pack, ami további optimalizálásokat és kiegészítéseket tartalmaz. Érdemes még megemlíteni, hogy az 1.x-es verziók visszafele kompatiblisek.

A fejlődés a beágyazott rendszerekhez (kvázi a mobiltelefonokhoz) is elért, pár évvel a megjelenésük után ezekre már nem úgy tekintettek, mint egyszerű kütyükre, hanem mint komoly grafikus teljesítményre képes masinákra. 2007 márciusában kiadták az OpenGL ES 2.0-t, ami az 1.x-ben definiált, fix funkciókat tartalmazó API-t szinte teljes egészében lecserélte egy sokkal inkább testre szabható interfészre. A legfőbb változás a transzformációs és megvilágítási pipeline-ok eddigi rugalmatlan módszereinek shaderekre cserélése, ehhez egy saját shading nyelvet definiáltak. Az 1.x verziókkal nem 100%-osan kompatibilis, de a kihagyott funkciók helyettesíthetők shaderekkel.

Az OpenGL ES verziók közti különbségek
Az OpenGL ES verziók közti különbségek

Jelenleg ez a high-end verzió, a 2.1-et még nem adták ki, annyit lehet tudni róla, hogy tartalmazni fog egy speciális textúratömörítési eljárást. Az 1.x és 2.x közti különbséget jól illusztrálja a fenti kép, melyen az egyes pipeline-állomások láthatók.

A Wave hardvere

Térjünk át az eddigi egyetlen badás telefon, a Wave GPU-jára. A Samsung készülékében egy 1 GHz-es ARM Cortex-A8 processzor duruzsol, ez architektúra szempontjából megegyezik az Apple által használt A4-gyel. Ehhez egy PowerVR SGX 540-es grafikus chipet kapott, hasonlóan a Samsung Galaxy S-hez. Mint Bocha írta a készülék tesztjében, a szóban forgó GPU-ról sajnos nagyon kevés információt lehet fellelni, azonban valamennyit sikerült.

Az SGX 540 - mily meglepő - az SGX család tagja. Ezekre a chipekre jellemző a teljesen programozható, univerzális, skálázható shader modell támogatása (DirectX nyelvre lefordítva: a 10.1-es verzióban lévő 4.1-es shader modellel ekvivalens), az OpenGL 2.0 implementálása, pixel-, vertex- és geometry shaderek kezelése.

A PoweVR egy egyedi raszterizáló módszert alkalmaz, a TBDR-t (tile based deferred rendering - téglalap alapú késleltetett renderelés). A raszterizálás az a folyamat, amikor a 3D-s képből egy diszkrét pontokból álló 2 dimenziós képet hozunk létre. Képzeljük el azt, hogy egy fényképre rárakunk egy tetszőeges felbontású négyzetrácsot és minden négyzet színét úgy állítjuk be, hogy megegyezzen az általa lefedett négyzet domináns színével. Ezzel sikeresen túl vagyunk életünk első képzeletbeli raszterizálásán (természetesen számítástechnikában nem ezt az algoritmust használják). A TBDR lényege, hogy a képernyő téglalapokra bontjuk (tile-ok). Mindegyikhez hozzárendeljük az őt elfedő háromszögek listáját, majd a ray-tracing algoritmushoz hasonlóan minden pixel színe a z-távolságban hozzá legközelebbi háromszög színe lesz. Az algoritmus késleltetett, ez azt takarja, hogy tároljuk a poligont gyártó rendszer által előllított háromszögeket, és csak akkor rajzolunk, amikor az egész kép a memóriában van.

A családnak hat tagja van, a chipek megtalálhatók többek között az Apple készülékekben (az iPad-ben és az iPhone 4-ben 535-ös van), valamint sok egyéb mobilkészülékben, mint a Palm Prē, a Nokia N900 vagy a Motorola Milestone.

Ha valakinek nem sikerült kielégíteni az információigényét, ajánlom Bocha Galaxy S tesztjének idevágó részét, valamint ajánlom a  Khronos oldalán fellelhető OpenGL ES 1.1 és 2.0 kézikönyveket. Ezzel az elméleti bevezetőnek nagyjából a végére értünk, a következőposzt témája egy alap "Hello World" alkalmazás elkészítése lesz OpenGL ES-ben, badára.

holdmester

Azóta történt

Előzmények