我们可以使用 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);