gpt4 book ai didi

opengl - glDrawElements 是否在后台缓冲区上同步?

转载 作者:行者123 更新时间:2023-12-02 00:14:01 26 4
gpt4 key购买 nike

如果我调用 glDrawElements 并将绘制目标作为后台缓冲区,然后调用 glReadPixels,是否可以保证我会读取绘制的内容?

换句话说,glDrawElements 是阻塞调用吗?

注意:我在这里观察到一个奇怪的问题,可能是由于 glDrawElements 没有被阻塞引起的...

最佳答案

In other word, is glDrawElements a blocking call?

OpenGL 不是这样工作的。

OpenGL memory model是建立在“好像”规则之上的。除某些异常(exception)情况外,everything in OpenGL will function as if all of the commands you issued have already completed 。实际上,一切都会像每个命令被阻塞一样工作,直到完成为止。

但是,这并不意味着 OpenGL 实现实际上就是这样工作的。它只需要尽一切努力使其看起来能够以这种方式工作。

因此,glDrawElements 一般不是阻塞调用;但是,glReadPixels(读取客户端内存时)是一个阻塞调用。由于当 glReadPixels 返回时,直接传输到客户端内存的像素传输结果必须可用,因此实现必须检查是否有任何未完成的渲染命令发送到正在读取的帧缓冲区。如果有,那么它必须阻塞,直到这些渲染命令完成。然后它可以执行读取并将数据存储在您的客户端内存中。

如果你是reading to a buffer object ,就不需要 glReadPixels 进行阻止。该函数不会修改客户端可访问的内存,因为您正在读入缓冲区对象。因此驱动程序可以异步发出读回。但是,如果您发出一些依赖于该缓冲区内容的命令(例如映射它以进行读取或使用glGetBufferSubData),则 OpenGL 实现必须停止,直到读取操作完成。

简而言之,OpenGL 尝试尽可能长时间地延迟阻塞。为了确保性能,您的工作是帮助 OpenGL 做到这一点,而不是 forcing an implicit synchronization除非绝对必要。 Sync objects可以帮忙解决这个问题。

关于opengl - glDrawElements 是否在后台缓冲区上同步?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15149589/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com