在qt 5.5

时间:2015-11-11 23:13:49

标签: c++ qt opengl pbo

我使用Qt 5.5和QOpenGLWidget,尝试使用PBO对象上传纹理。代码使用2个纹理三角形渲染一个简单的平面,但是当我尝试使用PBO时,只渲染清晰的颜色而没有可见的几何体。没有错误,代码编译得很好,没有一个openGL调用返回任何错误代码。

首先glTexSubImage2D()导致openGL错误代码GL_INVALID_OPERATION。我使用过ApiTrace openGL调试器,发现它可能是因为没有从文档调用glTexImage2D()引起的:

  如果纹理数组尚未生成,则生成

GL_INVALID_OPERATION   由先前的glTexImage2D操作定义。

我直接从QOpenGLFunctions添加了这个电话,但这是我不确定的一件事。

我没有找到关于在新QOpenGLWidget中使用PBO的任何示例,所以我在阅读了没有任何包装器的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);

编辑:我忘了在glDrawArrays之前绑定VBO。现在它绘制三角形,但是采用深灰色,而不是纹理数据中的(127,127,0)颜色。

0 个答案:

没有答案