kostenloser Webspace werbefrei: lima-city


Problem mit modernem OpenGL und Windows...

lima-cityForumProgrammiersprachenC/C++ und D

  1. Autor dieses Themas

    noxious

    Kostenloser Webspace von noxious

    noxious hat kostenlosen Webspace.

    Hallo!

    Also ich versuche mich in letzter Zeit ein wenig in C++ und OpenGL rein zu arbeiten. Nun habe ich aber keine Lust, mit dem uraltem, obsoletem OpenGL 1.0 zu arbeiten, sondern möchte gerne eine aktuellere Version nutzen. ( OpenGL 3 und aufwärts. ) Problematisch wird das ganze dann, wenn ich versuche, ein Beispielprojekt zu kompilieren. Dann bekomme ich solch schöne Fehlermeldungen wie
    error: 'glGenVertexArrays' was not declared in this scope

    Nachdem ich nun eine weile lang im Netz gesucht habe, bin ich nun so weit, dass fest steht: Es liegt an fehlenden Header-Dateien. Von sich aus nutzt Windows wohl nur die Uralt-Header, wo dann so hübsche Funktionen wie
    glGenVertexArrays
    nicht enthalten sind.

    Ich habe also weiter gegoogelt und heraus gefunden, dass man da wohl entweder Glew oder gl3w benötigt.
    Dadurch eröffneten sich nun aber weitere Probleme. Bei gl3w scheint das Problem zu sein, dass das Python-Script, welches die Header-Datei generieren sollte, entweder nicht oder nicht mehr funktioniert.
    Bei Glew muss man sich das wohl selbst kompilieren, wobei ich keine Ahnung habe, wie ich das anfange. Es gab dafür einige Anleitungen im Netz, welche entweder veraltet oder Lückenhaft waren. MSys installieren, Dateien entpacken, Befehl bei Msys eingeben... Funktioniert natürlich nicht, da MSys die entpackten Dateien nicht gefunden hat. Dumm gelaufen.

    Also zu meiner Frage:
    Kennt sich jemand damit aus und kann mir möglichst genau erklären, was ich wann genau machen muss?

    Ein paar Erläuterungen: Ich nutze Windows 7 , MingW als Compiler ( Code::Blocks als IDE ) ... Ich glaube das sollte so an Eckdaten reichen,
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Hallo noxious,

    von glew kann man sich auch bereits kompilierte Binaries runterladen:
    http://glew.sourceforge.net/
    Gleich im grauen Kasten in der Mitte ("Binaries Windows 32-bit and 64-bit").
    Eine ausführliche Anleitung findest Du hier:
    http://surflab.cise.ufl.edu/wiki/Getting_Started_with_OpenGL_in_VisualC%2B%2B_2010
  4. Autor dieses Themas

    noxious

    Kostenloser Webspace von noxious

    noxious hat kostenlosen Webspace.

    darkpandemic schrieb:
    Hallo noxious,

    von glew kann man sich auch bereits kompilierte Binaries runterladen:
    http://glew.sourceforge.net/
    Das kann man. Aber...

    darkpandemic schrieb:
    Gleich im grauen Kasten in der Mitte ("Binaries Windows 32-bit and 64-bit").
    Eine ausführliche Anleitung findest Du hier:
    http://surflab.cise.ufl.edu/wiki/Getting_Started_with_OpenGL_in_VisualC%2B%2B_2010
    ... das Problem ist halt, dass ich kein Visual-Studio, sondern - wie oben erwähnt - MingW benutze. MingW kann offenbar mit den Binaries für Visual Studio wenig anfangen. ( Klingt für mich einleuchtend. )

    Und wie schon gesagt: Ich habe schon ganz erheblich nach einer Lösung in Form von Anleitungen gesucht. Und wenn ich nicht alles komplett falsch mache, sind diese nahezu alle Lückenhaft oder veraltet.
  5. Hallo noxious,

    bei MinGW/GCC kannst Du die fertigen Dlls einfach wie *.o Dateien an den Linker übergeben.
    D.h. Du benötigst bei GCC die *.a Datei nicht unbedingt.
    Hier ein Beispiel:
    g++ -o example_exe.exe example_exe.o example_dll.dll

    [Quelle: http://www.mingw.org/wiki/sampleDLL]

    Edit:

    Ich habe die Sache jetzt mal durchgespielt mit freeglut und glew.
    freeglut für MinGM habe ich von hier: http://www.transmissionzero.co.uk/software/freeglut-devel/
    glew für MinGW habe ich von hier: http://julianibarz.wordpress.com/2010/05/12/glew-1-5-4-mingw32/
    Mit den beiden ist das Vorgehen dann folgendermaßen:
    1.  Neues Projekt erstellen (Console oder Win32 Gui mit Frame)
    2.  Im Projektverzeichnit (d.h. dort wo die *.cbp Datei liegt) noch die Ordner 
        'glew', 'freeglut', 'dlls' und 'libs' erstellen
    3.  Die Dateine aus 'freeglut\include\GL' in das erstellte 'freeglut' 
        Verzeichnis kopieren.
    4.  Die Datei freeglut.a aus 'freeglut\lib' in das 'libs' Verzeichnis kopieren.
    5.  Die Datei freeglut.dll aus 'freeglut\dll' in das 'dlls' Verzeichnis 
        kopieren.
    6.  Die Dateine aus 'glew\include\GL' in das erstellte 'glew' Verzeichnis 
        kopieren.
    7.  Die Datei glew32.dll.a aus 'glew\lib' in das 'libs' Verzeichnis kopieren.
    8.  Die Datei glew32.dll aus 'glew\lib' in das 'dlls' Verzeichnis kopieren.
    9.  Im Menü 'Projects->Add files recursively...' klicken, das Projektverzeichnis
        auswählen und 'Ok' klicken.
        Die Header aus dem freeglut und glew Unterordnern sollten nun im Projektbaum
    	unter Headers zu finden sein.
    10. Im Menü 'Projects->Properties' wählen und im erscheinenden Dialog im Reiter 
        'Build Targets' sowohl für Release als auch Debug den Typ auf 
        'GUI application' stellen und mit 'Ok' bestätigen.
    11. Im Menü 'Projects->Build Options' klicken und im erscheinenden Dialog sowohl
        für Release als auch Debug folgendes machen:
    12. Im Reiter 'Linker settings' folgende Zeilen zur Liste 'Link libraries' 
        hinzufügen:
          libs\freeglut.a
          libs\glew32.dll.a
          opengl32
    13. Im Reiter 'Pre/Post build steps' im Feld 'Post-build steps' folgende Zeilen 
        einfügen:
          cmd /c copy "$(PROJECT_DIR)dlls\glew32.dll" "$(TARGET_OUTPUT_DIR)"
          cmd /c copy "$(PROJECT_DIR)dlls\freeglut.dll" "$(TARGET_OUTPUT_DIR)"
    14. Mit 'Ok' bestätigen.

    In die main.cpp habe ich dann folgenden Beispielcode gepackt und es lief damit:
    #include <stdio.h>
    #include <stdlib.h>
    
    #include "glew/glew.h"
    #include "freeglut/glut.h"
    
    GLuint program;
    GLint attribute_coord2d;
    
    int init_resources(void)
    {
      GLint compile_ok = GL_FALSE, link_ok = GL_FALSE;
    
      GLuint vs = glCreateShader(GL_VERTEX_SHADER);
      const char *vs_source =
        "#version 120\n"
        "attribute vec2 coord2d;                  "
        "void main(void) {                        "
        "  gl_Position = vec4(coord2d, 0.0, 1.0); "
        "}";
      glShaderSource(vs, 1, &vs_source, NULL);
      glCompileShader(vs);
      glGetShaderiv(vs, GL_COMPILE_STATUS, &compile_ok);
      if (0 == compile_ok)
      {
        fprintf(stderr, "Error in vertex shader\n");
        return 0;
      }
    
      GLuint fs = glCreateShader(GL_FRAGMENT_SHADER);
      const char *fs_source =
        "#version 120           \n"
        "void main(void) {        "
        "  gl_FragColor[0] = 0.0; "
        "  gl_FragColor[1] = 0.0; "
        "  gl_FragColor[2] = 1.0; "
        "}";
      glShaderSource(fs, 1, &fs_source, NULL);
      glCompileShader(fs);
      glGetShaderiv(fs, GL_COMPILE_STATUS, &compile_ok);
      if (!compile_ok) {
        fprintf(stderr, "Error in fragment shader\n");
        return 0;
      }
    
      program = glCreateProgram();
      glAttachShader(program, vs);
      glAttachShader(program, fs);
      glLinkProgram(program);
      glGetProgramiv(program, GL_LINK_STATUS, &link_ok);
      if (!link_ok) {
        fprintf(stderr, "glLinkProgram:");
        return 0;
      }
    
      const char* attribute_name = "coord2d";
      attribute_coord2d = glGetAttribLocation(program, attribute_name);
      if (attribute_coord2d == -1) {
        fprintf(stderr, "Could not bind attribute %s\n", attribute_name);
        return 0;
      }
    
      return 1;
    }
    
    void free_resources()
    {
      glDeleteProgram(program);
    }
    
    void on_display()
    {
      /* Clear the background as white */
      glClearColor(1.0, 1.0, 1.0, 1.0);
      glClear(GL_COLOR_BUFFER_BIT);
    
      glUseProgram(program);
      glEnableVertexAttribArray(attribute_coord2d);
      GLfloat triangle_vertices[] = {
         0.0,  0.8,
        -0.8, -0.8,
         0.8, -0.8,
      };
      /* Describe our vertices array to OpenGL (it can't guess its format automatically) */
      glVertexAttribPointer(
        attribute_coord2d, // attribute
        2,                 // number of elements per vertex, here (x,y)
        GL_FLOAT,          // the type of each element
        GL_FALSE,          // take our values as-is
        0,                 // no extra data between each position
        triangle_vertices  // pointer to the C array
      );
    
      /* Push each element in buffer_vertices to the vertex shader */
      glDrawArrays(GL_TRIANGLES, 0, 3);
      glDisableVertexAttribArray(attribute_coord2d);
    
      /* Display the result */
      glutSwapBuffers();
    }
    
    int main(int argc, char* argv[])
    {
      glutInit(&argc, argv);
      glutInitDisplayMode(GLUT_RGBA|GLUT_DOUBLE|GLUT_DEPTH);
      glutInitWindowSize(640, 480);
      glutCreateWindow("My First Triangle");
    
      GLenum glew_status = glewInit();
      if (glew_status != GLEW_OK)
      {
        fprintf(stderr, "Error: %s\n", glewGetErrorString(glew_status));
        return EXIT_FAILURE;
      }
    
      if (1 == init_resources())
      {
        glutDisplayFunc(on_display);
        glutMainLoop();
      }
    
      free_resources();
      return EXIT_SUCCESS;
    }


    Beitrag zuletzt geändert: 7.12.2013 12:15:49 von darkpandemic
  6. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!