C++ 将像素数据渲染到OpenGL纹理四边形中

C++ 将像素数据渲染到OpenGL纹理四边形中,c++,opengl,qt5.10,C++,Opengl,Qt5.10,经过几天的尝试,我无法将像素数据正确地渲染到纹理四边形中 我想要的相当简单(我想):我目前正在为我的公司编写一个VNC实现,将其绑定到现有的应用程序中。我已经成功地实现了RfbProtocol(至少在我需要的范围内),并且我能够获得正确的像素数据。因为VNC服务器只发送增量更改,所以我接收到带有更改区域和像素信息的小矩形 我已经计算出像素数据对应的OpenGL格式是GL\u BGRA和GL\u UNSIGNED\u INT\u 8\u 8\u 8\u REV 因为我无法使用纹理四边形(这似乎是实

经过几天的尝试,我无法将像素数据正确地渲染到纹理四边形中

我想要的相当简单(我想):我目前正在为我的公司编写一个VNC实现,将其绑定到现有的应用程序中。我已经成功地实现了RfbProtocol(至少在我需要的范围内),并且我能够获得正确的像素数据。因为VNC服务器只发送增量更改,所以我接收到带有更改区域和像素信息的小矩形

我已经计算出像素数据对应的OpenGL格式是GL\u BGRAGL\u UNSIGNED\u INT\u 8\u 8\u 8\u REV

因为我无法使用纹理四边形(这似乎是实现此目的的最佳方法),所以我使用了不同的方法:

  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缩放到小部件的大小,这将与OpenGLTexture很好地配合使用,但正如我在开始时提到的,我根本无法正确地执行此操作。

不要使用
glDrawPixels
。它既旧又慢,已经从现代OpenGL中删除

只需使用
glTexSubImage2D
更新包含屏幕内容的纹理的子矩形

编辑

GLuint create_texture(unsigned width, unsigned height)
{
    GLuint tex;
    glGenTextures(1, &tex);
    glBindTexture(GL_TEXTURE_2D, tex);

    /* initialize texture to nil */
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
        width, height, 0,
        GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV, NULL);

    /* disable mipmapping */
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

    return tex;
}

void update_texture(GLuint tex, RECT r, RGBA *pixels)
{
    glBindTexture(GL_TEXTURE_2D, tex);
    glTexSubImage2D(GL_TEXTURE_2D, 0,
        r.left, r.bottom,
        r.right-r.left, r.top-r.bottom,
        GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV,
        pixels );
}
我想你可以自己修改RECT和RGBA的定义


然后只需绘制一个视口填充纹理四边形,就完成了。有纹理的四边形可以免费为您提供很好的缩放效果。

您能给我一个简单的演示如何使用它吗?@ChristianRöskens:请参阅我的编辑。但说真的,glTexSubImage2D的文档几乎是不言自明的。还有很多教程介绍如何创建纹理并将其绘制到四边形上。感谢您的示例,我将尝试实现这一点。是的,你是对的,有很多教程,但我仍在努力学习,可能是因为我缺少一点OpenGL的基本理论。如果我在这个主题上有进一步的问题,我有机会与你联系吗?@ChristianRöskens:当然。然而,我在复活节周末休假。不幸的是,当我试图画一个四边形时,我仍然只有一个黑屏