鉴于 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,这样我们就不必提供 mipmap 级别。
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
最后返回textureID
return textureID;
}
如果你想使用 mipmapping,你可以glGenerateMipmap
稍后使用 OpenGL;使用 glTexParameter GL_TEXTURE_MIN_LOD 和 GL_TEXTURE_MAX_LOD 来控制生成的图像金字塔的跨度。