将Pixeldata渲染为OpenGL Texture quad

时间:2018-03-29 09:10:29

标签: c++ opengl qt5.10

经过几天的尝试后,我无法正确地将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很好地配合使用,但正如我在开头提到的那样,我根本无法正确地完成它。

1 个答案:

答案 0 :(得分:1)

请勿使用glTexSubImage2D。它已经过时而且很慢,已经从现代OpenGL中删除了。

只需使用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 ); } 更新包含屏幕内容的纹理的子矩形。

修改

ElementNotInteractableException: Element <> is not reachable by keyboard. 

我猜你可以自己修改RECT和RGBA的定义。

然后只绘制一个填充纹理四边形的视口,你就完成了。纹理四边形为您提供免费的缩放。