来自原始数据的QOpenGLTexture(Qt)(freeimage)

时间:2015-09-19 09:57:03

标签: c++ qt opengl freeimage

我一直在使用旧的Qt OpenGl方法,但现在是时候切换到新的方法。

位图 FIBITMAP *已正确初始化

  

glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA8,宽度,高度,0,   GL_BGRA,GL_UNSIGNED_BYTE,(void *)FreeImage_GetBits(pImage));

对我来说就像一个魅力。

但现在在较新的方法中,最好使用 QOpenGLTexture

不幸的是,我的尝试没有成功,即

  

QOpenGLTexture * qtexture = new   QOpenGLTexture(QOpenGLTexture :: Target2D);

     

提升口感>使用setData(QOpenGLTexture ::的PixelFormat :: RGBA,   QOpenGLTexture :: PixelType :: INT8,FreeImage_GetBits(位图));

该代码返回1x1纹理,但如果我强制使用

这样的大小
  

qtexture->的setSize(宽度,高度,4);

qtexture有适当的大小,但它完全是黑色的,我也尝试在Qt / Freeimage论坛等搜索,但不幸的是,每个人都使用QImage来提供QOpenGLTexture,但不幸的是我需要支持一些"奇怪"文件格式如.hdr或.exr,Qt本身不支持。

提前感谢您的时间!

2 个答案:

答案 0 :(得分:0)

  

qtexture-> allocateStorage();

是关键!

答案 1 :(得分:0)

对于QOpenGLTexture,您必须在Size之前设置FormatallocateStorage。最后一步是setData

QOpenGLTexture *text = new QOpenGLTexture(QOpenGLTexture::Target2D);
text->setMinMagFilters(QOpenGLTexture::Linear, QOpenGLTexture::Linear);
text->create();

// given some `width`, `height` and `data_ptr`
text->setSize(width, height, 1);
text->setFormat(QOpenGLTexture::RGBA8_UNorm);
text->allocateStorage();
text->setData(QOpenGLTexture::Red, QOpenGLTexture::UInt8, data_ptr);