我使用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)颜色。