关于glInvalidateFramebuffer的含义

About the meaning of glInvalidateFramebuffer

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

据我所知,glInvalidateFramebuffer的目的是为了"skip the store of framebuffer contents that are no longer needed"。它在基于图块的 gpus 上的主要目的是在渲染后仅需要颜色的情况下摆脱深度和模板内容。我不明白为什么这是必要的。据我所知,如果我呈现给 FBO,那么所有这些数据都存储在该 FBO 中。现在,如果我在随后的绘制中仅使用颜色内容或不使用该 FBO 进行操作,为什么 depth/stencil 数据会被访问?它应该存储在某个地方并且会占用带宽,但据我所知,作为渲染的结果,它已经在 FBO 的 GPU 内存中,那么什么时候会发生所谓的昂贵的额外存储操作?

FBO 附件据称有昂贵的保存步骤,但如果渲染结果数据已经在 Gpu 内存中,为什么还需要这些步骤?

此致

基于图块的 GPU 中的帧缓冲区存在于两个位置 - 存储在主内存中的版本(持久的)和 GPU 图块缓冲区内的工作副本(仅在该图块的片段着色期间存在) ).在每个图块的着色结束时,图块缓冲区的内容被写回主内存中的缓冲区。

基于图块的着色的 objective 是在图块缓冲区中保留尽可能多的状态,并在不需要时避免将其写回主内存。这很重要,因为主内存 DRAM 访问非常耗电。每个渲染通道结束时的失效告诉图形堆栈不需要保留这些缓冲区,因此可以避免从图块缓冲区写回主内存。

如果您需要更多详细信息,我在这里写了一篇更长的文章:

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

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