[GELÖST]SDL + OpenGL Anfängerproblem


  • Mod

    je nach dem was du eigentlich fuer nen view willst, has du glortho/glfrustum bzw gluperspective zur wahl, es haengt also nicht nur von den werten ab.

    bei nehe kannst du dir im tutorial genaueres anschauen.
    z.B. http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=17

    glOrtho(0,640,0,480,-1,1);
    


  • Soweit ich das im Tutorial verstanden habe gehört das in mein Void Render, aber wenn ich das dort rein kopiere, dann sehe ich aber nur schwarz, auch wenn das irgendwo anders hinein kopiere. Und gluPerspective kann ich nicht nutzen weil ich den Befehl zum Linken der Bibliothek nicht kenne....

    Edit: Ich habe jetzt gluPerspective benutzt, und ein kleines Skript geschrieben, mit dem man ein Dreieck hin und her, bzw. rauf und runter bewegen kann. Dabei ist mir dann aufgefallen, das der Bildschirm garnicht aktualisiert wird. Wie kann ich das ändern?

    #include <stdlib.h>
    #include "SDL.h"           
    #include "SDL_image.h"     
    #include "time.h"          
    #include "SDL_opengl.h"
    #include "GL/glu.h"
    #define TRUE 1
    #define FALSE 0
    
    float y = 0.0;
    float x = 0.0;
    Uint8 *keys;
    
    void Render()
        {    
    
            keys = SDL_GetKeyState(NULL);
           if (keys[SDLK_UP]) {
    
                   y = y + 0.001;
    
           }
           if (keys[SDLK_DOWN]) {
    
                   y = y - 0.001;
    
           }
           if (keys[SDLK_RIGHT]) {
    
                   x = x + 0.001;
    
           }
           if (keys[SDLK_LEFT]) {
    
                   x = x - 0.001;
    
           }
    
             glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
             glMatrixMode(GL_MODELVIEW);  
             //glTranslatef(-1.5,0.0,0.0);        
             //glTranslatef(0.0, 0.0,-6.0);
             glLoadIdentity();      							                             
             glBegin(GL_TRIANGLES);
             glVertex3f(x-0.3,y-0.3, 0.0);  
             glVertex3f(x+0.3,y-0.3, 0.0);
             glVertex3f( x, y+0.3, 0.0);
             glEnd;
             SDL_GL_SwapBuffers();  
        }
    
    void Init_OpenGL()     
        {
    
              SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 10);    
    
              glClearColor(0.0f, 0.0f, 0.0f, 0.0f);           
    
              glLoadIdentity();
    
              gluPerspective(0.50f,800/600,0.1f,100.0f);
    
              glShadeModel(GL_SMOOTH);                        
        }
    
    int main(int argc, char *argv[])
        {
             SDL_Event ev;
             int done = FALSE;
    
             SDL_SetVideoMode(800, 600, 32, SDL_OPENGL);
    
             Init_OpenGL();
    
             while(!done)
             {
                  SDL_PollEvent(&ev);
    
                  if(ev.type == SDL_QUIT || ev.key.keysym.sym == SDLK_ESCAPE)
                       done = TRUE;
    
                  Render();
             }
    
             SDL_Quit();
             return 0;
        }
    


  • Hat keiner eine Antwort? 😞



  • Will mir denn wirklich keiner sagen wie man den Bildschirm aktualisiert? 😕



  • Woher weißt du, dass der Bildschirm nicht aktualisiert wird?



  • glBegin(GL_TRIANGLES);
      glVertex3f(x-0.3,y-0.3, 0.0);  
      glVertex3f(x+0.3,y-0.3, 0.0);
      glVertex3f( x, y+0.3, 0.0);
    glEnd;
    

    Wie willst du so eigentlich das Dreieck ueberhaupt sehen? Da z = 0, liegt es ja direkt vor der Kamera, da du aber bei

    gluPerspective(0.50f,800/600,0.1f,100.0f);
    

    zNear auf 0.1 setzt, wirst du niz sehen koennen, was naeher als 0,1 Einheiten vor der Kamera liegt. (also entweder die z-Koordinate anpassen oder vorher ein entsprechendes Translate durchfuehren)



  • Ja ich seh ein weißes Dreieck, habs auf z = -1 geändert, funktioniert auch wenn ich das auf z.B. z=-60 setze, also besser als vorher.
    Woher ich weiß das der Bildschirm nicht aktualisiert wird?
    Wie ich weiter schon geschrieben habe, habe ich ein Skript geschrieben mit dem man das Dreieck mit den Pfeiltasten hoch und runter bzw. hin und her bewegen kann. Es zieht dabei einen weißen streifen hinter sich her, ergo: Der Bildschirm wird nicht aktualisiert.



  • Du setzt mit glClearColor nur die Farbe, die man erhält wenn der Bildschirm gelöscht wird. Um den Farbpuffer selbst zu löscht muss man glClear(GL_COLOR_BUFFER_BIT) aufrufen.



  • Macht er auch, Zeile 39.

    Was mich aber irritiert:

    Isodrink schrieb:

    SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 10);
    

    Als Wert wirklich 10? Nicht nur 1 (an) oder 0 (aus)?



  • Das muss

    glEnd();
    

    heißen, nicht einfach nur

    glEnd;
    

    So ruft er doch gar keine Funktion auf.



  • 10? hmmm 😕
    Naja ich hab jetzt alles berichtigt und jetzt funktioniert es, danke! 🙂



  • TdZ schrieb:

    glEnd;
    

    So ruft er doch gar keine Funktion auf.

    Stimmt. Sowas übersieht man ganz schnell.

    @Isodrink:
    Na Glückwunsch.


Anmelden zum Antworten