Я использую Qt 5.5 с QOpenGLWidget
, пытаясь загрузить текстуру, используя объект PBO. Код отображает простую плоскость, используя 2 текстурированных треугольника, но только при использовании PBO отображает только чистый цвет без видимой геометрии. Никаких ошибок, код прекрасно компилируется, и ни один из вызовов openGL также не возвращает код ошибки.
Сначала glTexSubImage2D()
вызвал код ошибки openGL GL_INVALID_OPERATION
, Я использовал отладчик ApiTrace openGL и обнаружил, что это, вероятно, вызвано не вызовом glTexImage2D()
из документации:
GL_INVALID_OPERATION
генерируется, если массив текстуры не был
определяется предыдущимglTexImage2D
операция.
Я добавил этот звонок прямо из QOpenGLFunctions
, но в этом я не уверен.
Я не нашел примеров использования PBO в новом QOpenGLWidget
поэтому я попытался написать его после прочтения документации и примеров openGL без какой-либо оболочки. Я новичок как в Qt, так и в openGL, так что это, вероятно, простая ошибка, но я не могу ее найти.
Код:
В initializeGL ()
m_texture = new QOpenGLTexture(QOpenGLTexture::TargetBuffer);
m_texture->setSize(512,512);
m_texture->setFormat(QOpenGLTexture::RGB8_UNorm);
m_texture->create();
m_texture->bind();
f->glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 512, 512, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
m_flowmapPBO.create();
m_flowmapPBO.bind();
for (int i = 0; i < 512 * 512; i++)
{
m_pixelDataSource.append(127); // R
m_pixelDataSource.append(127); // G
m_pixelDataSource.append(0); // B
m_pixelDataSource.append(255); // A
}
m_flowmapPBO.setUsagePattern(QOpenGLBuffer::DynamicDraw);
m_flowmapPBO.allocate(m_pixelDataSource.constData(), m_pixelDataSource.count() * sizeof(GLubyte));
m_pixelData = (GLubyte*) m_flowmapPBO.map(QOpenGLBuffer::WriteOnly);
memcpy(m_pixelData,m_pixelDataSource.constData(), sizeof(GLubyte) * m_pixelDataSource.count());
m_flowmapPBO.unmap();
// (vertex buffer object and shaders creation here)
В paintGL ()
// (glClear, projection matrix and shader program settings here)
m_flowmapPBO.bind();
m_pixelData = (GLubyte*) m_flowmapPBO.map(QOpenGLBuffer::WriteOnly);
memcpy(m_pixelData,m_pixelDataSource.constData(), sizeof(GLubyte) * m_pixelDataSource.count());
m_flowmapPBO.unmap();
m_texture->bind();
f->glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 512, 512, GL_RGBA, GL_UNSIGNED_BYTE, 0);
f->glDrawArrays(GL_TRIANGLE_FAN, 0, 5);
РЕДАКТИРОВАТЬ: я забыл связать VBO, прежде чем glDrawArrays
, Теперь он рисует треугольники, но темно-серым, а не (127,127,0) цветом из данных текстуры.
Задача ещё не решена.
Других решений пока нет …