我的场景被组织成由浮点纹理(带有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并根据对象位置在这些对象之间划分对象渲染?
答案 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编写的。