Fakultet organizacije i informatike Varaždin
Kolegij: Računalna grafika, Doc.dr.sc. Ivan Hip
Uvod u OpenGL ES (na Windows Mobile uređajima)

Siječanj, 2010
Marko Škvorc



Sadržaj


Uvod
  • Problem
    • Potreba za prikazom 3D grafike na uređajima malih dimenzija
      • Slabiji procesori
      • Ograničena memorija
      • Mala rezolucija ekrana
      • Ograničeni kapacitet baterije

  • Rješenje
    • OpenGL ES
      • Temelji se na OpenGL 1.3
      • Izbačene nepotrebne i napredne funkcije
      • Izbačeni neki tipovi podataka





OpenGL
vs OpenGLES 
OpenGL ES verzija OpenGL verzija

OpenGL ES 1.0

   Symbian OS

   Android

   Windows Mobile 5
OpenGL 1.3

OpenGL ES 1.1

   iPhone SDK

   BlackBerry 5.0

   Windows Mobile 5
OpenGL 1.5

OpenGL ES 2.0

   iPhone 3GS

   Windows Mobile 7?
OpenGL 2.0

Razlika između OpenGL i OpenGL ES se najprije uočava u nedostatku sljedećih funkcija:
  • glBegin / glEnd
  • GL_QUADS, GL_QUAD_STRIP, GL_POLYGON
Umjesto kojih se koriste:
  • glDrawArrays / glDrawElements
Osim toga, OpenGL ES zahtijeva da se prije korištenja polja vektora, normala i sličnih mogućnosti uključi podrška za iste korištenjem:
  • glEnableClientState / glDisableClientState
  • kao argument, podržane su sljedeće varijable: GL_COLOR_ARRAY, GL_MATRIX_INDEX_ARRAY_OES, GL_NORMAL_ARRAY, GL_POINT_SIZE_ARRAY_ARRAY_OES, GL_TEXTURE_COORD_ARRAY, GL_VERTEX_ARRAY, GL_WEIGHT_ARRAY_OES
Navedene razlike mogu se najlakše uočiti na sljedećem primjeru crtanja trokuta.

OpenGL
GLfloat vertices[3][3] = {
   {0.0f, 2.0f, 0.0f},
   {-2.0f, -2.0f, 0.0f},
   {2.0f, -2.0f, 0.0f}
 };


OpenGL ES
glEnableClientState(GL_COLOR_ARRAY);
glEnableClientState(GL_VERTEX_ARRAY);
glColorPointer(4, GL_FLOAT, 0, colors);
glVertexPointer(3, GL_FLOAT, 0, vertices);

glDrawArrays(GL_TRIANGLES, 0, 3);
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_COLOR_ARRAY);

glBegin(GL_TRIANGLES);
   glVertex3d(0.0, 2.0, 0.0);
   glVertex3d(-2.0, -2.0, 0.0);
   glVertex3d(2.0, -2.0, 0.0);
glEnd();




OpenGL ES
  • Razvoj za Windows Mobile
    • Potrebni alati:
      • Pocket PC/Smartphone SDK
      • Visual Studio 2005/2008
      • Embedded Visual C++
      • PocketPC Emulator
    • Programski jezici:
      • C/C++
      • C#/VB.NET + .NET Compact Framework
    • Biblioteke
      • Vincent Mobile 3D Rendering Library
      • Hybrid Resteroid Implementation
  • Hardware vs software implementation - ukoliko grafički čip mobilnog uređaja nema hadrversku implementaciju pojedinih funkcija OpenGL-a, isti se može koristiti korištenjem softverske implementacije na razini OS-a i korištenjem procesorske snage, što je prilično sporije i u većini slučajeva neprimjenjivo

EGL
- Embedded-System Graphics Library (Native Platform Graphics Interface) - sučelje između OS-a i API funkcija OpenGL-a




Primjeri Osnovni geometrijski likovi i tijela


Korištenje svijetla i tekstura


Kombiniranje tekstura
OpenGL ES podržava korištenje tekstura. Štoviše, podržano je i njihovo kombiniranje, tj. jedna tekstura se može "zalijepiti" na drugu pri čemu se mogu uključiti i dodatne mogućnosti poput transparentnosti, preklapanja boja i sl. Još jedna zanimljivost je i izvođenje različitih transformacija nad pojedinom teksturom (npr. translacija, rotacija,...) čime možemo na jednostavan način dobiti efekt gorenja koji je prikazan u nastavku.
...
glActiveTexture(GL_TEXTURE0);
glClientActiveTexture(GL_TEXTURE0);

glTexCoordPointer(2, GL_FLOAT, 0, texCoords);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, texture1);

glActiveTexture(GL_TEXTURE1);
glClientActiveTexture(GL_TEXTURE1);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, texture2);
glTexCoordPointer(2, GL_FLOAT, 0, texCoords);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);

glTexEnvx(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_ADD);


static float offset = 0.0f;
glMatrixMode(GL_TEXTURE);
glLoadIdentity();
glTranslatef(offset+=0.02f,offset+0.02f,0);
glMatrixMode(GL_MODELVIEW);
...


Ispis teksta
  • ne postoji direktna podrška za ispis teksta
  • moguća rješenja:
    • bitmape
    • teksture
    • geometrijski font


Korištenje accelerometra
Noviji i nešto skuplji mobilni uređaje imaju ugrađeni accelerometar koji se, između ostalog, može iskoristiti i za pomicanje objekata na ekranu, ovisno o nagibu mobitela.

void ReadSensorData(){
SENSORDATA sd;

pfnHTCSensorGetDataOutput(g_hSensor, &sd);

int X = sd.TiltX;
int Y = sd.TiltY;

if (abs(X) > GSENSORSTART && abs(X) < GSENSOREND){
    gx = (float)X / 100.0f;
} else if (abs(X) < GSENSORSTART)
    gx = 0.0f;

if (abs(Y) > GSENSORSTART && abs(Y) < GSENSOREND){
    gy = -(float)Y / 100.0f;
} else if (abs(Y) < GSENSORSTART)
    gy = 0.0f;
}

void MoveBall(){
vector3D gvect(gx, gy, 0.0); // G-force acceleration

vector3D F(0.0, 0.0, 0.0); // vector of force
F += gvect * ball->weight();

ball->ChangePos(0.1, F);
}


I za kraj, još jedan primjer test programa za simulaciju kretanja po podlozi (FPS)






Zaključak
  • Osnovne funkcionalnosti jednake u odnosu na OpenGL
  • OpenGL ES 2.0 po mogućnostima vrlo blizu punoj verziji OpenGL-a



Literatura
  • Astle D, Durnil D., OpenGL ES Game Development, Thomson Course Technology, 2004
  • Munshi A., Ginsburg D., Shreiner D., OpenGL ES Programming Guide, Addison-Wesley, 2009.
  • OpenGL ES Overview, http://www.khronos.org/opengles/
  • OpenGL ES, http://en.wikipedia.org/wiki/OpenGL_ES
  • Vincent 3D Rendering Library, http://www.vincent3d.com/Vincent3D/index.html