使用DevIL加载纹理,等效于使用Qt加载纹理的代码? 我在VisualStudioC++ 2010中使用OpenGL和GLSL。我正在编写着色器,我需要 加载纹理。我正在阅读一本书中的代码,其中他们用Qt加载纹理,但我 需要用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);

使用DevIL加载纹理,等效于使用Qt加载纹理的代码? 我在VisualStudioC++ 2010中使用OpenGL和GLSL。我正在编写着色器,我需要 加载纹理。我正在阅读一本书中的代码,其中他们用Qt加载纹理,但我 需要用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,Opengl,Glsl,Devil,鉴于DevIL不再维护,并且ILUT部分假设需要2次幂纹理维度,并且确实在其方便的功能中重新缩放图像,因此绕道手动执行该操作实际上是有意义的 首先使用DevIL从文件加载图像与从OpenGL中的图像加载纹理非常相似。首先,创建一个魔鬼图像名称并绑定它 GLuint loadImageToTexture(char const * const thefilename) { ILuint imageID; ilGenImages(1, &imageID); ilBin

鉴于DevIL不再维护,并且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);
接下来,我们设置像素存储参数(您的原始代码错过了关键步骤)

最后我们可以上传纹理图像并返回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);
最后返回纹理ID

    return textureID;
}

如果要使用mipmapping,可以稍后使用OpenGL
glGenerateMipmap
;使用GLTEX参数GL_TEXTURE_MIN_LOD和GL_TEXTURE_MAX_LOD来控制生成的图像棱锥体的范围。

鉴于DevIL不再被维护,并且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);
接下来,我们设置像素存储参数(您的原始代码错过了关键步骤)

最后我们可以上传纹理图像并返回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);
最后返回纹理ID

    return textureID;
}
如果要使用mipmapping,可以稍后使用OpenGL
glGenerateMipmap
;使用GLTEX参数GL_TEXTURE_MIN_LOD和GL_TEXTURE_MAX_LOD控制生成的图像棱锥体的范围