2012-03-25 5 views
1

Mein Verständnis von OpenGL-Rendering war, dass ohne einen Tiefentest, Objekte würden in sequenzieller Reihenfolge gezeichnet werden, so dass die letzte Render-Funktion, die Sie aufrufen wird seine Form über alles, was bereits gezeichnet wurde zeichnen. Ich finde, dass dies scheint jedoch nicht der Fall zu sein:OpenGL zurück nach vorne Rendering

glDisable(GL_DEPTH_TEST); 
glDisable(GL_ALPHA_TEST); 


glColor3f(1.0, 0.0, 0.0); 
glBegin(GL_QUADS); 
{ 
    glVertex2f(50, 50); 
    glVertex2f(100, 50); 
    glVertex2f(100, 100); 
    glVertex2f(50, 100); 
} 
glEnd(); 


glColor3f(0.0, 0.0, 1.0); 
glBegin(GL_QUADS); 
{ 
    glVertex2f(30, 60); 
    glVertex2f(110, 60); 
    glVertex2f(110, 90); 
    glVertex2f(30, 90); 
} 
glEnd(); 

Eher dann das rote Quadrat unter dem blauen Quadrat, die ich erwarten würde, diese Anrufe geben Sie mir ein rotes Quadrat über ein blaues Quadrat!

Verstehe ich nicht, wie OpenGL Rendering funktioniert? Oder fehlt mir gerade eine Art von Option oder Konfiguration, die das blaue Quadrat nicht rendern lässt? Ich benutze einen benutzerdefinierten (aber sehr einfachen) Shader, würde das irgendetwas ändern?

Die nicht akzeptierte Antwort auf this Frage scheint zu implizieren, dass sequenzielles Rendering nicht tatsächlich auftritt und Implementierung spezifisch ist, aber seine akzeptierte Antwort impliziert, dass es tatsächlich der Fall ist.

Was ist der beste Weg, um den zweiten Anruf an der Spitze zu machen? Ich möchte nicht wirklich irgendeinen globalen z-Wert haben, den ich während des ganzen Programms weiter steigern werde.

+0

Vielleicht sehen Sie sich die Szene von "hinten" an? Wie sehen Ihre MV- und P-Matrizen aus? – aib

+0

Argh! Wie sich herausstellte, hatte ich irgendwo eine Überblendungsfunktion aktiviert, die die Farbe der überzeichneten Werte verworfen hat. – Tomas

Antwort

4

Die Renderfunktion, die Sie aufrufen, wird ihre Form über die bereits gezeichneten Objekte zeichnen.

Das stimmt.

Ich finde, dass dies scheint jedoch nicht der Fall zu sein:

Dies funktioniert für mich:

#include <SDL/SDL.h> 
#include <GL/glew.h> 
#include <GL/gl.h> 
#include <GL/glu.h> 
#include <math.h> 

static int scrWidth = 640; 
static int scrHeight = 480; 

int main(int argc, char** argv){ 
    SDL_Init(SDL_INIT_VIDEO); 

    SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8); 
    SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8); 
    SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8); 
    SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 16); 
    SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); 
    SDL_GL_SetAttribute(SDL_GL_SWAP_CONTROL, 0); 

    if (SDL_SetVideoMode(scrWidth, scrHeight, 32, SDL_OPENGL) == 0){ 
     fprintf(stderr, "couldn't set mode %dx%d!\n", 640, 480); 
     SDL_Quit(); 
     return -1; 
    } 
    glewInit(); 

    SDL_ShowCursor(SDL_DISABLE); 

    glClearColor(0.2, 0.2, 0.2, 0.2); 
    glClearDepth(1.0); 

    glEnable(GL_DEPTH_TEST); 

    bool running = true; 
    while (running){ 
     SDL_Event event; 
     if (SDL_PollEvent(&event)){ 
      switch(event.type){ 
       case SDL_QUIT: 
        running = false; 
        break; 
      }; 
     } 
     glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); 

     glMatrixMode(GL_PROJECTION); 
     glLoadIdentity(); 
     gluOrtho2D(0, scrWidth, scrHeight, 0); 

     glColor3f(1.0f, 0.0f, 0.0f); 
     glBegin(GL_QUADS); 
     glVertex2f(50, 50); 
     glVertex2f(100, 50); 
     glVertex2f(100, 100); 
     glVertex2f(50, 100); 
     glEnd(); 


     glColor3f(0.0, 0.0, 1.0); 
     glBegin(GL_QUADS); 
     glVertex2f(30, 60); 
     glVertex2f(110, 60); 
     glVertex2f(110, 90); 
     glVertex2f(30, 90); 
     glEnd(); 

     glMatrixMode(GL_MODELVIEW); 
     glLoadIdentity(); 

     glFlush(); 
     SDL_GL_SwapBuffers();  
    } 

    SDL_Quit(); 
    return 0; 
} 

mit Ihrem Code vergleichen und sehen, ob es einen Unterschied. Vielleicht hast du den Tiefentest nicht wirklich deaktiviert. Sie könnten das gleiche Problem auch bekommen, wenn Sie Stencil Buffer in Ihrem Code mit bestimmten Kombinationen von Stencil Buffer Parametern verwenden (so etwas wie glStencilFunc(GL_NOTEQUAL, 0, 0xffffffff); glStencilOp(GL_KEEP, GL_KEEP, GL_INCR);). Sie können den gleichen Effekt auch erhalten, wenn Sie vergessen, glClear zu verwenden und den Befehl "swap buffers" zwischen dem ersten und zweiten Polygon einzufügen.

verwende ich einen benutzerdefinierten (aber sehr einfach) Shader, würde das etwas ändern?

Ja, es könnte alles ändern. In diesem Fall bedeutet dies jedoch, dass Sie nicht genügend Informationen zur Verfügung gestellt haben, um mit Ihrem Problem zu helfen Sie. Wenn Sie Hilfe mit Ihrem Code möchten, sollten Sie komplette und funktionale, aber minimal Beispiel, das Ihr Problem veranschaulicht. "Vergessen", dieses Beispiel zu posten, ist eine schlechte Idee.

+0

Es stellte sich heraus, dass ich Probleme mit der Überblendung hatte, aber wenn Sie in diesem Beispiel richtig waren, hätte ich das Problem an anderer Stelle in meinem Projekt gefunden, also akzeptiere ich Ihre Antwort – Tomas