2

我尝试了 NeHE 教程中的代码。( http://nehe.gamedev.net/tutorial/texture_mapping/12038/ ) 我下载了 linux 版本的代码。(http://codepad.org/ApAyiNuV)它编译代码没有问题,但是当我尝试运行时出现此错误:

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

为什么会出现这个错误,我该如何解决?(我使用了 gcc。)

4

2 回答 2

3

重要提示:这种加载纹理的方式已被弃用,并且不再适用于当前版本的 Visual Studio。不过,本教程的理论仍然有效。可以在这里找到负责加载纹理的代码更新:http: //nehe.gamedev.net/tutorial/lesson_06_texturing_update/47002/

我相信您使用的 linux 代码也很旧。尝试切换到 SOIL 或其他一些图像加载库。更新后的代码也应该可以在 linux 上运行。

于 2013-02-16T13:28:19.743 回答
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)不一定是 4 个“字符”。类型至少为unsigned long4 ,但可以更长。在现代系统上很可能是 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);

以这种方式编写它是以稳健且独立于平台的方式读取二进制数据的唯一方法。写起来很累吗?是的。这就是为什么您要编写许多辅助函数来抽象它的原因。

于 2013-02-16T17:15:21.847 回答