我正在使用opengl和glsl,在visual studio c ++ 2010中。我正在编写着色器,我需要 加载纹理。我正在阅读一本书中的代码,并在那里用Qt加载纹理,但是我 需要用DevIl来做,有人可以用DevIL编写等效的纹理加载代码吗?我是DevIL的新手,我不知道如何翻译它。
// Load texture file
const char * texName = "texture/brick1.jpg";
QImage timg = QGLWidget::convertToGLFormat(QImage(texName,"JPG"));
// Copy file to OpenGL
glActiveTexture(GL_TEXTURE0);
GLuint tid;
glGenTextures(1, &tid);
glBindTexture(GL_TEXTURE_2D, tid);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, timg.width(), timg.height(), 0,
GL_RGBA, GL_UNSIGNED_BYTE, timg.bits());
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
答案 0 :(得分:3)
鉴于不再维护DevIL,并且ILUT部分假定需要2次幂纹理尺寸并且在其便利功能中重新缩放图像,实际上有必要绕道而行。< / p>
首先使用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,可以稍后使用OpenGL glGenerateMipmap
;使用glTexParameter GL_TEXTURE_MIN_LOD和GL_TEXTURE_MAX_LOD来控制生成的图像金字塔的范围。