OpenGL意外错误中的纹理映射

时间:2013-02-16 13:25:40

标签: opengl texture-mapping

我在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。)

2 个答案:

答案 0 :(得分:3)

  

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

我相信你使用的linux代码也很老。尝试切换到SOIL或其他一些图像加载库。更新的代码也适用于linux。

答案 1 :(得分: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 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);

以这种方式编写是以唯一方式以健壮且平台独立的方式读取二进制数据。写作是单调乏味吗?是的。这就是为什么你要编写一些辅助函数来抽象它。