使用FreeImage加载图像

时间:2013-10-26 12:31:41

标签: opengl 2d freeimage

我正在尝试遵循OpenGL教程,但教程使用SOIL(这对我不起作用)并使用FreeImage。

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

教程代码:

// 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);

我的代码:

// 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);

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

3 个答案:

答案 0 :(得分:3)

C中的编码非常有趣

你是程序员。你最好调试你的程序,因为OpenGL应用程序中的“黑屏”可能由多种不同的原因引起。从我们的角度来看,我们只能猜测。我们不喜欢它。

我的猜测

(好吧,有时我们想猜)

此:

FIBITMAP* temp = imagen;  
imagen = FreeImage_ConvertTo32Bits(imagen);
FreeImage_Unload(temp);

您的tempimagen指向同一个地方,因此在FreeImage_Unload(temp);指向后......我们不知道在哪里。然后你从它得到像素:

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

它返回什么?我们不知道。在此之后,您不会检查pixels是否存在。 未定义的行为等甚至没有崩溃。 此外,AFAIR,你不能在同一dib读写。

取而代之的是:

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文档和教程示例。查看错误检查实现。基本上,您需要设置回调函数。实施它。设置它。 (或至少复制粘贴)。对OpenGL执行相同的+ glGetError()

快乐的编码! =)

编辑:FreeImage具有SwapRedBlue32()辅助函数,因此您不需要那些for循环。

答案 1 :(得分:0)

您似乎永远不会绑定您创建的纹理对象。

在尝试使用纹理进行渲染之前,在glBindTexture( GL_TEXTURE_2D, tex )之后添加glGenTextures()次调用。

答案 2 :(得分:0)

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

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

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

感谢所有答案!