2013-02-16 74 views
2

我試過NeHE教程中的代碼。 (http://nehe.gamedev.net/tutorial/texture_mapping/12038/) 我下載了linux版本的代碼。 (http://codepad.org/ApAyiNuV) 它編譯的代碼沒有問題,但是當我嘗試運行我得到這個錯誤:我爲什麼會得到這個錯誤,我怎麼能解決這個問題OpenGL中的紋理映射意外錯誤

Width of NeHe.bmp: 140204912410880 
Height of NeHe.bmp: 140204912410880 
Error allocating memory for color-corrected image data 

(我用gcc)

回答

1

您鏈接的代碼中的主要問題與OpenGL無關,也不涉及加載圖像。問題是,內容從文件加載的方式不可靠。這裏是

// read the width 
if ((i = fread(&image->sizeX, 4, 1, file)) != 1) { 
printf("Error reading width from %s.\n", filename); 
return 0; 
} 

的問題,即sizeof(Image::sizeX)不是neccesarily 4 「字符」:拿這個舉例來說。這種類型是unsigned long這是至少 4但它可以更長。在現代系統中很可能是8。這意味着,8個「字符」中的4個在讀取之前就已經存在,這是通常關心的非零垃圾。

另外整個永久性問題沒有解決。實現健壯的二進制加載的唯一方法是通過從明確定義的表達式中分配明確地設置所有位。在現場的情況下Image::sizeX你可以把它寫成

char buf[4]; 
// read the width 
if ((i = fread(buf, 4, 1, file)) != 1) { 
printf("Error reading width from %s.\n", filename); 
return 0; 
} 
image->sizeX = 
    ((unsigned long)buf[0]) | 
    (((unsigned long)buf[1])<<8) | 
    (((unsigned long)buf[2])<<16)| 
    (((unsigned long)buf[3])<<24); 

寫作這種方式是一個強大的和plattform獨立的方式來讀取二進制數據唯一方式。寫作乏味嗎?是的。這就是爲什麼你會寫一些輔助函數來將它抽象出來。

+0

雖然這將通過使用第三方庫來解決。無論如何,'+ 1'是真正的問題。 – 2013-02-16 20:15:36

+0

@BartekBanachewicz:確實使用經過良好測試的第三方庫是推薦的方法。但指出實際問題是值得的。至於什麼圖書館使用,意見不同。同樣,在開發軟件時,你會比以後遇到一種情況,那就是你必須自己編寫一個二進制文件解析器,例如,如果你必須處理一些內部文件格式,而沒有其他人使用。 – datenwolf 2013-02-16 21:06:52

3

Important: This way of loading textures is deprecated and does not work anymore with current versions of Visual Studio. The theory of this tutorial is still valid though. An update of the code which is responsible for loading the texture can be found here: http://nehe.gamedev.net/tutorial/lesson_06_texturing_update/47002/

我相信你使用的linux代碼也是相當古老的。嘗試切換到SOIL或其他圖片加載庫。更新後的代碼也應該在linux上運行。