|
|
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
- Ograničeni
kapacitet baterije
- Rješenje
- 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
- C#/VB.NET +
.NET Compact Framework
- 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:
|
|
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
|