Nvidia nv_ddsユーティリティを使用して、OpenGL プログラムで使用する DDS イメージ ファイルをロードします。Windowsでは機能しますが、Linux(Ubuntu 12.10)では失敗します。最初はnv_ddsの問題を考えていましたが、Linux(GCC 4.7)でfread()がヘッダーバイトを間違ったオフセットで読み取ることがわかりました
これは、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マシンでテストすると、これはすべて起こりません。Linux GCC と MSVC コンパイラを使用する Windows では、fread() の動作が異なる可能性はありますか?