经过几天的尝试,我无法正确地将 Pixeldata 渲染为带纹理的四边形。
我想要的相当简单(我认为):我目前正在为我的公司编写一个 VNC 实现,以将其绑定到现有应用程序中。我已经成功实现了 RfbProtocol(至少在我需要的情况下)并且我能够获得正确的 Pixeldata。因为 VNC 服务器只发送增量更改,所以我收到带有更改区域和像素信息的小矩形。
我已经计算出 Pixeldata 的相应 OpenGL 格式是GL_BGRA和GL_UNSIGNED_INT_8_8_8_8_REV。
因为我无法使用 Textured Quads(这似乎是为此目的的最佳实现),所以我使用了不同的方法:
if(m_queue.size() > 0)
{
if (!m_fbo || m_fbo->size() != size())
{
delete m_fbo;
QOpenGLFramebufferObjectFormat format;
format.setAttachment(QOpenGLFramebufferObject::CombinedDepthStencil);
m_fbo = new QOpenGLFramebufferObject(size());
}
m_fbo->bind();
Q_FOREACH (RfbProtocol::RfbRectangle rect, m_queue.dequeue().rectangles())
{
glViewport(0, 0, 1920, 1080);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, 1920, 0, 1080, -1, 1);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glRasterPos2d(rect.xpos, rect.ypos);
glDrawPixels(rect.width,rect.height, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, rect.pixelData.data());
}
m_fbo->release();
this->update();
}
这一切都在 QOpenGLWidget 中完成。
显然这不是最好的方法,但它正在用于测试。问题是我需要将 Pixeldata 缩放到 Widget 的大小,这可以与 OpenGLTexture 很好地配合使用,但正如我在开头提到的那样,我根本无法正确地做到这一点。