opengl - 使用 FreeImage 加载图像

标签 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);

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

最佳答案

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

    快乐编码! =)

    编辑: FreeImage 有 SwapRedBlue32()辅助函数,所以你不需要那些 for 循环。

    关于opengl - 使用 FreeImage 加载图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19606736/

    相关文章:

    c++ - 如何在 OpenGL C++ 程序中获取 int 作为输入并投影 double 作为输出?

    opengl - 使用带有 glew 的 VBO 访问冲突

    c++ - 为 iOS 5.0 编译/链接 FreeImage

    c++ - 为什么我的有线球体在平移和改变摄像机角度时会变成椭球体?

    c++ - 土壤图像尺寸

    python - 如何将二维列表中的值 append 到另一个列表并打印它

    2d - 有关于在脚本中使用 "fit image"函数(DM FitTools)的描述吗?

    c中二维数组中整数的连续间隔输入

    c++ - FreeImage 报告图像颜色类型错误