2. OpenGL ES

Welche OpenGL ES Implementierung

Es stehen einige freie sowie kommerzielle Implementierungungen von OpenGL ES zur Verfügung:

Vincent

Glut | ESt

Hybrid Rasteroid

PowerVR

Rasteroid und PowerVR scheinen die einzigen Implementierungen zu sein, welche noch weiterentwickelt werden. Hybrid Rasteroid ist für kommerzielle Anwendungen kostenpflichtig, weswegen wir uns u.a. für PowerVR entschieden haben. Außerdem unterstützt PowerVR OpenGL ES 2.0, bietet ein SDK für viele verschiedene Systeme wie z.B. Symbian an und ist die einzige Implementierung, welche Hardwarebeschleunigung unterstützt..



Installation der OpenGL ES Implementierung


Die Installationen der Implementierungen sind sich sehr ähnlich, daher halten wir unsere Installationanleitung relativ allgemein.

0. Entpacken Zunächst muss die Binary Version der Implementierung entpackt werden. Benötigt werden die Header- , Libary- und je nach Implementierung auch noch eine ..GLES.dll Datei.

1. Such-Pfade erweitern Als nächstes müssen die Header-Dateien und die Library-Dateien in den Such-Pfad von Visual C++ eingetragen. Hierfür wechselt man in Visual C++ zu „Tools Options.. Projects and Solutions VC++ Directories” und fügt bei dem entsprechenden Emulator - in unserem Fall Windows Mobile Pocket PC SDK – das Verzeichnis mit den Header-Dateien unter Include Files und das Verzeichnis mit den Library-Dateien unter Library Files hinzu.






2. Linker konfigurieren Nun müssen noch die Library Dateien im Linker eingetragen werden. Dazu wechselt man in Visual C++ zu „Project projectname Properties.. Configuration Properties Linker Input ” und fügt in die Zeile Additional Dependecies die folgenden Libraries ein libGLES_CM.lib aygshell.lib ug.lib (Vincent).






3. Emulator konfigurieren Um die kompilierte OpenGL Anwendungen auf dem Emulator ausführen zu können, muss man, je nach Implemntierung, noch die Runtime Library libGLES_CM.dll (Vincent) entweder in das Windows Verzeichnis oder in das Verzeichnis, in dem sich die auszuführende Anwendung befindet, kopieren. Eine Anleitung dazu ist unter "0. WM 5.0" zu finden. Hierfür muss ein Austausch Verzeichnis zwischen Windows und dem Emulator vereinbart werden. Dazu in Visual C++ im Emulator-Fenster zu „File Configure..” wechseln. Hier findet man einen Eintrag Shared Folder.
PowerVR dagegen verwendet die DLL, welche vom Graphikkartenhersteller bei der Treiberinstallation mit installiert wurde.
Hat man den Austausch Ordner richtig konfiguriert, kann man nun im Emulator über die Storage Card auf diesen zugreifen.




4. Code-Beispiel zum Erstellen eines Fensters inklusive primitiver Zeichnung mit der Vincent Implementierung.


// Man benötigt die Library libGLES_CM.lib sowie die ug.lib.
// #pragma comment() bindet die Libraries explizit ein.

#pragma comment(lib, "libGLES_CM.lib")
#pragma comment(lib, "ug.lib")

// Die Header-Datei ug.h ist muss ebenfalls eingebunden werden.

#include "ug.h"

// Anders als in OpenGL werden die Vertex-Koordinaten eines Körpers
// per Array übergeben.

GLfloat square[] = {
0.25, 0.25, 0.0,
0.75, 0.25, 0.0,
0.25, 0.75, 0.0,
0.75, 0.75, 0.0
};

//Initialisierung

void init()
{
   glClearColor (0.0f, 0.0f, 0.0f, 0.0f);

   glMatrixMode(GL_PROJECTION);
   glLoadIdentity();
   glOrthof(0.0f, 1.0f, 0.0f, 1.0f, -1.0f, 1.0f);

   // Nun muss angegeben werden, welche Vertices zum Zeichnen verwendet werden sollen.
   // Dazu benötigt man die Funktion glVertexPointer(GLint size, GLenum type, GLsizei stride )

   glVertexPointer(3, GL_FLOAT, 0, square);
   glEnableClientState(GL_VERTEX_ARRAY);
}

void display(UGWindow uwin)
{
   glClear (GL_COLOR_BUFFER_BIT);

   // Zum Zeichnes des vorher definierten Arrays verwendet man die
   // Funktion glDrawArrays(GLenum mode, GLint first, GLsizei count)

   glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

   glFlush ();
   ugSwapBuffers(uwin);
}

void keyboard(UGWindow uwin, int key, int x, int y)
{
   switch(key)
   {
      case 'q' : exit(0); break;
      case UG_KEY_UP : exit(0); break;
   }
}

void pointer(UGWindow uwin, int button, int state, int x, int y)
{
   exit(0);
}

int main()
{
   UGCtx ug = ugInit();

   UGWindow uwin = ugCreateWindow(ug, "", "OpenGL ES Window", 250, 250, 100, 100);

   init();

   ugDisplayFunc(uwin, display);
   ugKeyboardFunc(uwin, keyboard);
   ugPointerFunc(uwin, pointer);

   ugMainLoop(ug);

   return 0;
}