Problem mit TextureMapping in OpenGL (! Laden der Bitmap + Verwnden), Bitteum HILFE



  • hallo, ich beschaeftige mich gerade mit dem Tutorial von NeHE(deu) dort bin ich nun auf TextureMapping getroffen. ich habe folgendes problem. im tutorial wird das laden einer .bmp wie folgt beschrieben:

    AUX_RGBImageRec *LoadBMP(char *Filename) // Lädt ein BMP
    {
      FILE *File=NULL; // Das File Handle
    
      if (!Filename) 
      // Ist ein Dateiname übergeben worden?
    
      {
        return NULL; // offenbar nicht... Abbruch
      }
    
      File=fopen(Filename,"r"); 
      // Versuch die Datei zu öffnen
      if (File) // Existiert die Datei?
      {
        fclose(File); // Datei schließen
        return auxDIBImageLoad
    (Filename); 
        // BMP laden und Zeiger (Pointer) zurückgeben, 
        // der auf die Bilddaten verweist
      }
      return NULL; // Laden hat nicht geklappt
    }
    int LoadGLTextures() // Bitmaps laden und konvertieren
    {
      int Status=FALSE; 
      // Status ersteinmal auf FALSE setzen
    
      AUX_RGBImageRec *TextureImage[1]; 
      // Speicherplatz für die Textur schaffen
      memset(TextureImage,0,sizeof(void *)*1); 
      //Vorher sichergehen das dieser auch leer ist
    if (TextureImage[0]=LoadBMP("Data/codeworx.bmp"))
      // Bitmap laden
      {
        Status=TRUE; // hat geklappt
    glGenTextures(1, &texture[0]); // Textur wird erstellt
    
        glBindTexture(GL_TEXTURE_2D, texture[0]);
        //Es handelt sich um eine 2D Textur
    glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[0]->sizeX, 
                     TextureImage[0]->sizeY, 0, GL_RGB, 
                     GL_UNSIGNED_BYTE, TextureImage[0]->data);
    
    if (TextureImage[0]) // Existiert TextureImage[0]?
      {
        if (TextureImage[0]->data) // enthält sie Bilddaten?
        {
          free(TextureImage[0]->data); 
          // wenn ja, dann diese Bilddaten löschen
        }
        free(TextureImage[0]); 
        // Und auch die Struktur an sich löschen.
      }
    ...
    

    so folgendes problem stellt sich mir in den weg... der aufruf von " return auxDIBImageLoad ", scheiter bei mir, ich habe keine Ahnung wieso, denn ich habe die gl\glaux lib included, und ich denke mal bei BCB6 wird die doch dabeoi sein oder?... nunja da es denoch net ging habe ich mich im web nen bissel umgeschaut und ich habe gelesen das man ne .bmp logishcerweise auch mit LoadBitmap() holen kann, mein versuch sieht wie folgt aus:

    GLvoid LoadTexture() {
    
        HBITMAP hBitmap = LoadBitmap( hInstance, MAKEINTRESOURCE( IDT_BITMAP_001 ) );
    
        glGenTextures( 1, hBitmap );
        glBindTexture( GL_TEXTURE_2D, hBitmap );
        glTexImage2D( GL_TEXTURE_2D, 0, 3, 128, 128, 0, GL_RGB, GL_UNSIGNED_BYTE,
                      hBitmap );
        glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
        glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
    
    }
    

    folgende Fehler:

    [C++ Error] Unit1.cpp(68): E2034 Cannot convert 'void *' to 'unsigned int *'
    [C++ Error] Unit1.cpp(68): E2342 Type mismatch in parameter 'textures' (wanted 'unsigned int *', got 'void *')
    [C++ Error] Unit1.cpp(69): E2034 Cannot convert 'void *' to 'unsigned int'
    [C++ Error] Unit1.cpp(69): E2342 Type mismatch in parameter 'texture' (wanted 'unsigned int', got 'void *')
    

    irgendwie ist die loadbitmap() fkt. nich kompatibel oder? glGenTextures() und glBindTexture() verlangen einen unsigned int wert aber HBITMAP liefert da nur nen void* zurück, habs mal mit casten probiert ging irgendwie net... könntet ihr mir helfen wies richtig gehrt????

    danke...



  • Da hilft kein Casten! Du musst schlichtweg den Funktionen glBindTexture( ) und glTexImage2D( ) als jeweils letzten Parameter das geben, was sie erwarten (...und mit Sicherheit kein HBITMAP ist). Guck in die gl-Dokumentation.

    Greetz, Swordfish



  • das heisst also ich kann kein HBITMAP mit LoadBitmap() nutzen???



  • genau 😉
    auxDIBImageLoad liefert ein AUX_RGBImageRec*-Dingen zurück.
    LoadBitmap() ein HBITMAP.
    Das ist beides nicht kompatibel 😉

    typedef struct _AUX_RGBImageRec {
        GLint sizeX, sizeY;
        unsigned char *data;
    } AUX_RGBImageRec;
    

    Prinzipiell ist AUX_RGBImageRec ja scheinbar nur ne Struktur die befüllt werden müsste. Aber ich würde trotzdem lieber statt selber nachbauen versuchen glaux ans laufen zu kriegen...



  • bzw. knn ich es so machen... es wird jedenfalls kein fehler angezeigt.

    GLvoid LoadTexture() {
    
    GLuint texture;
    
        texture = (unsigned int)  LoadBitmap( hInstance, MAKEINTRESOURCE( IDT_BITMAP_001 ) );
    
        glGenTextures( 1, &texture );
        glBindTexture( GL_TEXTURE_2D, texture );
        glTexImage2D( GL_TEXTURE_2D, 0, 3, 128, 128, 0, GL_RGB, GL_UNSIGNED_BYTE,
                      &texture );
        glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
        glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
    }
    


  • Ich wäre verwundert wenn es funktioniert 😮
    LoadBitmap() gibt nur ein Handle zurück, keine konkreten Bilddaten...

    btw. ich würde mich von nem mod ins "Spiele-/Grafikprogrammierung"-Board schieben lassen, da lungern die OpenGL und DirectX Spezis 😉



  • hehe jo wer net wenn des wer taette gg.... aba kannsu mir net mal nen bsp. schnippsel posten wie du des machen wuerdest?? ich habe ne .rc datei noch eingebunden mit IDT_BITMAP_001 BITMAP "bitmap1.bmp" ....



  • wenn ich des nach art von NeHe machen bekomm ich immer nen fehler:

    [Linker Error] Unresolved external 'auxDIBImageLoadA' referenced from C:\PROGRAMME\BORLAND\CBUILDER6\PROJECTS\UNIT1.OBJ
    

    was mach ich nun???



  • Hast du die <gl/glaux.h> eingebunden und gegen die glaux.lib gelinkt?

    BTW:

    http://members.cox.net/scottheiman/opengl.htm schrieb:

    GLAUX

    I have never used GLAUX so please do not send me any questions about it.

    The OpenGL libraries contain a set of auxiliary windows functions defined in glaux.h that allow you to write OpenGL applications that will compile, link, and run on both a PC and a SGI workstation. Unfortunately, the GLAUX.LIB file that comes with Borland C++ 5.0x will not link with your application.

    I have seen two remedies posted in the Borland and OpenGL newsgroups.

    1. The GLAUX.LIB source is contained in MS's Win32 SDK (actually, it's the Multimedia Extensions SDK). If this is true then you should be able build a Borland compatible version from it. Ronald Praver has created a Borland compatible GLAUX.LIB file that you can download from his web site. I assume that he used the SDK source to build the library.

    2. Use the glaux.lib that came with BC++ 4.5. I have never tried this so I can't say that it WILL work.

    GLAUX has known memory leaks and should not be used for application development. The only reason for listing Mr. Praver's web site is because some tutorials on the Internet use GLAUX functions, particularly, the auxRGBImageLoad and auxDIBImageLoad functions. I strongly suggest that you do not use these functions for applications that you develop. There are several libraries on the Internet that you can use to load images into OpenGL. Several can be found on www.sourceforge.net. My BMGLib library can be used as well.

    Greetz, Swordfish


Anmelden zum Antworten