0

我们可以使用 mpv 库在 OpenGL 窗口的左下角绘图。虽然 mpv 似乎能够绘制任意宽度和高度,但我们发现绘制到另一个位置的唯一方法是写入另一个帧缓冲区,但是我们必须将第二个帧缓冲区 blit 到第一个帧缓冲区上。

有没有办法告诉 mpv 将 OpenGL 绘制到 (x,y,w,h) 上?

此外,当我们复制它多次崩溃时,然后突然开始工作,这很奇怪。即使它有效,它也会显示两张我们完全不理解的图片。

在此处输入图像描述

要创建帧缓冲区:

 glGenFramebuffers(1, &fbo);
 glBindFramebuffer(GL_FRAMEBUFFER, fbo);
 glGenTextures(1, &texture);
 glBindTexture(GL_TEXTURE_2D, texture);
 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, drawWidth, drawHeight, 0, GL_RGB,
               GL_UNSIGNED_BYTE, nullptr);
 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
                         texture, 0);
 glBindTexture(GL_TEXTURE_2D, 0);
  glBindFramebuffer(GL_FRAMEBUFFER, 0);

要将电影帧缓冲区复制到常规帧缓冲区中:

glBindFramebuffer(GL_FRAMEBUFFER, fbo);
  if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
    std::cout << "ERROR::FRAMEBUFFER:: Framebuffer is not complete!"
              << std::endl;
  glClearColor(0.1f, 0.1f, 0.1f, 1.0f);
  glClear(GL_COLOR_BUFFER_BIT);
  checkError(mpv_render_context_render(mpv_gl, redrawParams));
  glBindFramebuffer(GL_FRAMEBUFFER, 0);
  glBindFramebuffer(GL_READ_BUFFER, fbo);
  glBlitFramebuffer(0, 0, drawWidth, drawHeight, x, y, x + drawWidth,
                    y + drawHeight, GL_COLOR_BUFFER_BIT, GL_LINEAR);
4

1 回答 1

0

从 mpv C API 头文件的浏览来看,是的。render.h表示您可以使用渲染属性来更改视频的绘制位置、缩放方式,甚至可以根据需要进行裁剪。

于 2021-07-08T23:12:13.850 回答