OpenGl - schwarzes Fenster



  • Nathan schrieb:

    @floorball:
    Die Funktion gibts btw schon, heißt swap_buffers.

    Bei mir gehts übrigens auch nicht.

    Hab ich übersehen, habs nur kurz überflogen. Aber als ich sie grad eben gesucht hab,ist mir aufgefallen, dass glViewport fehlt. Hoffentlich hab ich diesmal nichts übersehen... :p
    @Wav3oR: Nach wglMakeCurrent aufrufen ersten beiden Parameter 0 und dann die breite und anschließend höhe deines Fensters
    Hoffe diesmal stimmt alles

    floorball

    EDIT: Verdammt, hat OpenGL nicht einen Default-Viewport der gesetzt wird wenn wglCreateContext aufgerufen wird?? Dann hab lieg ich wohl wieder falsch 😡 😡



  • So, habe mir jetzt auch mal einen richtigen Account hier gemacht, bzw. meinen alten wieder zum Leben erweckt 🙂 Nur deine Lösung funktioniert leider nicht, hast du vll noch eine andere Lösung ?

    Habe jetzt nochmal einen anderen Code versucht, doch wieder mit dem selbigen Ergebnis, ich poste den Code auch nochmal, vieleicht könnt ihr ja irgentwelche Parallen zwischen den beiden Codes erkennen, dass dies zu einer Lösung führt 🙂

    #include <windows.h>
    #include <gl\gl.h>
    #include <gl\glu.h>
    
    #include "screen_interface.h"
    
    struct vertex
    {
      GLint wx, wy;
    
      vertex( void ) : wx( 0 ), wy( 0 ) { }
      vertex( GLint x, GLint y ) : wx( x ), wy( y ) { }
    };
    
    MSG msg;
    unsigned char key_pressed( void );
    
    int WINAPI WinMain( HINSTANCE hinst, HINSTANCE pinst, LPSTR cmdl, int cmds )
    {
      screen_interface.open_window( hinst, 640, 480 );
    
      vertex a( 80, 80 );
      vertex b( 560, 400 );
      vertex c( 160, 150 );
      vertex d( 480, 330 );
    
      glClearColor( 0.25f, 0.2f, 1, 0 );
      glClear( GL_COLOR_BUFFER_BIT );
    
      while( 1 )
      {
        if( key_pressed() ) break;    
    
        vertex pos;
        pos.wx = a.wx + (rand() % (b.wx - a.wx + 1));
        pos.wy = a.wy + (rand() % (b.wy - a.wy + 1));
    
        if( pos.wx >= c.wx && pos.wx <= d.wx && pos.wy >= c.wy && pos.wy <= d.wy )
          continue;
    
        glBegin( GL_POINTS );
    
          GLubyte c = rand() % 256;
    
          glColor3ub( c, c, c );
          glVertex2i( pos.wx, pos.wy );
    
        glEnd();
      }
    
      return msg.wParam;
    }
    
    unsigned char key_pressed( void )
    {
      if( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) )
      {
        if( msg.message == WM_QUIT || msg.message == WM_KEYDOWN ) return 1;
    
        TranslateMessage( &msg );
        DispatchMessage( &msg );
      }
    
      return 0;
    }
    

    ~Naris



  • Ich tue es zwar ungern, aber #push weil ich solangsam echt verzweifelt bin 😕



  • Prüf die Rückgabewerten von:
    - GetDC: Gibt NULL zurück wenns fehlschlägt
    - ChoosePixelFormat: Gibt 0 zurück wenns fehlschlägt
    - SetPixelFormat: Gibt FALSE zurück wenns fehlschlägt
    - wglCreateContext: Gibt NULL zurück wenns fehlschlägt
    - wglMakeCurrent: Gibt FALSE zurück wenns fehlschlägt

    Dann noch mithilfe GetLastError mehr erfahren

    floorball



  • Danke erstmal für deine Antwort, nur da ich noch eher ein Anfänger in der Programmierung bin, schaffe ich es gerade nicht mir die Rückgabewerten von den externen Funktion zu liefern, bzw. ich musste das mein Projekt fehlerfrei kompiliert wird in VS10 als SubSystem Windows einstellen, nur jetzt habe ich keine Konsole mehr um mir Sachen ausgeben zu lassen, obwohl ich als Projekt eine Konsoleanwendung habe, natürlich könnte ich die Sachen in eine Datei speichern, doch gibt es noch eine elegantere Lösung die Konsole wieder zu bekommen ?

    #Naris#



  • Das wär mir neu, dass man die Konsole deaktivieren muss...
    Ich bin jetzt auch nicht der Experte von VS, aber es gibt da eine Funktion, die heißt OutputDebugString, die hilft evtl.



  • Kriegs leider auch damit nicht hin, da das Rückgabe Format nicht stimmt, heißt kann darüber nix vom Typ HDC, welcher in der Variable verwendet wird, ausgeben. Solangsam denke ich echt drüber nach, das Buch in die Tonne zu drücken, nur hat leider 50 Takken gekostet ...



  • Naris schrieb:

    Kriegs leider auch damit nicht hin, da das Rückgabe Format nicht stimmt, heißt kann darüber nix vom Typ HDC, welcher in der Variable verwendet wird, ausgeben. Solangsam denke ich echt drüber nach, das Buch in die Tonne zu drücken, nur hat leider 50 Takken gekostet ...

    Das Buch bringt einem extrem veraltetes OpenGL bei, das stimmt.
    Aber es erklärt echt gut die mathematischen Grundlagen dahinter, ist in meiner Erfahrung gut als Begleitlektüre für bspw. ein Online-Tutorial geeignet.



  • Habe mich jetzt mal im Bereich "Wissenswertes" nach einem Tutorial für OpenGL 3.0 umgeschaut, nur das einziege Tutorial ist auf English, gibt es da schon etwas in der deutschen Kategorie was gut ist, weil das meiste was ich über Google finde bricht in der Tutorial Reihe aprubt ab.



  • Naris schrieb:

    Habe mich jetzt mal im Bereich "Wissenswertes" nach einem Tutorial für OpenGL 3.0 umgeschaut, nur das einziege Tutorial ist auf English, gibt es da schon etwas in der deutschen Kategorie was gut ist, weil das meiste was ich über Google finde bricht in der Tutorial Reihe aprubt ab.

    Ein vernünftiges Tutorial:
    http://arcsynthesis.org/gltut/

    Und als Programmierer solltest du englisch können. Ist, für mich, eine Grundvoraussetzung. Deutsche Programmierbücher sind meistens grausam.
    Ausserdem versperrst du dir den Weg zu vielen guten Tutorials und Beispielen ohne Englisch Kenntnisse.

    Davon abgesehen, verwende doch einfach SFML oder SDL um ein Fenster zu erstellen. Sich mit WinAPI rumzuärgern ist nicht lustig.



  • Vor allem wenn du ein OpenGL-Tut siehst was noch glBegin und glEnd nimmt, dann schaue es dir gar nicht erst an. Seit vielen Jahren und auch auf mobilen Geräten wird nur noch mit Buffern+Shadern programmiert.



  • 👎 native GUI
    👍 SDL

    Wieso der ganze Aufwand 😕 😕 😕 ?
    Wennst Events brauchst, dass SDL_PollEvent. Einfach geht's nicht!

    SDL2 + GL + GLEW

    int main (int argc, char** argv)
    {
        SDL_Init(SDL_INIT_VIDEO);
    
        SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
        SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 1);
        SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);
    
        const int w = 600, h = 600;
        SDL_Window *win = SDL_CreateWindow("Sandbox", 0, 0, w, h, SDL_WINDOW_OPENGL|SDL_WINDOW_SHOWN);
        SDL_GL_CreateContext(win);
        glewInit();
    
        glViewport(0,0,w,h);
    
        do {
        // your crap here !!
        SDL_GL_SwapWindow(win); // swaaaaap ...
        } while(foo);
    
        SDL_DestroyWindow(win);
        return 0;
    }
    

    // edit swap in einer Zeile



  • SFML geht auch und würde ich ehrlich gesagt bevorzugen mittlerweile, vor allem wenn man mit C++ arbeitet.


Anmelden zum Antworten