2016-07-27 18 views
0

Ich erstelle ein 3D Spiel mit OpenGL und ich möchte eine Werkzeugleiste im oberen Bereich des Fensters erstellen. Dafür habe ich versucht, mit SDL die Buttons und OpenGL zu zeichnen, um das eigentliche Spiel zu zeichnen. Hier ist der relevante Teil meines Code:Zeichnen Sie 2D und 3D im selben OpenGL Fenster

void openMainWindow(){ 
    SDL_Surface *screen; 
    SDL_Event event; 
    SDL_Rect position; 
    SDL_Init(SDL_INIT_VIDEO); 
    putenv("SDL_VIDEO_CENTERED=center"); 
    SDL_WM_SetCaption("Example",NULL); 
    SDL_WM_SetIcon(IMG_Load("icon.png"),NULL); 
    screen = SDL_SetVideoMode(832,487,32,SDL_HWSURFACE | SDL_OPENGL); 
    glLoadIdentity(); 
    gluPerspective(70,(double)832/487,1,1000); 
    //Some things to initialize the window 
    int continue = 1; 
    while(continue){ 
     SDL_PollEvent(&event); 
     switch(event.type){ 
      //Events 
     } 
     glMatrixMode(GL_MODELVIEW); 
     glLoadIdentity(); 
     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
     glBegin(GL_QUADS); 
      //Draw a square 
     glEnd(); 
     //Draw more things the same way 
     glFlush(); 
     SDL_GL_SwapBuffers(); 
     SDL_Surface *button1 = SDL_CreateRGBSurface(SDL_HWSURFACE,50,50,32,0,0,0,0); 
     SDL_FillRect(button1,NULL,SDL_MapRGB(screen->format,50,50,50); 
     position.x = 8; 
     position.y = 8; 
     SDL_BlitSurface(button1,NULL,screen,&position); 
     SDL_Flip(screen); 
    } 
    SDL_Quit(); 
} 

Das Problem dabei ist, dass, wenn diese Funktion aufgerufen wird, endet der Prozess und gibt 3 (was bedeutet, dass ein Fehler vorliegt). Also habe ich versuchte, wie dies die Tasten mit OpenGL zu zeichnen:

void openMainWindow(){ 
    //Everything before the while loop is the same as in the other code 
    int continue = 1; 
    while(continue){ 
     SDL_PollEvent(&event); 
     switch(event.type){ 
      //Events 
     } 
     glMatrixMode(GL_MODELVIEW); 
     glLoadIdentity(); 
     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
     glBegin(GL_QUADS); 
      //Draw a square 
     glEnd(); 
     //Draw more things the same way 
     glDisable(GL_DEPTH_TEST); 
     glLoadIdentity(); 
     glBegin(GL_QUADS); //Draw the button 
      glColor3ub(50,50,50); 
      glVertex2d(-0.5,-0.5); 
      glVertex2d(-0.5,0.5); 
      glVertex2d(0.5,0.5); 
      glVertex2d(0.5,-0.5); 
     glEnd(); 
     glEnable(GL_DEPTH_TEST); 
     glFlush(); 
     SDL_GL_SwapBuffers(); 
    } 
    SDL_Quit(); 
} 

Ich weiß, dass der zweite Code auf die Schaltfläche im Fenster zentrieren soll, aber ich verwende diesen Code nur um zu testen, ob es funktioniert (und es funktioniert nicht , deshalb schreibe ich diese Frage).

Mit dem zweiten Code erscheinen die 3D-Dinge im Fenster so, wie sie sollten, aber ich kann keine Taste sehen. Wie lege ich 2D Buttons in ein 3D OpenGL Fenster?

+0

Welche Art von Projektion verwenden Sie? Ich würde zu einer Orthographie für die UI wechseln. – BDL

+0

@BDL Ich weiß nicht wirklich, was Sie mit Projektion meinen, da ich ein Anfänger in OpenGL bin, aber Sie können wahrscheinlich sehen, welche Art von Projektion ich im Code verwende. Wenn nicht, kannst du mir sagen, wie ich es herausfinden soll. –

+0

Es gibt eine Identitätsprojektion (Perspektive proj wurde mit 'gluPerspective' gesetzt, aber dann sofort mit' glLoadIdentity' gelöscht). Ich sehe keine offensichtlichen Fehler im zweiten Code (der erste ist eine andere Geschichte - es gibt keine Möglichkeit, das zu funktionieren), aber da GL eine Zustandsmaschine ist, kann es eine Menge geänderter Zustände geben, die vor gegebenem Code passiert sind und dessen Ausführung beeinflussen (wie Backface Culling). Ich schlage vor, minimales vollständiges Beispiel zu veröffentlichen, das dein Problem veranschaulicht. Bessere Lösung wäre z.B. apitrace, um dein Problem zu debuggen. – keltar

Antwort

0

Der zweite Code funktioniert, indem Sie die folgenden kurz vor der 2D-Taste Zeichnung:

glLoadIdentity(); 
glMatrixMode(GL_PROJECTION); 
glDisable(GL_DEPTH_TEST); 
glLoadIdentity(); 

und den folgenden Code direkt nach der Schaltfläche 2D-Zeichnung:

glEnable(GL_DEPTH_TEST); 
gluPerspective(70,(double)640/480,0.5,INFINITE); //These parameters have to be the same as the ones used for gluPerspective when initializing the 3D 
gluLookAt(0,0,3,1,0,3,0,0,0.01); //Where you want to position the camera and where you want to look at 
glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 

Dies ist der komplette Code, funktioniert:

void openMainWindow(){ 
    //Everything before the while loop is the same as in the other code 
    int continue = 1; 
    while(continue){ 
     SDL_PollEvent(&event); 
     switch(event.type){ 
      //Events 
     } 
     glMatrixMode(GL_MODELVIEW); 
     glLoadIdentity(); 
     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
     glBegin(GL_QUADS); 
      //Draw a square 
     glEnd(); 
     //Draw more things the same way 
     glLoadIdentity(); 
     glMatrixMode(GL_PROJECTION); 
     glDisable(GL_DEPTH_TEST); 
     glLoadIdentity(); 
     glBegin(GL_QUADS); //Draw the button 
      glColor3ub(50,50,50); 
      glVertex2d(-0.5,-0.5); 
      glVertex2d(-0.5,0.5); 
      glVertex2d(0.5,0.5); 
      glVertex2d(0.5,-0.5); 
     glEnd(); 
     glEnable(GL_DEPTH_TEST); 
     gluPerspective(70,(double)640/480,0.5,INFINITE); //These parameters have to be the same as the ones used for gluPerspective when initializing the 3D 
     gluLookAt(0,0,3,1,0,3,0,0,0.01); //Where you want to position the camera and where you want to look at 
     glMatrixMode(GL_MODELVIEW); 
     glLoadIdentity(); 
     glFlush(); 
     SDL_GL_SwapBuffers(); 
    } 
    SDL_Quit(); 
}