OpenGL-Fensterinitialisierung



  • Ich habe ein Problem mit dem Initialisieren eines Fensters in OpenGL.
    Es wird immer der Fehler zuürckgegeben, dass das Fenster nicht erstellt worden konnte.

    Das gesamte Projekt findet ihr unter: http://www.djs4life.de/HelloOGL.zip

    Edit:
    Bitte aussagekräftige Überschriften wählen. Danke!

    [ Dieser Beitrag wurde am 04.07.2003 um 05:45 Uhr von Jansen editiert. ]



  • Servus,

    hier mal mal ein Grundgerüst für eine OpenGl Anwendung mit dem C++ Builder

    nimm ein neues Projekt und baue es folgendermaßen auf.

    in die *.h Datei

    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include <Forms.hpp>
    #include <ExtCtrls.hpp>
    #include <gl/gl.h>
    #include <gl/glu.h>
    class TForm1 : public TForm
    {
    __published:    // Von der IDE verwaltete Komponenten
            void __fastcall FormCreate(TObject *Sender);
            void __fastcall FormDestroy(TObject *Sender);
            void __fastcall FormResize(TObject *Sender);
            void __fastcall FormKeyPress(TObject *Sender, char &Key);
    
    private:    // Anwender-Deklarationen
    
    public:     // Anwender-Deklarationen
            __fastcall TForm1(TComponent* Owner);
    
            void __fastcall IdleLoop(TObject*, bool&);
            void __fastcall RenderGLScene();
            void __fastcall SetPixelFormatDescriptor();
            void __fastcall SetupRC();
    };
    extern PACKAGE TForm1 *Form1;
    

    in die *.cpp Datei

    ////////////////////////////////////////////////////////////////////////////////
    //       Dies ist ein Grundgerüst für eine OpenGL Anwendung mit dem           //
    //                         Borland C++ Builder                                //
    ////////////////////////////////////////////////////////////////////////////////
    #include <vcl.h>
    #pragma hdrstop
    #include "main.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
     Application->OnIdle = IdleLoop;
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::IdleLoop(TObject*, bool& done)
    {
     done = false;
     RenderGLScene();
     SwapBuffers(hdc);
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::RenderGLScene()
    {
    
      //Hier die OpenGL einfügen
    
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::FormCreate(TObject *Sender)
    {
      // Application->MessageBox("Tasten 1 - 5 und +/- zum steuern","Wichtig");
        hdc = GetDC(Handle);
        SetPixelFormatDescriptor();
        hrc = wglCreateContext(hdc);
        wglMakeCurrent(hdc, hrc);
        SetupRC();
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::SetupRC()
    {
        glClearColor(0.0f, 0.0f, 0.0f, 0.0f);                          //Farbe des Fenters  letzter Wert ist ALPHA-Faktor(Blendung)
        glClear(GL_COLOR_BUFFER_BIT);                                  //OpenGl Oberfläche löschen
        glFlush();                                                     
    }
    //--------------------------------------------------------------------------
    void __fastcall TForm1::FormDestroy(TObject *Sender)              //alles von OpenGl wieder freigeben
    {
        ReleaseDC(hdc,hrc);
        wglMakeCurrent(hdc, NULL);
        wglDeleteContext(hrc);
    }
    //--------------------------------------------------------------------------- //
    void __fastcall TForm1::SetPixelFormatDescriptor()                            // Standard -->muss immer da sein
    {                                                                             //
        PIXELFORMATDESCRIPTOR pfd = {                                             //
            sizeof(PIXELFORMATDESCRIPTOR),                                        //
            1,                                                                    //
            PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER,           //
            PFD_TYPE_RGBA,                                                        //
            24,              //24/16/8/4 Bit                                      //
            0,0,0,0,0,0,                                                          //
            0,0,                                                                  //
            0,0,0,0,0,                                                            //--> muss alles so sein (Standard in OpenGl)
            32,     //32bit Farbtiefe                                             //
            0,                                                                    //
            0,                                                                    //
            PFD_MAIN_PLANE,                                                       //
            0,                                                                    //
            0,0,0                                                                 //
            };                                                                    //
        PixelFormat = ChoosePixelFormat(hdc, &pfd);                               //
        SetPixelFormat(hdc, PixelFormat, &pfd);                                   //
    }                                                                             //
    //--------------------------------------------------------------------------- //
    void __fastcall TForm1::FormResize(TObject *Sender)
    {
        GLfloat nRange = 200.0f;
        glViewport(0, 0, ClientWidth, ClientHeight); 
        glMatrixMode(GL_PROJECTION); 
        glLoadIdentity();
        if (ClientWidth <= ClientHeight)
           glOrtho(-nRange, nRange, -nRange*ClientHeight/ClientWidth, 
                    nRange*ClientHeight/ClientWidth, -nRange, nRange); 
        else 
           glOrtho(-nRange*ClientWidth/ClientHeight, nRange*ClientWidth/ClientHeight, 
                    -nRange, nRange, -nRange, nRange);
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
    }
    //---------------------------------------------------------------------------
    


  • Ein Verweis auf die beim BCB mitgelieferten OpenGL-Beispiele hätte es nicht getan? Denn offensichtlich stammt dein Code doch aus genau diesen Beispielen!?



  • ich starte mal einfach keinen neuen thread sondern stell meine frage in diesen thread 🙂

    ich frage mich, ob man die initialisierung noch etwas optimieren kann (ich nutze die obere initialisierung fast 1 zu 1)! ich habe nämlich das problem, dass mein programm etwas zuckelt und ich nicht weiß, wie ich es weiter optimieren kann! die berechnungen laufen schon optimal (also meiner meinung nach)!

    leider kenn ich mich halt nicht so gut mit opengl aus! also meine frage: kann ich den code noch etwas optimieren? und wie?



  • source



  • Hier kann man sich das programm mit einer beispieldatei und einem code-auszug (die opengl-initialisierung) ziehen! ist ca. 900 kb groß!



  • ich schaus mir mal an 😕



  • bitte so compilieren das man es auf kriegt ..
    sourcen wären besser da .. ich nicht sehr viel vertrauen in tüftler hab .. 🙄



  • 1ntrud0r schrieb:

    bitte so compilieren das man es auf kriegt ..
    sourcen wären besser da .. ich nicht sehr viel vertrauen in tüftler hab .. 🙄

    ich verstehe jetzt leider nicht so recht, was du von mir möchtest 🙂 also du kannst die datei so entpacken und die exe-datei so starten! du brauchst keine zusätzlichen dlls oder sonstiges...

    den code zur initialisierung von opengl poste ich hier einfach mal rein:

    __fastcall TFrMain::TFrMain(TComponent* Owner)
            : TForm(Owner)
    {
      GetOpenGLRC();                    // passende Eigenschaften suchen
       if(OpenGLCap)
         readyToDraw = true;
       else {
         readyToDraw = false;
    		  MessageBox(NULL, "Exit program !"
                          "No OpenGL capabilities found.",
                          "Error", MB_OK);
       }
       bv.MBL = false;
       bv.MBM = false;
       bv.MBR = false;
       bv.BreFileLoaded = false;
       bv.CadFileLoaded = false;
       bv.FirstStart = true;
       bv.firstload = true;
       bv.zminmax = false;
    }
    //---------------------------------------------------------------------
    // OpenGL mit Fenster verbinden
    //---------------------------------------------------------------------
    void  __fastcall TFrMain::GetOpenGLRC()
    {
      OpenGLCap = false;                 // OpenGL-Faehigkeit wird nicht erwartet
    
      PIXELFORMATDESCRIPTOR pixelFormat =
      {
    			sizeof(PIXELFORMATDESCRIPTOR),  // Size of this structure
       	1,                              // Version of this structure
         PFD_SUPPORT_OPENGL |            // Support OpenGL calls in window
         PFD_DRAW_TO_WINDOW |            // Draw to Window (not to bitmap)
         PFD_DOUBLEBUFFER,               // Double buffered mode
         PFD_TYPE_RGBA,                  // RGBA Color mode
         16,                             // prefered color depth
         0, 0, 0, 0, 0, 0,               // color bits (ignored)
         0,                              // no alpha buffer
         0,                              // alpha bits (ignored)
         0,                              // no accumulation buffer
         0, 0, 0, 0,                     // accum bits (ignored)
         16,                             // Size of depth buffer
         0,                              // no stencil buffer
         0,                              // no auxiliary buffers
         PFD_MAIN_PLANE,                 // Draw in main plane (main layer)
         0,                              // reserved (fuer schlechte Zeiten ;-))
         0, 0, 0  };                     // no layer, visible, damage masks
    
      // Handle ist vom Eltern-Widget
      winDeviceContext = GetDC( Handle );
    
      // Schau'n, ob man die gewuenschten Eigenschaften bekommt
      int pixelFormatNr = ChoosePixelFormat( winDeviceContext,
      																		   &pixelFormat);
      if( pixelFormatNr == 0 )  {
      		MessageBox(NULL, "ChoosePixelFormat() failed:  "
                   	     "Cannot find a suitable pixel format.",
                     	   "Error", MB_OK);
      }
      // ansonsten versuchen, das Ding zu setzen
      else if( SetPixelFormat( winDeviceContext,
      													pixelFormatNr,
                               &pixelFormat      ) == FALSE )  {
    		 MessageBox(NULL, "SetPixelFormat() failed:  "
                         "Cannot set format specified.",
                         "Error", MB_OK);
      }
    	 else {                               // wir haben was passendes gefunden
      	 // endgueltig verbinden
        glRenderingContext = wglCreateContext( winDeviceContext );
        wglMakeCurrent( winDeviceContext, glRenderingContext );
    
        // die Faehigkeit festhalten und auf DoubleBuffer checken
        OpenGLCap = true;
    		 doubleBuffer = true; // pauschale Annahme
    	 }
      //glDepthFunc(GL_LESS);
      glEnable(GL_DEPTH_TEST);
      CBRotFac->ItemIndex = 0;
    }
    //---------------------------------------------------------------------------
    


  • Hoeen schrieb:

    ich verstehe jetzt leider nicht so recht, was du von mir möchtest 🙂 also du kannst die datei so entpacken und die exe-datei so starten! du brauchst keine zusätzlichen dlls oder sonstiges...

    nein ich leider nicht ... da du die runtime library vermutlich nicht statisch gelinkt hast.



  • 1ntrud0r schrieb:

    nein ich leider nicht ... da du die runtime library vermutlich nicht statisch gelinkt hast.

    jo, hattest recht! inzwischen liegt ne neue datei auf dem webspace! kannst ja nochmal versuchen...


Anmelden zum Antworten