Anfangsproblem mit OpenGL



  • Hi,

    ich bin vor kurzem mit OpenGL angefangen und in dem folgendem Quellcode soll ein blaues(2D-)Dreieck in einem schwarzen Fenster ausgegeben werden. OpenGL habe ich mit SDL initialisiert, weil dies für mich einfacher und sinnvoller erschien.
    Nur statt ein blaues Dreieck auszugeben bleibt das Fenster schwarz.

    Mein Code sieht wie folgt aus:

    #ifdef _WIN32 
    #undef main 
    #endif
    #include <stdlib.h>
    #include <stdio.h>
    
    #include <Sdl/SDL.h>
    
    #include <Sdl/SDL_opengl.h>
    
    void RefreshScreen()
    {
        glClearColor(0.0, 0.0, 0.0, 0.0);
        glClear(GL_COLOR_BUFFER_BIT);
    
        glBegin(GL_TRIANGLES);
    	glColor3f(0.0f,0.0f,1.0f); //blau
    
    glVertex3f( 0.0f, 1.0f, 0.0f); // Die obere Ecke des Dreiecks
        glVertex3f(-1.0f,-1.0f, 0.0f); // unten links
        glVertex3f( 1.0f,-1.0f, 0.0f); // unten rechts
    
    glEnd();  
    
    }
    
    int main(int argc, char **argv)
    {
        SDL_Surface *screen;
        int running;
    
        if (SDL_Init(SDL_INIT_VIDEO)) /* OpenGL-Bildschirmmodus */
        SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 5);
        SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 5);
        SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 5);
        SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 16);
        SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
    
        screen = SDL_SetVideoMode(640, 480, 0, SDL_OPENGL);
        if (!screen) {
            fprintf(stderr, "Konnte Bildschirmmodus nicht setzen: %s\n",
                SDL_GetError());
            exit(1);
        }
    
    glViewport(0, 0, screen->w, screen->h);
    
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        glOrtho(0, screen->w, screen->h, 0, -1.0, 1.0);
    
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
    
    /* Programmschleife */
        running = 1;
        while(running) {
            SDL_Event event;
    
            while(SDL_PollEvent(&event)) {
                switch(event.type) {
                case SDL_KEYDOWN:
                    running = 0;
                    break;
                case SDL_QUIT:
                    running = 0;
                    break;
                }
            }
            RefreshScreen();
            // Pageflip: Back- und Frontbuffer werden vertauscht
            SDL_GL_SwapBuffers();
        }
    
    return 0;
    }
    

    Nur wenn ich statt "glVertex3f(...)" glVertex2i(..) verwende funktioniert es komischerweise. Woran liegt das?

    Gruß Crabbe

    Mhmm... die Codetags scheinen bei mir nicht zu funktionieren



  • glOrtho(0, screen->w, screen->h, 0, -1.0, 1.0);

    ich weiß nicht, aber müssten die parameter nicht so glOrtho(x, width, y, height, ...)
    angeordnet sein??

    mfg
    Plassy



  • Hi,

    wahrscheinlich hast du Recht, aber auch wenn ich die Änderung vornehme erscheint trotzdem nur ein schwarzer Bildschirm.

    Gruß Crabbe



  • screen = SDL_SetVideoMode(640, 480, 0, SDL_OPENGL);

    muss da nicht noch die Farbtiefe (hier 16) hin?



  • Ja schon, bei mir ist er 0, aber das ändert auch nichts daran, dass der Bildschirm schwarz bleibt.

    Gruß Crabbe



  • probier mal die zwei aus

    glVertex3f( 0.0f, 1.0f, 0.0f); // Die obere Ecke des Dreiecks
    glVertex3f( 1.0f,-1.0f, 0.0f); // unten rechts
    glVertex3f(-1.0f,-1.0f, 0.0f); // unten links

    glVertex3f( 0.0f, 1.0f, -2.0f); // Die obere Ecke des Dreiecks
    glVertex3f(-1.0f,-1.0f, -2.0f); // unten links
    glVertex3f( 1.0f,-1.0f, -2.0f); // unten rechts



  • Hi,

    ich habe jetzt die Lösung gefunden, bin aber jetzt noch ratloser.
    Das Dreieck wurde zwar gezeichnet aber hatte nur die Größe von wenigen Pixeln und so habe ich gedacht, dass der Bildschirm leer bzw. schwarz war.
    ALs ich dann die Parameter erhöht hatte ging es dann.(also ich konnte was sehen)
    Nur seit wann stehen die Parameter in "glVertex3f( 0.0f, 1.0f, 0.0f)" für die Anzahl der Pixel?
    Warum ist das bei mir so?

    Gruß Crabbe



  • Seitdem du eine orthogonale Projektion mit deinen Bildschirmgrössen setzt. Weisst du überhaupt, was du da so machst?

    Bye, TGGC



  • Ja, wiso?
    Na gut zugegeben meine Beschreibung ist ein bisschen undeutlich geraten,
    mit der Anzahl der Pixel meine ich, dass wenn ich als Parameter bei
    glVertex3f( 0.0f, 1.0f, 0.0f) 1 nehme, dieser Punkt sich dann in den Kordinaten bei 1 befindet, also bei einem Pixel. Verstanden?

    Gruß Crabbe



  • Crabbe schrieb:

    Ja, wiso?
    Na gut zugegeben meine Beschreibung ist ein bisschen undeutlich geraten,
    mit der Anzahl der Pixel meine ich, dass wenn ich als Parameter bei
    glVertex3f( 0.0f, 1.0f, 0.0f) 1 nehme, dieser Punkt sich dann in den Kordinaten bei 1 befindet, also bei einem Pixel. Verstanden?

    Gruß Crabbe

    Hat TGGC doch schon gesagt...!?! 😕



  • Aehm ja, wie schon gesagt, wenn du im Ortho-Mode bist ist 1.0f == 1 pixel 🙂


Anmelden zum Antworten