用Devil加载纹理,用Qt加载纹理的等效代码?

时间:2012-12-01 15:19:44

标签: opengl glsl devil

我正在使用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);

1 个答案:

答案 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来控制生成的图像金字塔的范围。