关于glInvalidateFramebuffer的含义

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

我对glInvalidateFramebuffer的一般用法有疑问:

据我所知,glInvalidateFramebuffer的目的是“跳过不再需要的帧缓冲区内容的存储”。它在基于图块的GPU上的主要目的是,如果渲染后仅需要颜色,则摆脱深度和模板内容。我不明白为什么这是必要的。据我所知,如果我渲染到FBO,则所有这些数据都存储在该FBO中。现在,如果我在后续绘图中仅使用颜色内容执行某项操作,或者不使用该FBO进行任何操作,那么为什么根本不能访问深度/模板数据?它应该存储在某个地方并占用带宽,但是据渲染结果,据我所知它已经存在于FBOs GPU内存中,那么什么时候会发生该昂贵的附加存储操作?

据说FBO附件的保留步骤很昂贵,但是如果渲染后数据已经存在于Gpu内存中,为什么还要执行这些步骤呢?

问候

opengl-es
1个回答
0
投票

基于图块的GPU中的帧缓冲区存在两个位置-存储在主内存中的版本(是永久性的),以及GPU图块缓冲区内部的工作副本(仅在该图块的片段着色期间存在)。在每个图块的阴影结束时,图块缓冲区的内容将写回到主存储器中的缓冲区。

基于图块的着色的目的是将尽可能多的状态保留在该图块缓冲区内,如果不需要,请避免将其写回到主内存中。这很重要,因为主存储器DRAM访问非常耗电。在每个渲染过程的末尾,无效告诉图形堆栈不需要保留那些缓冲区,因此可以避免从图块缓冲区写回主内存。

如果您需要更多细节,我在这里写了更长的文章:

https://developer.arm.com/solutions/graphics/developer-guides/understanding-render-passes/single-view

对于非基于图块的GPU,如果您实际上并不关心起始颜色,则主要用例似乎是在渲染通道开始时将其用作clear的低成本版本。在渲染过程结束时使用它可能没有什么好处(但也不会对两者造成伤害)。

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