2015-10-10 60 views
2

我想將字節數組讀入3D紋理。來自QFile的QByteArray

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()

+0

請注意,沒有理由在堆上創建QByteArray。 –

+0

對於所有更多的查看者,錯誤是由於未正確初始化'm_textures'數組而導致的。 –

+1

順便說一句,'QByteArray'實現了COW,所以你不需要用new來分配數組的實例。只需在堆棧上創建它。 –

回答

3

寫侵犯您的data變量包含一個指向內存中一個地方的QByteArray對象存儲,但它封裝了實際數據都存儲在別處。當glTexImage3D嘗試從data指針開始讀取大塊內存時,它將運行到未映射的內存中。

要獲得指向acutal數據的指針,請改用data-> constData()。 QByteArray::constData

+0

不幸的是,錯誤仍然存​​在:在0x0處的異常,代碼:0xc0000005:在0x8,flags = 0x0處寫入訪問衝突(第一次機會) –

+0

Thx對於提示雖然非常合理,所以我得到了我的答案! –

+0

對於其他讀者,錯誤來自於使用Qt5和glew。在Qt OpenGL中構建的實際上是OpenGL ES,它不支持GLTexture3D。你必須使用Qt 4.8來與它一起使用。 –