您链接的代码中的主要问题与 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);
以这种方式编写它是以稳健且独立于平台的方式读取二进制数据的唯一方法。写起来很累吗?是的。这就是为什么您要编写许多辅助函数来抽象它的原因。