0

我正在研究使用 OpenGL + GLSL 进行 GPGPU 编程。一个问题是,如果您有一个着色器需要很长时间才能完成,那么取消它似乎是不可能的。

设置完所有内容后,我发出最终glReadPixels调用,该调用会阻塞,直到所有像素都被渲染到帧缓冲区。根据着色器的不同,这可能需要很长时间,甚至几秒钟。有没有办法取消呼叫(从另一个线程)甚至查询进度?如果在着色器中设置无限循环会发生什么?

4

2 回答 2

3

您可以使用不阻塞的 PixelBufferObjects 而不是 glReadPixels。glReadPixels 将等待(在您的主线程中)结果,但 PBO 将继续......稍后在代码中的某处您可以检查 PBO 中的数据是否可用。

http://www.songho.ca/opengl/gl_pbo.html

http://www.opengl.org/wiki/Pixel_Buffer_Object

如果您需要一些更高级的计算,那么您可能想要使用 OpenCL,这将为您提供更大的灵活性。

于 2012-12-29T10:06:46.567 回答
0

如果在着色器中设置无限循环会发生什么?

我想你会得到视频驱动程序的崩溃。

于 2012-12-29T10:08:49.593 回答