我使用Nvidia nv_dds实用程序加载 DDS 图像文件以在 OpenGL 程序中使用。它适用于 Windows,但在 Linux(Ubuntu 12.10)上失败。最初我认为 nv_dds 有问题,但后来发现 fread() 在 Linux(GCC 4.7)上读取的头字节偏移量错误
这是读取 DDS 文件标记和 DDS 标头的块:
// open file
FILE *fp = fopen(filename.c_str(),"rb");
if (fp == NULL) {
return false;
}
// read in file marker, make sure its a DDS file
char filecode[4];
fread(filecode, 1, 4, fp);
if (strncmp(filecode, "DDS ", 4) != 0) {
fclose(fp);
return false;
}
// read in DDS header
DDS_HEADER ddsh;
fread(&ddsh, 1,sizeof(DDS_HEADER) , fp);
当我查看 DDS_HEADER 实例的内容时,我可以看到分配给错误属性的几个实际值,其余的都是垃圾。
然后,如果我注释掉“DDS”标记检查 fread() :
// open file
FILE *fp = fopen(filename.c_str(), "rb");
if (fp == NULL) {
return false;
}
// read in file marker, make sure its a DDS file
/* comment out for test
char filecode[4];
fread(filecode, 1, 4, fp);
if (strncmp(filecode, "DDS ", 4) != 0) {
fclose(fp);
return false;
}
*/
// read in DDS header
DDS_HEADER ddsh;
fread(&ddsh, sizeof( DDS_HEADER ),1 , fp);//sizeof( DDS_HEADER )
然后我将图像宽度值放入 DDS_HEADER 的 imageHeight 属性中。其余属性仍然是垃圾。
当我在 Windows 机器上测试它时,这一切都不会发生。fread() 在 Linux GCC 上的工作方式是否可能与在 Windows 上使用 MSVC 编译器不同?