首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用FreeImage加载图像

用FreeImage加载图像
EN

Stack Overflow用户
提问于 2013-10-26 12:31:41
回答 3查看 7.5K关注 0票数 4

我正在尝试学习OpenGL教程,但是本教程使用的是土壤(这对我不起作用),我使用的是FreeImage。

你能告诉我为什么我的代码不起作用吗?

教程代码:

代码语言:javascript
复制
// Load texture
GLuint tex;
glGenTextures(1, &tex);

int width, height;
unsigned char* image = SOIL_load_image("sample.png", &width, &height, 0, SOIL_LOAD_RGB);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, image);
SOIL_free_image_data(image);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

我的代码:

代码语言:javascript
复制
// Load textures
GLuint tex;
glGenTextures(1, &tex);

int width, height;

FREE_IMAGE_FORMAT formato = FreeImage_GetFileType("sample.png",0);
FIBITMAP* imagen = FreeImage_Load(formato, "sample.png");
FIBITMAP* temp = imagen;  
imagen = FreeImage_ConvertTo32Bits(imagen);
FreeImage_Unload(temp);

width = FreeImage_GetWidth(imagen);
height = FreeImage_GetHeight(imagen);

GLubyte* textura = new GLubyte[4*width*height];
char* pixeles = (char*)FreeImage_GetBits(imagen);

for(int j= 0; j<width*height; j++)
{
    textura[j*4+0]= pixeles[j*4+2];
    textura[j*4+1]= pixeles[j*4+1];
    textura[j*4+2]= pixeles[j*4+0];
    textura[j*4+3]= pixeles[j*4+3];
}

glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA, width, height, 0, GL_RGBA,GL_UNSIGNED_BYTE,(GLvoid*)textura );

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

我的“解决方案”只会导致一个黑窗口(没有错误)。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-10-26 17:09:37

C中的编码是非常有趣的

你是程序员。您最好调试您的程序,因为OpenGL应用程序中的“黑色屏幕”可能是由无数不同的原因造成的。从我们的角度来看,我们只能猜测。我们也不喜欢。

我猜

(好吧,有时候我们喜欢猜测)

这是:

代码语言:javascript
复制
FIBITMAP* temp = imagen;  
imagen = FreeImage_ConvertTo32Bits(imagen);
FreeImage_Unload(temp);

您的tempimagen指向相同的位置,所以FreeImage_Unload(temp);之后都指向.我们不知道在哪。然后你从它得到像素:

char* pixeles = (char*)FreeImage_GetBits(imagen);

它还能返回什么?我们不知道。在此之后,您不会检查pixels是否存在。不明确的行为等等。它甚至不会崩溃。而且,在相同的dib中,您不能读写。

相反,请做:

代码语言:javascript
复制
FREE_IMAGE_FORMAT formato = FreeImage_GetFileType("sample.png",0);
if(formato  == FIF_UNKNOWN) { /* go angry here */ } 
FIBITMAP* imagen = FreeImage_Load(formato, "sample.png");
if(!imagen ) { /* go very angry here */ } 
FIBITMAP* temp = FreeImage_ConvertTo32Bits(imagen);
if(!imagen) { /* go mad here */ } 
FreeImage_Unload(imagen);
imagen = temp;

(或者只是注释掉所有的转换内容)

如何调试:

  • 加载和处理图像后检查错误。图像会加载吗?
  • 检查OpenGL错误。一切都在那里吗?
  • 在像素着色器中,将输出颜色设置为白色,这样您就可以确保您的几何图形很好(什么?不使用着色器?=( )
  • 纹理加载后,将其直接写入.raw文件(或其他格式),并使用位图编辑器检查它。

如何检查错误:

仔细阅读FreeImage文档和教程示例。查看错误检查实现。基本上,您需要设置回调函数。实施它。设置好它。(或至少复制粘贴)。对glGetError()执行相同的OpenGL操作。

快乐编码!=)

编辑: FreeImage有SwapRedBlue32()助手函数,所以您不需要这些for循环。

票数 4
EN

Stack Overflow用户

发布于 2013-10-26 16:34:19

您似乎从未绑定您创建的纹理对象。

glBindTexture( GL_TEXTURE_2D, tex )之后添加一个glGenTextures()调用,然后再添加一个使用纹理渲染的调用。

票数 0
EN

Stack Overflow用户

发布于 2013-10-27 13:43:22

好吧,我找到了我问题的答案。:P

我必须在"Debug“文件夹中启动应用程序,而不是用VC++调试它。

唯一的问题是,现在加载的图片是颠倒的,但我想,当我改变for循环时,我可以修复它。

谢谢你的回答!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19606736

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档