OpenGL in Bitmap/Canvas



  • ALso ich habe eine Funktion zum Initialisieren von OpenGL:

    bool UseDoubleBuffer = true;
    HDC dc;
    HGLRC GLContext;
    
    HDC InitOpenGL(HWND Handle,bool UseDoubleBuffer)
    {
            PIXELFORMATDESCRIPTOR pfd;
    
            memset(&pfd,0,sizeof(pfd));
            pfd.nSize       = sizeof(PIXELFORMATDESCRIPTOR);
            pfd.nVersion    = 1;
            pfd.dwFlags     = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL;
            if(UseDoubleBuffer)
                    pfd.dwFlags |= PFD_DOUBLEBUFFER;
            pfd.iPixelType  = PFD_TYPE_RGBA;
            pfd.cColorBits  = 24;
            pfd.cDepthBits  = 32;
            pfd.iLayerType  = PFD_MAIN_PLANE;
    
            HDC dc = GetDC(Handle);
    
            int iPF = ChoosePixelFormat(dc, &pfd);
            if(iPF == 0) ShowMessage("Fehler bei PixelFormat!");
    
            SetPixelFormat(dc, iPF, &pfd );
            GLContext = wglCreateContext(dc);
            if(GLContext) wglMakeCurrent(dc, GLContext);
            else ShowMessage("MakeCurrent geht nich!");
            return dc;
    }
    

    Und beim Erstellen:

    dc = InitOpenGL(Form1->Handle,UseDoubleBuffer);
            glEnable(GL_DEPTH_TEST);
            glDepthFunc(GL_LEQUAL);
            glClearColor(1,1,1,1);
    
            glMatrixMode(GL_MODELVIEW);
    

    Das ganze funktioniert ja prima, jedoch möchte ich gerne auch nur auf eine Paintbox oder Bitmap zeichnen!
    Wenn ich PaintBox->Canvas->Hande verwende, erscheinen jedoch beide Fehlermeldungen("Fehler bei PixelFormat!" und "MakeCurrent geht nich!"), nutze ch TBitmap->Handle kommt immerhin nur noch die zweite Meldung ("MakeCurrent geht nich!").
    Was muss ich anpassen, damit beides oder zumindest eins von beidem funktioniert?
    Danke schonmal!

    EDit: Bei den BCB Examples sind leider keine OGL Sachen dabei



  • Bei meinem BCB 5 sind Beispiele im Ordner ".../Examples/Open GL":
    - Drawing
    - Rotate
    Beide benutzten jedoch auch nur das Form->Handle.

    Ich denke, die Fehlermeldungen kommen daher, daß nur ein Formular ein eigenständiges Canvas besitzt (eine Paintbox benutzt auch nur das Formular-Canvas) und eine Bitmap nur eine Offline-Komponente darstellt (bin mir jedoch nicht sicher -)

    Evtl. bietet OpenGL ja selbständig eine Clipping-Methode an.



  • Hm komisch, ich hab BCB6, aber es nur Beispiele zu DirectDraw dabei...

    Also ich hab mal die Funktion etwas verändert, und zwar so:

    bool UseDoubleBuffer = true;
    HDC dc;
    HGLRC GLContext;
    
    HDC InitOpenGL(HDC Handle,bool UseDoubleBuffer)
    {
            PIXELFORMATDESCRIPTOR pfd;
    
            memset(&pfd,0,sizeof(pfd));
            pfd.nSize       = sizeof(PIXELFORMATDESCRIPTOR);
            pfd.nVersion    = 1;
            pfd.dwFlags     = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL;
            if(UseDoubleBuffer)
                    pfd.dwFlags |= PFD_DOUBLEBUFFER;
            pfd.iPixelType  = PFD_TYPE_RGBA;
            pfd.cColorBits  = 24;
            pfd.cDepthBits  = 32;
            pfd.iLayerType  = PFD_MAIN_PLANE;
    
            HDC dc = GetDC(Handle);
    
            int iPF = ChoosePixelFormat(Handle, &pfd);
            if(iPF == 0) ShowMessage("Fehler bei PixelFormat!");
    
            SetPixelFormat(Handle, iPF, &pfd );
            GLContext = wglCreateContext(Handle);
            if(GLContext) wglMakeCurrent(Handle, GLContext);
            else ShowMessage("MakeCurrent geht nich!");
            return dc;
    }
    

    Wenn ich sie jetzt mit

    dc = InitOpenGL(Form1->Canvas->Handle,UseDoubleBuffer);
    

    aufrufe, klappt auch alles, auch das Zeichnen.

    Nehme ich aber das Handle der PaintBox:

    dc = InitOpenGL(Form1->PaintBox1->Canvas->Handle,UseDoubleBuffer);
    

    kommt zwar keine Fehlermeldung, aber man sieht auch nichts...



  • I habe noch nicht viel mit OpenGL gemacht, aber ich hatte ein Beispiel, wo das Bild in einem Panel war, auf jeden Fall funktioniert es auch wo anderes als in einer Form (soweit ein pixelformat und eine color palette existiert). Auf jeden Fall mußt Du SwapBuffers(dc) in ScreenDraw benutzen und zuvor evtl. das Pixelformat und Color Palette für das Handl anpassen.
    Da dies aber nicht unbedingt BCB spezifisch ist, würde ich mal im Forum Spiele Programmierung fragen.



  • Ey cool, wenn ich ein Panel nehme, klappt's! 🙂
    danke für den tipp!



  • Powerpaule schrieb:

    Hm komisch, ich hab BCB6, aber es nur Beispiele zu DirectDraw dabei...

    ...\CBuilder6\Examples\OpenGL



  • Jansen schrieb:

    Powerpaule schrieb:

    Hm komisch, ich hab BCB6, aber es nur Beispiele zu DirectDraw dabei...

    ...\CBuilder6\Examples\OpenGL

    Gibt's bei mir nicht, hab auch nur Personal Edition, oder ich hab nicht alle Beispiele installieren lassen, wer weiß


Anmelden zum Antworten