Использование openGL PBO в qt 5.5

Я использую 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) цветом из данных текстуры.

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]