使用 Boost.GIL 加载 opengl 纹理

Posted

技术标签:

【中文标题】使用 Boost.GIL 加载 opengl 纹理【英文标题】:Loading opengl texture using Boost.GIL 【发布时间】:2016-11-19 05:41:31 【问题描述】:

我编写了一个使用 OpenGL、Assimp 和 Boost.GIL 加载模型的简单应用。

我的模型包含一个 PNG 纹理。当我使用 GIL 加载它并通过 OPENGL 渲染它时,我得到了错误的结果。感谢codeXL的力量,我发现我在OpenglGL中加载的纹理与图像本身完全不同。

这是一个类似的问题,我按照它的步骤操作,但仍然犯了同样的错误。

这是我的代码:

// --------- image loading
std::experimental::filesystem::path path(pathstr);
gil::rgb8_image_t img;
if (path.extension() == ".jpg" || path.extension() == ".jpeg" || path.extension() == ".png")

    if (path.extension() == ".png")
        gil::png_read_and_convert_image(path.string(), img);
    else
        gil::jpeg_read_and_convert_image(path.string(), img);

    _width = static_cast<int>(img.width());
    _height = static_cast<int>(img.height());

    typedef decltype(img)::value_type pixel;

    auto srcView = gil::view(img);
    //auto view = gil::interleaved_view(
    //  img.width(), img.height(), &*gil::view(img).pixels(), img.width() * sizeof pixel);

    auto pixeldata = new pixel[_width * _height];

    auto dstView = gil::interleaved_view(
        img.width(), img.height(), pixeldata, img.width() * sizeof pixel);

    gil::copy_pixels(srcView, dstView);


// ---------- texture loading

    glBindTexture(GL_TEXTURE_2D, handle());
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB,
        image.width(), image.height(),
        0, GL_RGB, GL_UNSIGNED_BYTE,
        reinterpret_cast<const void*>(image.data()));
    glGenerateMipmap(GL_TEXTURE_2D);
    glBindTexture(GL_TEXTURE_2D, 0);

我的纹理是:

当它运行时,我的 codeXL 调试器报告我纹理变成了:

这个模型的所有其他纹理也出错了。

【问题讨论】:

【参考方案1】:

从技术上讲,这是一个常见问题解答,已经问了好几次了。本质上,您遇到了对齐问题。默认情况下(您可以更改它)OpenGL 期望图像行在 4 字节边界上对齐。如果您的图像数据与此不匹配,您会得到这个倾斜的结果。在对glTexImage… 的调用之前添加对glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 的调用将为您解决问题当然,您应该从图像元数据中检索实际对齐方式。

图像“倒置”是由于 OpenGL 将纹理的原点置于左下角(如果所有变换矩阵都默认保留或具有正行列式)。这与大多数图像文件格式(但不是全部)在 左上角 不同。只需翻转垂直纹理坐标即可。

【讨论】:

对我有帮助!!谢谢!!

以上是关于使用 Boost.GIL 加载 opengl 纹理的主要内容,如果未能解决你的问题,请参考以下文章

高效的 OpenGL 纹理加载 gxbase

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

OpenGL - 纹理加载不正确

使用 ASSIMP 和 OpenGL 加载 3D 模型时纹理不正确

OpenGL:纹理加载但未应用

如何使用openGL在屏幕上显示加载的纹理