2017-04-02 1 views
0

これまでにこのエラーに遭遇したことはなく、glTexImage2Dをエラーなしでプロジェクトのどこかで使用しています。ラインは、私はポインタエラーがありますと仮定しますが、私は私がやっているかわからない、それでptrを持って考えると Frame not in module Disassembly codeglTexImage2Dを使用しているときに「フレームがモジュールではありません」

:以下は、どのようなエラーのVisual Studioショーのスクリーンショット、および分解の図です。違う。 以下はSDL_surfaceからテクスチャに変換するために使用する関数です。

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); 
} 

テキストロードする場合、この機能は、例えば、プログラムの他の場所で成功:

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); 

ではなく、画像読み込み時:

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); 

の両方の例がどこのクラスから抽出さをtextureが定義されています。 イメージへのパスが正しいです。 surfaceToTextureの先頭にブレークポイントを追加して機能を実行したときに問題が発生するのは、glTexImage2Dです。 動作しなくても、texturesurfaceは一見正しい値/プロパティを持っています。

アイデア?

+1

イメージのピクセル形式はBGRA(または少なくとも1ピクセルあたり4バイトですか?)ですか? – keltar

+0

@keltar良い叫び私はそれをチェックしていませんでした。私はBGRAをRGBAに変更して、別のエラーになったことを思い出しました.pdbには読み込まれなかったものがいくつかありましたか? – jaunt

+1

BGRA/RGBAは異なる順番ですので、変形した色になります。 1ピクセルあたりのバイト数は同じです。しかし、あなたの画像がRGB/BGRですが、GLにBGRAと言えば、それは全く違うものです。ゴミデータやクラッシュが発生します。 – keltar

答えて

1

エラーは、デバッガがデバッグ情報(アセンブリとソースコードの関連付け)を見つけられなかったコードのセクション内でプロセスがクラッシュしたことを意味します。これは通常、/あなたのプログラムのデバッグビルドに含まれるものの場合です。

あなたのケースでは、dataパラメータで指定したバッファのメモリレイアウトについて、glTexImage2Dにパラメータがあります。ポインタは意味のあるメタ情報を持ちません(アセンブリレベルに関する限り、それらは特別な意味を持つ別の整数です)。だから、ポインタに沿って関数に渡すすべてのパラメータが一致するようにする必要があります。もしそうでなければ、その機能のボウズのどこかに、あるいはそれが呼び出されたもの(あるいはその呼び出しなど)に、オペレーティングシステムによって設定された制約に違反してメモリがアクセスされ、そのようなクラッシュが引き起こされます。

解決方法:コードを修正してください。つまり、OpenGLに渡すものが一貫していることを確認してください。 OpenGLドライバでクラッシュしますが、それはあなたが嘘をついたからです。

+0

洞察力のためにうわーありがとう、なぜそれがテキストの表面で動作するのですか?確かにそれはどちらもうまくいかないでしょうか? – jaunt

+1

@jaunt:形式パラメータがGL_RGBA、つまり1ピクセルあたり4チャンネルの 'glTexImage2D'を呼び出しています。読み込まれたフォントサーフェスが一致した場合、それは動作します。別の重要な部分は、 'glPixelStorei'で設定されたピクセルストアアンパックパラメータであり、' glTexImage'に入るパラメータのセットです。あなたは実際にその機能に入るすべてが一致することを確認する必要があります。そうでないとクラッシュする可能性があります。また、デフォルトのパラメータは、渡されたものと偶然一致することがあります。ちょうどそれがある時点で機能しているということは、すべてが正しく行われているために機能するという意味ではありません。 – datenwolf

+0

それは理にかなっているので、イメージピクセルフォーマットは実際には 'GL_BGRA'ではなく、幾分奇妙な形式でした。私はそれによって投げられなかったエラーが驚いています。 – jaunt

関連する問題