SDL: OpenGL
Die benötigten Header-Dateien
[Bearbeiten]#include <SDL.h> #include <SDL_opengl.h>
#define TRUE 1 #define FALSE 0
Für die von OpenGL benötigten Funktionen reicht das zusätzliche Einbinden der Headerdatei SDL_opengl.h
.
Plattformspezifische Eigenarten werden damit vollkommen nutzertransparent.
Die beiden Konstanten TRUE
und FALSE
werden später im Hauptpgrogramm (main
) benötigt.
Initialisierung der SDL
[Bearbeiten]Um die OpenGL in einem SDL-Programm verwenden zu können muss einfach die SDL_SetVideoMode Funktion angepasst werden:
SDL_SetVideoMode(800, 600, 32, SDL_OPENGL)
Damit teilt man der SDL mit, dass man gerne die OpenGL verwenden möchte. Damit ist man eigentlich schon fertig. Der Befehl ist der normale SDL_SetVideoMode, einzig das Flag
SDL_OPENGL
ist wichtig.
Initialisierung der OpenGL
[Bearbeiten]void Init_OpenGL() { SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); //doublebuffering soll verwendet werden glClearColor(0.0f, 0.0f, 0.0f, 0.0f); //schwarzer Hintergrund (dazu mehr in der render-Funktion) glShadeModel(GL_SMOOTH); //weichere Farbübergänge auf Körpern }
So könnte der Initialisierungscode ausschauen. Logischerweise wird diese Funktion je nach Bedarf variieren.
Rendern eines Objekts
[Bearbeiten]Da hier nur gezeigt werden soll, wie man die OpenGL zusammen mit der SDL verwendet, wird hier auf komplizierte Figuren und anderes verzichtet. Wir zeichnen hier „nur“ ein einfaches Dreieck, das zur Verschönerung an jeder Ecke einen anderen Farbwert bekommt.
Der dafür benötigte Code ist denkbar einfach ...
void Render() { glClear(GL_COLOR_BUFFER_BIT); glBegin(GL_TRIANGLES); glColor3f(0.0f, 0.0f, 1.0f); glVertex3f(0.0f, 0.5f, 0.0f); glColor3f(1.0f, 0.0f, 0.0f); glVertex3f(0.5f, -0.5f, 0.0f); glColor3f(0.0f, 1.0f, 0.0f); glVertex3f(-0.5f, -0.5f, 0.0f); glEnd(); SDL_GL_SwapBuffers(); }
Erläuterung
[Bearbeiten]Die Funktion
glClear
löscht den Bildschirm und setzt ihn auf die Farbe, welche wir vorhin in der Init
-Funktion mit glClearColor() gesetzt haben.
Mit
glBegin(GL_TRIANGLES)
teilen wir der OpenGL mit, dass die jetzt bis zur Funktion
glEnd()
folgenden Objekte Dreiecke sind.
Mit
glColor3f
legen wir die Farbe fest, die beim Zeichnen des Dreiecks verwendet werden soll.
Mit
glVertex3f
legt man die Eckpunkte fest, welche für das Dreieck gebraucht werden.
Jetzt ist allerdings noch nichts am Bildschirm zu sehen. Das Gezeichnete wird mit der Funktion
SDL_GL_SwapBuffers()
sichtbar gemacht.
Die main() Funktion
[Bearbeiten]Die folgende main
-Funktion bedarf keiner besonderen Erläuterung.
int main(int argc, char *argv[]) { SDL_Event ev; int done = FALSE; SDL_SetVideoMode(800, 600, 32, SDL_OPENGL); Init_OpenGL(); while(!done) { SDL_PollEvent(&ev); if(ev.type == SDL_QUIT || (ev.type == SDL_KEYDOWN && ev.key.keysym.sym == SDLK_ESCAPE)) done = TRUE; Render(); } SDL_Quit(); return 0; }
Die vorhin gezeigte Funktion Init_OpenGL
wird hier zur Initialisierung aufgerufen.
In der von den vorhergehenden Kapiteln bekannten Event-Schleife wird die Render
-Funktion aufgerufen, die das Dreieck auf den Bildschirm bringt.
Beim Kompilieren muss man eventuell mit -lGL
die Library libGL
linken (oder unter Windows mit opengl32.lib
und glu32.lib
).