c++ - 如何使用 FreeImage 库将纹理加载到 OpenGL?

标签 c++ opengl textures freeimage

我正在使用 NeHe 教程在 C++ 中学习 OpenGL,但我正在尝试使用 FreeImage 库而不是 Glaux 或 SOIL 来完成它们。我看到使用 FreeImage 的好处是它的最后一次更新是在去年 10 月,而 SOIL 已经 5 年没有更新了。我遇到的问题是我无法正确加载纹理。

这是我的代码:

static GLuint texture = 0;
if (texture == 0)
{
    FIBITMAP* bitmap = FreeImage_Load(
        FreeImage_GetFileType("textures/test/nehe_06.png", 0),
        "textures/test/nehe_06.png");

    glGenTextures(1, &texture);

    glBindTexture(GL_TEXTURE_2D, texture);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

    glTexImage2D(GL_TEXTURE_2D, 0, 3, FreeImage_GetWidth(bitmap), FreeImage_GetHeight(bitmap),
        0, GL_RGB, GL_UNSIGNED_BYTE, FreeImage_ConvertTo32Bits(bitmap));

    FreeImage_Unload(bitmap);
}

使用这段代码,我得到的纹理是错误的:它是黑色的,带有彩色点和条,更改图像会得到相同的结果,所以我假设我没有正确加载纹理。

我尝试交换红色和蓝色位(阅读 FreeImage 在 BGR 中加载),但没有更好的结果。最后,如果我将 *FreeImage_ConvertTo32Bits(bitmap)* 更改为 *FreeImage_GetBits(bitmap)*,则会出现段错误。

我做错了什么?

最佳答案

您的代码有两个问题 - 一个是您将图像转换为 32 位,但您为 openGL (GL_RGB) 指定了 24 位纹理格式。第二个是您将 FreeImage 对象本身传递给纹理而不是转换后的位。

你需要做这样的事情来代替

FIBITMAP *pImage = FreeImage_ConvertTo32Bits(bitmap);
int nWidth = FreeImage_GetWidth(pImage);
int nHeight = FreeImage_GetHeight(pImage);

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, nWidth, nHeight,
    0, GL_BGRA, GL_UNSIGNED_BYTE, (void*)FreeImage_GetBits(pImage));

FreeImage_Unload(pImage);

关于c++ - 如何使用 FreeImage 库将纹理加载到 OpenGL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17125843/

相关文章:

c++ - c中的伪随机函数?

c - OpenGL 默认帧缓冲区内容在最小化/恢复周期后消失了吗?

c++ - 每帧调用 glGetUniformLocation()

javascript - 在 ThreeJS 中预加载纹理和图像?

python - 如何从 Kivy 中的一组小部件动态创建纹理?

c++: ptr_fun() 错误信息

c++ - 使用 openFrameworks 进行形状操作

c++ - 将指针传递给宏的省时方法

opengl - 计算与图形的依赖关系

c++ - 如何从原始数据加载 devIL 图像