SDL: OpenGL

Aus Wikibooks

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).