glTexImage2D Problem



  • Hallo,

    ich habe folgendes Problem:
    Wenn ich mein kleines OpenGL Programm debugge, erscheint während es lädt immer folgende fehlermeldung:

    Eine Ausnahme (erste Chance) bei 0x6953888f in OpenGL.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0x038b1000.
    Unbehandelte Ausnahme bei 0x6953888f in OpenGL.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0x038b1000.
    

    Nach ein bisschen rumprobieren habe ich herausgefunden, dass es an folgender Zeile liegt:

    glTexImage2D(GL_TEXTURE_2D, 0, 3, texture[0].width, texture[0].height, 0, GL_RGB, GL_UNSIGNED_BYTE, texture[0].imageData)
    

    Die Textur wird mit dem TGALoader aus NeHe's Tutorial geladen.

    Das ich aber noch ein ziemlicher noob in solchen Sachen bin, habe ich keine Ahung woran das Problem liegt. Google konnte mir dabei diesmal auch nicht weiterhelfen.

    Ich hoffe mir kann einer helfen

    Gruß,
    openglnoob 😉



  • Ich würde mal schätzen dass texture[0].imageData ungültig oder zu klein ist oder sowas...



  • Das kann gut sein, das irgendwelche Bytes abgeschnitten werden oder so, hat auch google ausgespuckt.
    Doch was kann man anders machen, welche Alternativen gibt es?



  • Was für Alternativen suchst du denn? Es handelt sich um einen Fehler in deinem Programm. Die Lösung ist ihn zu finden und auszubessern.



  • Damit meinte ich Alternativen zu texture[0].imageData.
    Da das anscheinend nicht funktioniert, muss was anderes als Parameter dahin, ich weiß nur nicht was.



  • Ein Pointer auf einen Buffer der die Bilddaten im entsprechenden Format enthält.



  • Die Frage mag dumm klingen, aber wie genau stellt man das an?
    Mit fstream etc. habe ich es bisher nich nicht hinbekommen...



  • openglnoob schrieb:

    Die Frage mag dumm klingen, aber wie genau stellt man das an?
    Mit fstream etc. habe ich es bisher nich nicht hinbekommen...

    Was genau ist dein Problem? Was genau hast du mit fstream versucht?



  • Also die Datei geöffnet habe ich mit

    fstream pic;
    pic.open("testdatei");
    GLvoid * data = pic
    

    Dieser Code kann aber nicht einfach so alleine am Anfang des Projekts stehen, also habe ich ihn in LoadGLTextures() geschrieben. Da sind die die Variablen aber alle Lokal und bringen mir nichts. Wenn ich es in DrawGLScene() schreibe, muss ich erstens alle Dateinamen doppelt schreiben und funktionieren tut es auch nicht, wenn ich data dann als Parameter übergebe. Nach Buffer habe ich auch mal gegooglet und "streambuf" gefunden. Allerdings weiß ich nicht so rechts was ich damit anfangen soll, und aus dem Internet werde ich auch nicht schlau.



  • Der Buffer der gesucht wird ist ein einfaches Array, mit höhe*breite Einträgen, so dass jeder Eintrag einem Pixel entspricht und dessen Farbe enthält. Wenn du eine Bilddatei lesen willst musst du entsprechend des Formates versuchen an die ganzen Pixeldaten zu kommen. Das sollte der TGALoader machen aus dem Tutorial.



  • Ich habe gerade nochmal geguckt und das alles muss doch in texture[x].imageData sein. DOch genau das funktioniert nicht...



  • Sorry wegen Doppelpost aber hat keiner eine Lösung?
    Irgendwie muss man das Filtern ja hinbekommen...



  • Filtern?



  • Im NeHe Tutorial wird diese Funktion im zusammenhang mit dem Filtern erklärt..



  • Ja weil du beim Rendern Texturfilter verwendest, mit dem Laden der Textur und damit deinem Problem hat das aber nix zu tun...



  • Ok, ist das geklärt.
    Aber dennoch weiß ich immer noch nicht was ich falsch mache, bzw. was man anders machen muss, damit auch alle so läuft wie es soll. Aus google werde ich einfach nicht schlau.



  • Dann solltest du vielleicht von OpenGL noch etwas Abstand nehmen und erstmal die Grundlagen von C++ lernen...



  • Dem muss ich zustimmen.



  • Die Grundlagen kann ich schon lange...
    Wenn ich mich selbst daran versuche, kommt jedoch genau das selbe raus, wie es der TGALoader mit Texture.imageData tut.
    Hier nochmal der kurze Codeabschnitt:

    tga.bytesPerPixel	= (tga.Bpp / 8);
    tga.imageSize		= (tga.bytesPerPixel * tga.Width * tga.Height);
    texture->imageData	= (GLubyte *)malloc(tga.imageSize);
    


  • openglnoob schrieb:

    Also die Datei geöffnet habe ich mit

    fstream pic;
    pic.open("testdatei");
    GLvoid * data = pic
    

    Du rufst hier den Konvertierungsoperator operator void* auf. Der ist nur dazu gedacht, if (pic) schreiben zu können, aber sicher nicht, um an die Daten zu gelangen.

    Vielleicht solltest du auch binär lesen (mit std::ios::binary ). Die Kenntnis der Standardbibliothek würde ich übrigens auch zu den Grundlagen zählen...


Log in to reply