OpenGL - Multithreading Problem
-
Hey,
ich hab mal wieder ein Problem.
Nämlich geht es um Multithreading und OpengGL/SDL.
Ich wollte eine kleine "2D-Engine" Programmieren und hab dann halt jeweils zwei Threads für die Zeichnungsschleife(OpenGL) und für die Inputschleife(SDL) gestartet.
Doch wenn ich das Programm dann starte erscheint nur ein schwarzer Bildschirm, mit dem man nichts anfangen kann...(weder bewegen, noch schließen).
Aber ich weiß 100%ig, dass die zwei Threads gestartet wurden, da ich es mit std::cout getestet habe.
Falls ich jedoch die Schleifen ohne Threads starte(dazu muss ich die beiden zusammenbauen, weil ich ja schlecht beide laufen lassen kann ohne Threads) funktioniert es einwandfrei:
Das Testdreieck wird gezeichnet und die Eventabfrage funktioniert auch(das Fenster lässt sich schließen).
Vielleicht habe ich auch nur etwas falsch gemacht, da ich mich davor nicht wirklich mit Threads beschäftigt habe.
Jedenfalls hier sind die Codebeispiele:
EventLoop: (hat eine Callbackfunktion als Parameter, die der Benutzer dann selbstständig auswählen kann)void inStart(void (*pCallBackFunc)(SDL_Event)){ if(!InitDone || EventLoopActive){ return; } SDL_Event events; EventLoopActive = true; while(EventLoopActive){ while(SDL_PollEvent(&events)){ (*pCallBackFunc)(events); } SDL_Delay(100); } }
ZeichnenLoop: (mit Testquadrat)
void fwStartDrawLoop(){ if(!InitDone || DrawLoopActive){ return; } DrawLoopActive = true; while(DrawLoopActive){ glLoadIdentity(); glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glBegin(GL_QUADS); glVertex3f(-25,25,1); glVertex3f(25,25,1); glVertex3f(25,-25,1); glVertex3f(-25,-25,1); glEnd(); SDL_GL_SwapBuffers(); SDL_Delay(10); } }
Und hier werden die zwei Funktionen gestartet:
int main(int argc, char* argv[]) { fwInit(800,600,EventCallBack); return 0; }
void fwInit(int screen_x, int screen_y, void (*pCallBackFunc)(SDL_Event)){ SDL_Init(SDL_INIT_EVERYTHING); SDL_Surface* screen = SDL_SetVideoMode(screen_x,screen_y,32,SDL_SWSURFACE|SDL_OPENGL); glViewport( 0, 0, screen_x, screen_y ); glClearColor(1.0,0.0,0.0,1.0); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(-500,500,-500,500,-100,100); glMatrixMode(GL_MODELVIEW); glEnable(GL_DEPTH_TEST); glEnable(GL_TEXTURE_2D); InitDone = true; hThreads[0] = CreateThread(0,0,(LPTHREAD_START_ROUTINE)fwStartDrawLoop,0,0,&dwGameLoopIndex); hThreads[0] = CreateThread(0,0,(LPTHREAD_START_ROUTINE)inStart,*(pCallBackFunc),0,&dwInputLoopIndex); WaitForMultipleObjects(1,hThreads,TRUE,INFINITE); }
Sorry falls das ne Noobfrage is :>
Danke schonmal.
-
opengl ist nicht multithreaded, laeuft nur auf dem thread, dass das device erstellt hat ordentlich.
-
Mit anderen Worten: Du musst das GL Fenster in dem Thread erzeugen, in dem du auch rendern willst. Oder du verzichtest auf SDL und kümmerst sich selbst um das Context Management (also direkt mit wgl, glx, Cocoa)...