PFD_DOUBLEBUFFER Flag stört (OpenGL)



  • Hallo zusammen,
    Ich programmiere zurzeit OpenGL unter C++ Builder 4 PRO.
    Leider nach der Setzung des PIXELFORMATDESCRIPTOR auf

    pfd.dwFlags  = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
    

    wird mein Ausgabe Schwarz, was nicht beabsichtigt war.
    Um genauer zu sein nur PFD_DOUBLEBUFFER verursacht bei mir schwarze Ausgabe.
    Das komische ist, setze ich den dwFlags unter Delphi, wird meine Ausgabe richtig dargestellt. Ich vermute, dass das mit dem Builder 4 zusammenhängt. Hat jemand ähnliche Erfahrung gemacht und kann mir hier helfen?

    Danke sehr im Voraus
    coder24h



  • Du hast wohl recht mit deiner Vermutung, dass es am Compiler liegt. Der ist doch auch schon sehr alt. Vielleicht sind die Headerdateien veraltet (ich mein windows.h) und die Definition von PIXELFORMATDESCRIPTOR stimmt nicht mehr.



  • Ich schätze, dass du vorher ohne Double Buffer gearbeitet hast.

    Mit Double Buffer must du hinterher die Buffer vertauschen.

    SwapBuffers(hDC);
    

    hDC ist das HDC deines Fensters in OpenGL.



  • Hallo zusammen und danke für Ihre Aufmerksamkeit!
    Hier ist das Quellcode, wie gesagt unter Delphi läuft das bei mir ohne Probleme, unter c++ Builder 4 PRO jedoch verursacht die Anwendung sogar jetzt schon einen Ausnahmefehler, so dass das Betriebssystem sogar abstürzt. Das Problem tritt verstärkt bei der Veränderung der Fenstergröße.
    Ich hoffe jemand kann mir hier weiter helfen.

    //---------------------------------------------------------------------------
    #include <vcl.h>
    #include <gl/gl.h>
    #include <gl/glu.h>
    #include <gl/glaux.h>
    #pragma hdrstop
    
    #include "TFormGL.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TFormGL *FormGL;
    
    //---------------------------------------------------------------------------
    void SetDCPixelFormat(HDC hDC) {
       int nPixelFormat;
       static PIXELFORMATDESCRIPTOR pfd = {
            sizeof(PIXELFORMATDESCRIPTOR),
            0,
            PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER,
            0,
            0,
            0,0,0,0,0,0,
            0,0,
            0,0,0,0,0,
            0,
            0,
            0,
            0,
            0,
            0,0,0
            };
      nPixelFormat = ChoosePixelFormat(hDC, &pfd);
      SetPixelFormat(hDC, nPixelFormat, &pfd);
    };
    //---------------------------------------------------------------------------
    __fastcall TFormGL::TFormGL(TComponent* Owner)
            : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    void __fastcall TFormGL::FormCreate(TObject *Sender)
    {
     SetDCPixelFormat(Canvas->Handle);
     hrc = wglCreateContext(Canvas->Handle);
    }
    //---------------------------------------------------------------------------
    void __fastcall TFormGL::FormPaint(TObject *Sender)
    {
     wglMakeCurrent(Canvas->Handle, hrc);
     glViewport (0, 0, ClientWidth, ClientHeight); 
    
     glClearColor (0.5, 0.5, 0.75, 1.0); 
     glClear (GL_COLOR_BUFFER_BIT);      
    
     glPointSize (20);                   
     glColor3f (1.0, 0.0, 0.5);          
     glBegin (GL_POINTS);                
       glVertex2f (-1, -1);
       glVertex2f (-1, 1);
       glVertex2f (0, 0);
       glVertex2f (1, -1);
       glVertex2f (1, 1);
     glEnd;                              
    
     SwapBuffers(Canvas->Handle);         
     wglMakeCurrent(0, 0);
    }
    //---------------------------------------------------------------------------
    void __fastcall TFormGL::FormDestroy(TObject *Sender)
    {
     wglDeleteContext(hrc);
    }
    //---------------------------------------------------------------------------
    

    Mit freundlichen Grüßen
    Coder24h



  • Genauere Fehlermeldung lautet:

    Microsoft Visual C++ Runtime Library

    Runtime Error!
    abnormal Program termination

    Das ganze programmiere ich unter Borland C++ Builder 4

    Hat wer einen Verdacht warum die Fehlermeldung zustande kommt?



  • Hast du schon mal eine Debugsession gemacht? Wenn nicht, dann setz einen Breakpoint in der FormCreate Methode und dann im Einzelschrittmodus durchgehen, bis die Ausnahme ausgelöst wird. So kannst du das Problem wenigstens schonmal eingrenzen bzw. Code ausschließen.



  • Danke für Eure Antworten!
    Den Fehler habe ich mittlerweile lokalisiert und zwar lag es am glEnd(); Ich habe einfach nur die Klammern am Ende der Funktion vergessen (übliche Schreibweise in Delphi)!

    Viele Grüße
    coder24h


Anmelden zum Antworten