我的场景被组织成一组元素,这些元素组成了由浮点纹理支持的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并根据对象位置拆分对象渲染?
有没有办法让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编写的。