2012-12-01 32 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來控制生成的圖像金字塔的範圍。