2016-11-19 50 views
1

我写了一个简单的应用程序,使用OpenGL,Assimp和Boost.GIL加载模型。使用Boost.GIL加载opengl纹理

我的模型包含PNG纹理。当我使用GIL加载它并通过OPENGL渲染时,我得到了错误的结果。感谢codeXL的powel,我发现我在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); 
} 

我的质地是: original texture

当它运行时,我codeXL调试报告我说质地变成了: texture in opengl

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

回答

2

从技术上讲,这是一个常见问题,已经有好几次了。本质上,你遇到了一个对齐问题。默认情况下(你可以改变它)OpenGL希望图像行在4个字节边界上对齐。如果你的图像数据不符合这个,你会得到这个歪斜的结果。拨打glPixelStorei(GL_UNPACK_ALIGNMENT, 1);前加一个电话给glTexImage…就可以为你做当然,您应该从图像元数据中检索实际对齐。

的图像是“倒置”是通过把OpenGL的纹理的原点到左下(如果所有变换矩阵左在默认或具有正的决定簇)引起的。这与大多数图像文件格式(但不是全部)不同,它们在上部左侧。只要翻转垂直纹理坐标,你就是金。

+0

对我有帮助!!谢谢! – ChungkingExpress