OpenGL3.x,4.x中使用FreeImage显示图片的BUG-黑色,或颜色分量顺序错乱

 1 //参照FreeImage官网给出的CTextrueManager写的加载函数
 2 //官方给的例子是用opengl3.0以下的旧GL写的,没有使用glGenerateMipmap(GL_TEXTURE_2D)来产生mipmap
 3 //在GL3.0以后,渲染时默认是开启了MIPMAP的,如果不调用glGenerateMipmap来生成MIPMAP,则渲染出的贴图一片黑色
  //另外要注意freeimage的颜色分量顺序是gbr,不知为什么,故这里fmt应传GL_BGR
4 GLuint CResMgr::LoadTextrue(const char* texFile, GLenum fmt, GLuint ifmt, GLuint level, GLuint border) { 5 FREE_IMAGE_FORMAT fifmt = FreeImage_GetFileType(texFile, 0); 6 if (fifmt == FIF_UNKNOWN) { 7 fifmt = FreeImage_GetFIFFromFilename(texFile); 8 if (fifmt == FIF_UNKNOWN) { 9 xsMsg(texFile, "图片加载失败:未知的格式", MB_ICONERROR); 10 return 0; 11 } 12 } 13 14 if (!FreeImage_FIFSupportsReading(fifmt)) { 15 xMsg(texFile, "freeImage不支持该文件格式的读取", MB_ICONERROR); 16 return 0; 17 } 18 19 FIBITMAP* dib = FreeImage_Load(fifmt, texFile); 20 if (!dib) { 21 xMsg(texFile, "freeImage_load失败", MB_ICONERROR); 22 return 0; 23 } 24 25 BYTE* bits = FreeImage_GetBits(dib); 26 GLuint width = FreeImage_GetWidth(dib); 27 GLuint height = FreeImage_GetHeight(dib); 28 29 if (!bits || width == 0 || height == 0) { 30 xMsg(texFile, "freeImage_getbits, getwidth, getheight-failed", MB_ICONERROR); 31 return 0; 32 } 33 34 GLuint texId; 35 glGenTextures(1, &texId); 36 glBindTexture(GL_TEXTURE_2D, texId); 37 glTexImage2D(GL_TEXTURE_2D, level, ifmt, width, height, border, fmt, GL_UNSIGNED_BYTE, bits); 38 39 glGenerateMipmap(GL_TEXTURE_2D); //注意,不加这句渲染出的贴图是一片黑色, 40 FreeImage_Unload(dib); 41 return texId; 42 }

 

posted @ 2018-02-17 11:26  时空观察者9号  阅读(549)  评论(0编辑  收藏  举报