【问题标题】:QByteArray from QFile来自 QFile 的 QByteArray
【发布时间】:2015-10-10 09:23:02
【问题描述】:

我想将字节数组读入 3D 纹理。

QFile file(filename);
if(!file.open(QIODevice::ReadOnly))
{

    return false;
}
QByteArray* data = new QByteArray(file.readAll(),  m_ImageWidth*m_ImageHeight*m_ImageCount );

glGenTextures(1, m_textures);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_3D, m_textures[0]);
glTexImage3D(GL_TEXTURE_3D, 0, GL_LUMINANCE, m_ImageWidth, m_ImageHeight, m_ImageCount, 
             0, GL_LUMINANCE, GL_UNSIGNED_BYTE, data);

我可以这样做吗?我在我的项目中遇到访问冲突,我想检查它们是否来自这里。

这是glTexImage3D()的写违规

【问题讨论】:

  • 请注意,没有理由在堆上创建 QByteArray。
  • 对于所有其他查看者,错误是由于未正确初始化 m_textures 数组引起的。
  • 顺便说一句,QByteArray 实现了 COW,因此您不需要使用 new 分配数组实例。只需在堆栈上创建它。
  • 我没听说过,谢谢!

标签: c++ c qt opengl


【解决方案1】:

您的data 变量包含一个指向内存中存储 QByteArray 对象的位置的指针,但它封装的实际数据存储在其他位置。当glTexImage3D 尝试从data 指针开始读取大块内存时,它会遇到未映射的内存。

要获取指向实际数据的指针,请改用 data->constData()。 QByteArray::constData

【讨论】:

  • 不幸的是,错误仍然存​​在:0x0 处的异常,代码:0xc0000005:0x8 处的写访问冲突,标志=0x0(第一次机会)
  • 感谢您的提示,非常有意义,所以我得到了答案!
  • 对于任何进一步的读者,错误来自使用带有 glew 的 Qt5。 Qt OpenGL 中的构建实际上是 OpenGL ES,它不支持 GLTexture3D。您必须使用 Qt 4.8 才能使用 glew。
猜你喜欢
  • 1970-01-01
  • 2014-06-03
  • 2018-08-28
  • 2013-10-08
  • 1970-01-01
  • 2012-03-25
  • 2020-10-30
  • 2016-10-31
  • 1970-01-01
相关资源
最近更新 更多