簡體   English   中英

將Pixeldata渲染為OpenGL Texture Quad

[英]Render Pixeldata into OpenGL Texture quad

經過數天的嘗試,我無法正確將Pixeldata渲染到紋理四邊形。

我想要的非常簡單(我認為):我目前正在為公司編寫VNC實現,以將其綁定到現有應用程序中。 我已經成功實現了RfbProtocol(至少在我需要的時候),並且能夠獲得正確的Pixeldata。 因為VNC服務器僅發送增量更改,所以我收到的小矩形具有更改的區域和像素信息。

我已經計算出Pixeldata的相應OpenGL格式為GL_BGRAGL_UNSIGNED_INT_8_8_8_8_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縮放到Widget的大小,這可以與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的定義。

然后只需繪制一個填充紋理四邊形的視口即可。 帶紋理的四邊形可為您免費提供漂亮的縮放比例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM