我写了一个简单的应用程序,使用OpenGL,Assimp和Boost.GIL加载模型。
我的模型包含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);
}
这个模型的所有其他纹理也出错了。
答案 0 :(得分:2)
从技术上讲,这是一个常见问题解答,已多次询问过。基本上你遇到了对齐问题。默认情况下(您可以更改它)OpenGL要求图像行在4字节边界上对齐。如果您的图像数据与此不匹配,则会出现此偏差结果。在致电glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
之前添加对glTexImage…
的呼叫将为您执行的诀窍。 当然,您应该从图像元数据中检索实际对齐方式。
“颠倒”的图像是由OpenGL将纹理的原点放入左下(如果所有转换矩阵都保留为默认值或具有正行列式)引起的。这与大多数图像文件格式(但不是全部)不同,它们位于 upper 左侧。只需翻转垂直纹理坐标,你就是金色。