假设我们使用双缓冲。我们首先将帧写入后缓冲区,然后将它交换到前缓冲区以进行显示。
这里有2个场景,我假设它们有相同的结果。
假设我们清除了后台缓冲区,然后我们将一个新帧写入后台缓冲区。将其交换到前缓冲区。
现在假设我们没有清除后台缓冲区,无论如何都会用新帧覆盖后台缓冲区。最后,两个缓冲区都将被交换。
因此,假设我是对的并且假设我们使用双缓冲,无论清除还是不清除缓冲区,两者都会以相同的显示结束,是真的吗?
如果我们没有清除缓冲区,是否会有任何可能的渲染工件?
答案 0 :(得分:1)
第二种方法的关键在于这个假设:
后台缓冲区将被新帧覆盖
我假设我们正在谈论OpenGL帧缓冲区,其中包含颜色值,深度,模板等等。它们在下一帧中将如何被覆盖?
渲染代码会进行不断的深度比较,因此请查看需要绘制的对象。对于旧的帧深度数据,它将全部搞砸。如果渲染任何半透明项目并启用了混合,也会发生相同的情况。
清除缓冲区是将所有内容重置为接地零(或您需要的任何其他特定值)的最快方法。
有些技术依赖于缓冲区未被清除(考虑到这被证实是平台上昂贵的操作)。例如,没有透明几何体,后面没有不透明,并且在0-0.5 / 0.5-1.0范围内切换深度测试更少/更大,以使其始终覆盖旧帧值。
答案 1 :(得分:1)
在渲染过程中,您依赖于至少清除深度缓冲区的事实。
当双缓冲后缓冲区的值将(可能)是你在2帧之前渲染的值。
如果没有清除深度缓冲区,那么你种植的那面墙将永远不会消失。
深度缓冲区可以通过例如在禁用深度测试时渲染带天空盒的全屏四边形来清除。
答案 2 :(得分:1)
如果您喜欢现代硬件上的性能,清除缓冲区绝对必不可少。清除缓冲区不一定写入内存。相反,它会执行一些缓存魔法,这样,每当系统尝试从内存中读取时(如果它已被清除,它就没有被写入),它将读取清晰的颜色。所以它甚至不会真正访问那段记忆。
这对深度缓冲区这样的事情非常重要。深度测试/写入是读取/修改/写入操作。第一次阅读基本上是免费的。
因此,如果您要覆盖每个像素,那么从技术上来说需要来清除后台缓冲区,你真的应该这样做。
答案 3 :(得分:0)
缓冲区交换后,后台缓冲区的内容是 undefined ,即它们可以是任何东西。由于许多OpenGL渲染操作依赖于目标帧缓冲区的众所周知的状态才能正常工作(深度测试,模板测试,混合),因此在执行任何其他操作之前,必须将后缓冲区置于一个众所周知的状态。
因此,除非您采取谨慎措施以确保渲染操作不依赖于目标缓冲区内容,否则在进行任何其他操作之前,您必须在交换后清除后台缓冲区。