重画为FBO OpenGL

时间:2019-04-12 22:30:23

标签: opengl-es rendering framebuffer

我的场景被组织成由浮点纹理(带有alpha的16位)支持的FBO组成的元素组。然后将这些FBO从上到下混合在一起以生成最终场景。所有FBO均为屏幕尺寸。当屏幕尺寸变大(在Intel HD Graphics 630上大于2048)时,帧速率将直线下降。这是由于填充率问题造成的(我已经尝试了无操作叶节点和较小的纹理格式来对此进行验证)。有没有办法将FBO的一部分与另一FBO的一部分隔离?在绘制纹理四边形之前,也许是这样的:

void FrameBufferManager::SetViewportFromClipBox(const Geometry::BoundingBox& clipBox)
{
    const auto& lowerLeft = clipBox.GetLowerLeft();
    const auto lx = static_cast<GLsizei>(lowerLeft.x);
    const auto ly = static_cast<GLsizei>(lowerLeft.y);
    const auto width = static_cast<GLsizei>(clipBox.GetWidth());
    const auto height = static_cast<GLsizei>(clipBox.GetHeight());
    glViewport(lx, ly, width, height);
    glScissor(lx, ly, width, height);
}

在顶点着色器中,对几何进行了转换,使得clipBox之外的点将落在((-1,-1)(1,1))之外。上面是否可以确保clipBox外部的像素不会浪费GPU内存带宽/填充率?如果没有,是否有办法做到而又不创建一堆小的FBO并根据对象位置在这些对象之间划分对象渲染?

1 个答案:

答案 0 :(得分:1)

  

是否有办法将一个FBO的一部分复制到另一个FBO的一部分?

从OpenGL ES 3.0开始,您可以使用glBlitFramebuffer

  

glBlitFramebuffer —将像素块从读取的帧缓冲区复制到绘制帧缓冲区

void glBlitFramebuffer(
    GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1,
    GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
    GLbitfield mask, GLenum filter);

扩展NV_framebuffer_blit也提供了此功能,该扩展是针对OpenGL ES 2.0编写的。