2017-04-02 1 views
0

Ich habe diesen Fehler noch nie zuvor gesehen und ich verwende glTexImage2D an anderer Stelle im Projekt ohne Fehler. Nachstehend ist ein Screenshot von dem, was Visual Studio zeigt Fehler, und ein Blick auf die Demontage: Frame not in module Disassembly code"Frame nicht im Modul" bei der Verwendung von glTexImage2D

die Linie gegeben hat ptr darin gehe ich davon ein Zeiger Fehler ist, aber ich weiß nicht, was ich tue falsch. Unten ist die Funktion, die ich von einer SDL_surface in eine Textur konvertieren.

void surfaceToTexture(SDL_Surface *&surface, GLuint &texture) { 
    glEnable(GL_TEXTURE_2D); 
    glGenTextures(1, &texture); 
    glBindTexture(GL_TEXTURE_2D, texture); 

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 

    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, surface->w, surface->h, 0, GL_BGRA, GL_UNSIGNED_BYTE, surface->pixels); 
    glDisable(GL_TEXTURE_2D); 
} 

Diese Funktion erfolgreich an anderer Stelle im Programm, zum Beispiel beim Laden von Text:

SDL_Surface *surface; 
surface = TTF_RenderText_Blended(tempFont, message.c_str(), color); 
if (surface == NULL) 
    printf("Unable to generate text surface using font: %s! SDL_ttf Error: %s\n", font.c_str(), TTF_GetError()); 
else { 
    SDL_LockSurface(surface); 
    width = surface->w; 
    height = surface->h; 
    if (style != TTF_STYLE_NORMAL) 
     TTF_SetFontStyle(tempFont, TTF_STYLE_NORMAL); 
    surfaceToTexture(surface, texture); 
    SDL_UnlockSurface(surface); 
} 
SDL_FreeSurface(surface); 

Aber nicht, wenn ein Bild geladen:

SDL_Surface* surface = IMG_Load(path.c_str()); 
if (surface == NULL) 
    printf("Unable to load image %s! SDL_image Error: %s\n", path.c_str(), IMG_GetError()); 
else{ 
    SDL_LockSurface(surface); 
    width = (w==0)?surface->w:w; 
    height = (h==0)?surface->h/4:h; 
    surfaceToTexture(surface, texture); 
    SDL_UnlockSurface(surface); 
} 
SDL_FreeSurface(surface); 

Beiden Beispiele aus einer Klasse extrahiert werden, wo texture ist definiert. Der Pfad zum Bild ist korrekt. Ich weiß, es ist glTexImage2D, dass das Problem verursacht, wie ich einen Breakpoint am Anfang von surfaceToTexture hinzugefügt und durch die Funktion. Selbst wenn es nicht funktioniert, haben texture und surface scheinbar korrekte Werte/Eigenschaften.

Irgendwelche Ideen?

+1

Sind Sie sicher, dass das Pixelformat Ihres Bildes BGRA ist (oder mindestens 4 Bytes pro Pixel?) – keltar

+0

@keltar Guter Schrei Ich hatte das nicht überprüft, werde es tun, wenn ich wieder zu Hause bin. Ich erinnere mich daran, BGRA zu RGBA zu ändern, was zu einem anderen Fehler führte, einige pdb nicht geladen, Gedanken ?. – jaunt

+1

BGRA/RGBA ist eine andere Reihenfolge, also wird es zu einer deformierten Farbe führen. Bytes pro Pixel ist das gleiche obwohl. Aber wenn Ihr Bild RGB/BGR ist, aber Sie GL gesagt haben, ist es BGRA - es ist eine ganz andere Sache; es wird entweder Mülldaten erhalten oder abstürzen. – keltar

Antwort

1

Der Fehler, den Sie erhalten, bedeutet, dass die Prozedur in einem Codeabschnitt abgestürzt ist, für den der Debugger keinerlei Debugging-Informationen (Zuordnung zwischen Assembly und Quellcode) finden konnte. Dies ist normalerweise der Fall für alles, was Teil eines Debugbuilds Ihres Programms ist.

Jetzt in Ihrem Fall, was passiert ist, dass Sie glTexImage2D mit Parametern aufgerufen haben, die es über das Speicherlayout des Puffers "lügen", auf den Sie es mit dem Parameter data zeigten. Pointer tragen keine aussagekräftigen Metainformationen (was die Assembly-Ebene betrifft, sie sind nur eine andere ganze Zahl mit besonderer Bedeutung). Sie müssen also sicherstellen, dass alle Parameter, die Sie zusammen mit einem Zeiger an eine Funktion übergeben, übereinstimmen. Wenn nicht, irgendwo tief im Inneren dieser Funktion, oder was auch immer sie ruft (oder welche Aufrufe usw.), kann auf den Speicher in einer Weise zugegriffen werden, die durch das Betriebssystem verursachte Beschränkungen verletzt und diese Art von Absturz auslöst.

Lösung für Ihr Problem: Korrigieren Sie Ihren Code, d. H. Stellen Sie sicher, dass das, was Sie an OpenGL übergeben, konsistent ist. Es stürzt innerhalb des OpenGL-Treibers ab, aber nur, weil Sie damit gelogen haben.

+0

Wow, danke für die Einsicht, aber warum funktioniert es mit einer Textoberfläche? Das würde doch auch nicht funktionieren. – jaunt

+1

@jaunt: Sie rufen 'glTexImage2D' mit einem Formatparameter von' GL_RGBA' auf, d. H. 4 Kanäle pro Pixel.Wenn die geladene Schriftoberfläche mit der übereinstimmt, wird es funktionieren; Ein weiterer wichtiger Teil sind die pixel store unpack-Parameter, die mit 'glPixelStorei' gesetzt werden. Dies sind effektiv andere Parameter, die in' glTexImage' gehen. Sie müssen wirklich sicherstellen, dass alles, was zu dieser Funktion gehört, übereinstimmt. Wenn nicht, kann es zum Absturz kommen. Und die Standardparameter können zufällig mit dem übereinstimmen, was übergeben wird. Nur weil es irgendwann funktioniert, heißt das nicht, dass es funktioniert, weil alles richtig gemacht wird. – datenwolf

+0

Das macht Sinn, also stellt sich heraus, dass das Bildpixelformat nicht wirklich "GL_BGRA" war und in irgendeinem bizarren Format war. Ich bin überrascht, dass ein Fehler dadurch nicht ausgelöst wurde. Vielen Dank für Ihre Hilfe – jaunt

Verwandte Themen