使用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不再维护,并且ILUT部分假设需要2次幂纹理维度,并且确实在其方便的功能中重新缩放图像,因此绕道手动执行该操作实际上是有意义的 首先使用DevIL从文件加载图像与从OpenGL中的图像加载纹理非常相似。首先,创建一个魔鬼图像名称并绑定它使用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
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,可以稍后使用OpenGLglGenerateMipmap
;使用GLTEX参数GL_TEXTURE_MIN_LOD和GL_TEXTURE_MAX_LOD控制生成的图像棱锥体的范围