OpenGL3.x,4.x中使用FreeImage显示图片的BUG-黑色,或颜色分量顺序错乱
2024-09-06 09:53:24
//参照FreeImage官网给出的CTextrueManager写的加载函数
//官方给的例子是用opengl3.0以下的旧GL写的,没有使用glGenerateMipmap(GL_TEXTURE_2D)来产生mipmap
//在GL3.0以后,渲染时默认是开启了MIPMAP的,如果不调用glGenerateMipmap来生成MIPMAP,则渲染出的贴图一片黑色
//另外要注意freeimage的颜色分量顺序是gbr,不知为什么,故这里fmt应传GL_BGR
GLuint CResMgr::LoadTextrue(const char* texFile, GLenum fmt, GLuint ifmt, GLuint level, GLuint border) {
FREE_IMAGE_FORMAT fifmt = FreeImage_GetFileType(texFile, );
if (fifmt == FIF_UNKNOWN) {
fifmt = FreeImage_GetFIFFromFilename(texFile);
if (fifmt == FIF_UNKNOWN) {
xsMsg(texFile, "图片加载失败:未知的格式", MB_ICONERROR);
return ;
}
} if (!FreeImage_FIFSupportsReading(fifmt)) {
xMsg(texFile, "freeImage不支持该文件格式的读取", MB_ICONERROR);
return ;
} FIBITMAP* dib = FreeImage_Load(fifmt, texFile);
if (!dib) {
xMsg(texFile, "freeImage_load失败", MB_ICONERROR);
return ;
} BYTE* bits = FreeImage_GetBits(dib);
GLuint width = FreeImage_GetWidth(dib);
GLuint height = FreeImage_GetHeight(dib); if (!bits || width == || height == ) {
xMsg(texFile, "freeImage_getbits, getwidth, getheight-failed", MB_ICONERROR);
return ;
} GLuint texId;
glGenTextures(, &texId);
glBindTexture(GL_TEXTURE_2D, texId);
glTexImage2D(GL_TEXTURE_2D, level, ifmt, width, height, border, fmt, GL_UNSIGNED_BYTE, bits); glGenerateMipmap(GL_TEXTURE_2D); //注意,不加这句渲染出的贴图是一片黑色,
FreeImage_Unload(dib);
return texId;
}
最新文章
- 常用的 SQL语句------CRUD
- JVM知识点
- Linux中exec命令相关
- ASP.NET ViewState详解
- IOS 解析JSON
- express 4
- 5 秒创建 k8s 集群 - 每天5分钟玩转 Docker 容器技术(115)
- IT企业如何实现项目管理信息化的目标
- Dagger2的基本概念与实际应用。
- 循环队列搜索 Search in Rotated Sorted Array
- leetcode26: 删除排序数组中的重复项
- 用Ubuntu快速安装Jenkins
- Java多线程(三)—— synchronized关键字详解
- redis数据库通过dump.rdb文件恢复数据库或者数据库迁移
- yyyy-MM-dd'T'HH:mm:ss.SSS'Z'即UTC时间,与String日期转换
- djang 过滤器和装饰器
- 在jQuery定义自己函数
- [UI] 精美UI界面欣赏[9]
- 【转】WCF扩展系列 - 行为扩展(Behaviors)
- idea 设置编译快捷键(代替 ctrl+f9)