Welcome to Desktop Search Engine Comming soon
            News
            Another
Site
            Sqlite
            Opengl
           



Die benötigten Header-Dateien

#ifdef WIN32
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#endif

#if defined(__APPLE__) && defined(__MACH__)
#include <OpenGL/gl.h> // Header File For The OpenGL32 Library
#include <OpenGL/glu.h> // Header File For The GLu32 Library
#else
#include <GL/gl.h> // Header File For The OpenGL32 Library
#include <GL/glu.h> // Header File For The GLu32 Library
#endif

#include <SDL.h>

Die windows.h kann man sich natürlich sparen, wenn man nur für eine Plattform programmiert. gl.h enthält die OpenGL Befehle, glu.h ist die Headerdatei der GLU-Extension. Die GLU-Extension bringt einige nützliche Befehle mit. Mit diesen Headern kann man nun OpenGL-Befehle im Code verwenden.

if (SDL_SetVideoMode(800, 600, 0, SDL_OPENGL) == NULL) {
printf("Unable to create OpenGL screen: %s\n", SDL_GetError());
exit(2);
}

Damit teilt man SDL mit, dass man gerne OpenGL verwenden möchte. Damit ist man eigentlich schon fertig. Der Befehl ist der normale SDL_SetVideoMode, einzig das Flag SDL_OPENGL ist wichtig.


void InitGL(int width, int height) {
glViewport(0,0,width, height);

TextureManager_init();
TextureManager_initTileSet("default");

glEnable(GL_TEXTURE_2D); //enable texture mapping
glClearColor(0.0f, 0.0f, 0.0f, 0.0f); //Black Background
glClearDepth(1.0); //enables clearing of deapth buffer
glDepthFunc(GL_LEQUAL); //type of depth test
glEnable(GL_DEPTH_TEST); //enables depth testing
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // Enable Alpha Blending (disable alpha testing)
glEnable(GL_BLEND); // Enable Blending (disable alpha testing)
glShadeModel(GL_SMOOTH); //enables smooth color shading

glMatrixMode(GL_PROJECTION);
glLoadIdentity(); //Reset projection matrix

gluPerspective(45.0f, (GLfloat)width/(GLfloat)height, 1.0f, 100.0f); //calculate aspect ratio of the window
glMatrixMode(GL_MODELVIEW);
}

so könnte der Initialisierungscode ausschauen. Hier werden die wichtigsten Flags gesetzt, je nach dem, was man braucht. Im Beispiel werden hier initialisiert: der Viewport, einen eigenen TextureManager (Funktionen zum Laden der Texturen), Texture mapping, Depth-Buffer, Alpha-Blending und die 3D Projektionsmatrix.

Danach braucht man bloß noch in die MessageLoop von SDL eine Renderfunktion einbauen, die die entsprechende Szene rendert:

while (!done) {
SDL_Event event;
while (SDL_PollEvent(&event)) {
if (event.type == SDL_QUIT) {
done=true;
}
if (event.type == SDL_KEYDOWN) {
if (event.key.keysym.sym == SDLK_ESCAPE) {
done=true;
}
}
if (event.type == SDL_MOUSEBUTTONDOWN) {
if (event.button.state==SDL_PRESSED && event.button.button==SDL_BUTTON_LEFT) {
Map_selectTile(getMouseClickedOn(event.button.x,event.button.y));
}
}
}
SDL_Delay(10);
Map_render();
}

Map_render() und Map_selectTile() sind hierbei Funktionen für ein 2D-Strategiespiel (in der Entstehung). Ich hoffe, das ganze hilft weiter.



Quelle: Wikipedia