2017-04-02 30 views
0

我從來沒有遇到過這個錯誤,我在項目中的其他地方使用了glTexImage2D,沒有錯誤。下面是一個什麼樣的錯誤的Visual Studio顯示截圖,並拆卸的觀點: Frame not in module Disassembly code使用glTexImage2D時出現「框不在模塊中」

給出的行中有ptr我假設有一個指針錯誤,但我不知道我在做什麼錯誤。 以下是我用於將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。 圖像的路徑是正確的。 我知道這是glTexImage2D導致的問題,因爲我在surfaceToTexture的開始處添加了一個斷點並逐步完成了該功能。 即使它不起作用,texturesurface確實具有看似正確的值/屬性。

任何想法?

+1

你確定你的圖片的像素格式是BGRA(或者至少是每個像素4字節?) – keltar

+0

@keltar好喊我沒有檢查過,當我回家時我會這樣做。我記得改變BGRA到RGBA導致了一個不同的錯誤,一些PDB沒有加載,想法? – jaunt

+1

BGRA/RGBA是不同的順序,所以是的,它會導致變形的顏色。雖然每像素字節數相同。但是如果你的圖像是RGB/BGR,但你告訴GL它是BGRA - 這是完全不同的事情;它會得到垃圾數據或崩潰。 – keltar

回答

1

的錯誤你得到,這意味着procress的代碼段用於其調試器找不到(彙編和源代碼之間的關聯)任何調試信息任何內墜毀。對於任何屬於/你的程序的調試版本的任何情況,通常都是這種情況。

現在你的情況會發生什麼,你調用glTexImage2D的參數對你指定的緩衝區的內存佈局「說謊」,參數爲data。指針不包含任何有意義的元信息(就彙編級而言,它們只是另一個整數,具有特殊含義)。所以你必須確保你傳遞給函數的所有參數和指針一致。如果沒有,那個函數的深處,或者它所調用的任何東西(或者那個調用等等),內存可能會以違反操作系統設置的約束的方式被訪問,從而引發這種崩潰。

解決您的問題:修復您的代碼,即確保您傳遞給OpenGL的內容是一致的。它在OpenGL驅動程序中崩潰,但只是因爲你對它撒謊。

+0

的洞察力哇感謝,但爲什麼它與文本表面工作嗎?當然,那也行不通? – jaunt

+1

@jaunt:你正在調用GL_RGBA'的'的格式參數,即每個像素的4個信道'glTexImage2D'。如果加載的字體表面匹配,它將工作;另一個重要的部分是像素存儲解包參數設置與'glPixelStorei',這是有效的另一組參數進入'glTexImage'。你必須確保所有進入該功能的東西都匹配起來。如果沒有,它可能會崩潰。並且默認參數可能與偶發事件匹配。僅僅因爲它在某些時候起作用並不意味着它起作用,因爲一切都是正確的。 – datenwolf

+0

這是有道理的,所以事實證明圖像像素格式實際上並不是'GL_BGRA',並且處於一些奇怪的格式。我很驚訝,一個錯誤沒有被拋出。感謝您的幫助 – jaunt

相關問題