Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl 如何在不中断管道的情况下读取像素深度值?_Opengl_Optimization - Fatal编程技术网

Opengl 如何在不中断管道的情况下读取像素深度值?

Opengl 如何在不中断管道的情况下读取像素深度值?,opengl,optimization,Opengl,Optimization,在1个单像素上使用glReadPixels会暂停管道,即使我之前刚刚交换了缓冲区。 我不需要同步,我可以这样做: pixel=DEFAULT_VALUE; while (1){ draw(pixel); swapBuffers(); pixel=glRead???; } 如何以优化(而不是延迟)的方式执行此操作?您可以通过。当您在没有PBOs的情况下发出读取调用时,管道将被刷新,CPU必须等待GPU完成数据的呈现和传输。使用PBO,您可以提前提供一个缓冲区,当GPU准备

在1个单像素上使用glReadPixels会暂停管道,即使我之前刚刚交换了缓冲区。 我不需要同步,我可以这样做:

pixel=DEFAULT_VALUE;
while (1){
    draw(pixel);
    swapBuffers();
    pixel=glRead???;
}

如何以优化(而不是延迟)的方式执行此操作?

您可以通过。当您在没有PBOs的情况下发出读取调用时,管道将被刷新,CPU必须等待GPU完成数据的呈现和传输。使用PBO,您可以提前提供一个缓冲区,当GPU准备就绪时,数据将复制到该缓冲区中,因此它不会暂停。当您尝试在缓冲区准备就绪之前访问该缓冲区时(例如,通过
glGetBufferSubData()
或映射该缓冲区以进行读取等),它当然会暂停。因此,理想情况下,在读回数据之前,您可以在访问缓冲区之前将一些其他渲染命令排队,并执行一些其他CPU工作。我链接的扩展规范有一个示例部分,非常有趣

这种材料也可以与其他材料结合使用。在这种情况下,您可以在read调用之后添加fence sync,它将数据复制到PBO中。然后,在CPU上,您可以实际检查操作是否已经完成。如果没有,你可以做一些其他的工作,并检查回来


所有这些异步传输的主要问题是以吞吐量换取延迟。所以如果你马上需要那个像素值,然后做“;I don’对于GPU和CPU来说,没有任何其他可以在两者之间完成的工作,没有多少收获。那么,您就无法真正避免暂停。

您可以通过。当您在没有PBOs的情况下发出读取调用时,管道将被刷新,CPU必须等待GPU完成数据的呈现和传输。使用PBO,您可以提前提供一个缓冲区,当GPU准备就绪时,数据将复制到该缓冲区中,因此它不会暂停。当您尝试在缓冲区准备就绪之前访问该缓冲区时(例如,通过
glGetBufferSubData()
或映射该缓冲区以进行读取等),它当然会暂停。因此,理想情况下,在读回数据之前,您可以在访问缓冲区之前将一些其他渲染命令排队,并执行一些其他CPU工作。我链接的扩展规范有一个示例部分,非常有趣

这种材料也可以与其他材料结合使用。在这种情况下,您可以在read调用之后添加fence sync,它将数据复制到PBO中。然后,在CPU上,您可以实际检查操作是否已经完成。如果没有,你可以做一些其他的工作,并检查回来


所有这些异步传输的主要问题是以吞吐量换取延迟。所以如果你马上需要那个像素值,然后做“;I don’对于GPU和CPU来说,没有任何其他可以在两者之间完成的工作,没有多少收获。那么,你真的无法避免这种拖延。

你为什么需要它?无论你做什么,从GPU获取数据都可能会使管道停滞。我读取了深度以获取(经过一些计算后)光标“后面”的3D世界空间点。我的网格是在GPU上按程序生成的,如果不从GPU获取一些值,我就无法获得该点。为什么需要它?无论你做什么,从GPU获取数据都可能会使管道停滞。我读取了深度以获取(经过一些计算后)光标“后面”的3D世界空间点。我的网格是在GPU上按程序生成的,如果不从GPU获取一些值,我就无法获得该点。