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 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);

このように記述することは、堅牢でプラットフォームに依存しない方法でバイナリ データを読み取る唯一の方法です。書くのは面倒ですか?はい、そうです。そのため、これを抽象化するためにいくつかのヘルパー関数を作成する必要があります。

于 2013-02-16T17:15:21.847 に答える