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?
Welche Art von Projektion verwenden Sie? Ich würde zu einer Orthographie für die UI wechseln. – BDL
@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. –
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