2012-12-01 39 views
0

我正在使用opengl和glsl,在visual studio C++ 2010中。我正在编写着色器,我需要 来加载纹理。我正在阅读一本书中的代码,并且在那里他们使用Qt加载纹理,但是我需要使用DevIl来完成它,但是有人可以使用DevIL编写用于纹理加载的等效代码吗?我是Devil新手,我不知道如何翻译这个。使用DevIL进行纹理加载,使用Qt进行纹理加载的等效代码?

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

回答

3

鉴于魔鬼不再保持,ILUT部分承担功率为2的纹理尺寸的要求,确实重新调整其方便的功能图像,它实际上是有意义的采取这样的迂回它手动。

首先从DevIL文件加载图像与从OpenGL中的图像加载纹理非常相似。首先创建一个恶魔形象的名字,并将其绑定

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

接下来我们设置的像素商店paremeters(原密码错过了关键的一步)

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