部分重绘为FBO OpenGL

问题描述 投票:1回答:1

我的场景被组织成一组元素,这些元素组成了由浮点纹理支持的FBO(带有alpha的16位)。然后将这些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并根据对象位置拆分对象渲染?

opengl-es rendering framebuffer
1个回答
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编写的。

© www.soinside.com 2019 - 2024. All rights reserved.