DevIL が維持されなくなり、ILUT 部分が 2 の累乗のテクスチャ ディメンションの要件を想定し、その便利な関数で画像を再スケーリングすることを考えると、手動で行うという迂回を実際に行うことは理にかなっています。
最初に DevIL を使用してファイルから画像をロードすることは、OpenGL で画像からテクスチャをロードするのと非常によく似ています。まず、DevIL イメージ名を作成してバインドします
GLuint loadImageToTexture(char const * const thefilename)
{
ILuint imageID;
ilGenImages(1, &imageID);
ilBindImage(imageID);
ファイルから画像を読み込めるようになりました
ilLoadImage(thefilename);
画像がデータを提供していることを確認し、そうでない場合はクリーンアップします
void data = ilGetData();
if(!data) {
ilBindImage(0);
ilDeleteImages(1, &imageID);
return 0;
}
重要なパラメータを取得する
int const width = ilGetInteger(IL_IMAGE_WIDTH);
int const height = ilGetInteger(IL_IMAGE_HEIGHT);
int const type = ilGetInteger(IL_IMAGE_TYPE); // matches OpenGL
int const format = ilGetInteger(IL_IMAGE_FORMAT); // matches OpenGL
テクスチャ名を生成する
GLuint textureID;
glGenTextures(1, &textureID);
glBindTexture(GL_TEXTURE_2D, textureID);
次に、ピクセル ストアのパラメーターを設定します (元のコードでは、その重要なステップが抜けていました)
glPixelStorei(GL_UNPACK_SWAP_BYTES, GL_FALSE);
glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); // rows are tightly packed
glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0);
glPixelStorei(GL_UNPACK_SKIP_ROWS, 0);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1); // pixels are tightly packed
最後に、テクスチャ画像をアップロードして ID を返すことができます
glTexImage2D(GL_TEXTURE_2D, 0, format, width, height, 0, format, type, data);
次に、便宜上、縮小フィルターを GL_LINEAR に設定して、ミップマップ レベルを指定する必要がないようにします。
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
最後に textureID を返します
return textureID;
}
ミップマッピングを使用したい場合は、glGenerateMipmap
後で OpenGL を使用できます。glTexParameter GL_TEXTURE_MIN_LOD と GL_TEXTURE_MAX_LOD を使用して、生成される画像ピラミッドの範囲を制御します。