【问题标题】:Texture loading with DevIL, equivalent code to texture loading with Qt?使用 DevIL 加载纹理,使用 Qt 加载纹理的等效代码?
【发布时间】:2012-12-01 15:19:44
【问题描述】:

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

【问题讨论】:

    标签: opengl glsl devil


    【解决方案1】:

    鉴于 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,你可以稍后使用 OpenGL glGenerateMipmap;使用 glTexParameter GL_TEXTURE_MIN_LOD 和 GL_TEXTURE_MAX_LOD 来控制生成的图像金字塔的跨度。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-22
      • 2021-02-24
      • 2012-09-18
      • 2013-07-25
      • 2013-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多