0

我在 Visual Studio C++ 2010 中使用 opengl 和 glsl。我正在编写着色器,我需要加载纹理。我正在阅读一本书的代码,他们在那里用 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);
4

1 回答 1

3

鉴于 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 来控制生成的图像金字塔的跨度。

于 2012-12-01T15:58:59.300 回答