OpenGL und BCB5



  • Ich weiss, dass dieses Thema eigentlich in die Spieleprogrammierung gehört. Trotzdem bin ich mir in dem Fall nicht sicher obs nicht doch hierhinein gehört.

    Quellcode:

    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #include <gl\gl.h>
    #include <gl\glu.h>
    #pragma hdrstop
    
    #include "Unit1.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    bool UseDoubleBuffer = true;
    HDC dc, DC;
    HGLRC GLContext;
    
    //---------------------------------------------------------------------------
    
    HDC InitOpenGL(HWND Handle, bool UseDoubleBuffer);
    void DrawScene();
    void CoordinateSystem(GLdouble x, GLdouble y, GLdouble z);
    
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
      CoordinateSystem(0, 0, 0);
    }
    //---------------------------------------------------------------------------
    
    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 ChoosePixelFormat");
    
      SetPixelFormat(dc, iPF, &pfd);
      GLContext = wglCreateContext(dc);
      if(GLContext)
        wglMakeCurrent(dc, GLContext);
      else
        ShowMessage("wglMakeCurrent nicht erfolgreich");
    
      return dc;
    }
    
    void __fastcall TForm1::FormDestroy(TObject *Sender)
    {
       ReleaseDC(Handle, dc);
       wglMakeCurrent(dc, NULL);
       wglDeleteContext(GLContext);
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::FormResize(TObject *Sender)
    {
      glMatrixMode(GL_PROJECTION);
      glLoadIdentity();
      GLdouble aspect = (double) ClientWidth / ClientHeight;
      gluPerspective(60, aspect, 1, 10);
      glMatrixMode(GL_MODELVIEW);
      DrawScene();
    }
    //---------------------------------------------------------------------------
    
    void DrawScene()
    {
      glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
      if(UseDoubleBuffer)
        SwapBuffers(dc);
      else
        glFlush();
    }
    
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::FormCreate(TObject *Sender)
    {
      DC = InitOpenGL(Form1->Handle, UseDoubleBuffer);
      glEnable(GL_DEPTH_TEST);
      glClearColor(1,1,1,1);
      glMatrixMode(GL_MODELVIEW);
      glTranslated(0,0,-2);        
    }
    //---------------------------------------------------------------------------
    
    void CoordinateSystem(GLdouble x, GLdouble y, GLdouble z)
    {
      GLfloat colRed[]   = {1,0,0};
      GLfloat colGreen[] = {0,1,0};
      GLfloat colBlue[]  = {0,0,1};
    
      glBegin(GL_LINES);
      glColor3fv(colRed);
        glVertex3d(-x,  0,  0);
        glVertex3d( x,  0,  0);
      glColor3fv(colGreen);
        glVertex3d( 0, -y,  0);
        glVertex3d( 0,  y,  0);
      glColor3fv(colBlue);
        glVertex3d( 0,  0, -z);
        glVertex3d( 0,  0,  z);
      glEnd();
      glBegin(GL_TRIANGLES);
        double h = 0.5;
        glColor3fv(colRed);
        glVertex3d(x-h,   h, 0);
        glVertex3d(x  ,   0, 0);
        glVertex3d(x-h,  -h, 0);
    
      glEnd();
    }
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
      exit(1);        
    }
    //---------------------------------------------------------------------------
    

    Schönheitsfehler hab ich bis jetzt noch nicht behoben. Aber vlt. kann mir jemand helfen. Hab das erste Mal versucht OpenGl - Komponeten zuverwenden. Mein Compiler meldet auch keine Fehlermeldungen. Jedoch bekomme ich nach dem compilieren nur die "Form" also das Fenster, aber ohne das darzustellende Koordinatensystem. Dieser quellcode stammt nicht von mir sondern damit wollte ich mir nur mal OpenGl in dem zusammenahng angucken.

    Hab ich irgendetwas vergessen ???



  • Im examples-Verzeichnis deiner BCB-Installation finden sich auch zwei lauffähige OpenGL-Beispiele, an denen du dich orientieren kannst.

    Und nächste Mal bitte die "C++"-CodeTags verwenden! 😉



  • So hab cpp tags verwendet

    Öhm also ist das obige Beispiel total falsch ?



  • Sieht so aus als ob dein handle nicht funktioniert.



  • Hm. So in der Art hab ich mir das auch gedacht. Kannste mir evtl. bissel helfen. Ich hab echt kA von OpenGl und BCB 5



  • Ich habe es so gelöst. Datei-->Neuer Frame dann: oben in der Komponentenleiste auf: Standard-->Frames und den Frame ins Form einfügen. Bei den OpenGL Sachen sich dann auf dieses Frame beziehen. Vielleicht hilft es dir.



  • unter www.rkaiser.de kannst du dir die Lösungen der Aufgaben aus dem Buch "C++ mit dem Borland Builder" herunterladen. Dort sind ein paar Lösungen dabei.



  • sorry, war quatsch was ich geschrieben habe. genau die lösungen stehn da nicht drin. im netz geistern aber ein paar nette opengl anleitungen für bcb herum. man hat auch schon pdf´s von rkaisers buch gesehen. dort steht definitiv etwas über die opengl-fenster-initialisierung drin. irgendwo habe ich auch mal eine freeware-opengl-komponente gesehen und auch benutzt. allerdings war diese nur für den bcb 4 und 5 geeignet.



  • jo. hab das buch hier liegen und daher kommen auch die bespiele. Trotzdem ist das hier nur abgetippt aus dem buch und irgendwie geht es nicht. Die pdf von dem buch is sogar auf der cd mitbeigefügt. Irgendwie schoin komisch das mit der pdf. Werd mir mal die Lödsung zu der aufgabe reinziehen.

    Würd mich trotzdem freuen wenn mir jemand sagen kann wo der fehler liegt, weil es ist nur abgetippt. Die aufgabe geht zwar in dem buch noch etwas weiter. Aber im Grunde sollte es doch funktionieren



  • hast du denn die sache mit dem frame auch so wie beschrieben gemacht? Das war bei mir der fehler.



  • ui sry das hab ich total überlesen werde es gleich mal ausprobieren mit den frames


Anmelden zum Antworten