我正在研究使用OpenGL + GLSL进行GPGPU编程。一个问题是,如果你有一个需要很长时间才能完成的着色器,似乎无法取消它。
设置完所有内容后,我发出最终glReadPixels
调用,该调用将阻塞,直到所有像素都渲染到帧缓冲区。根据着色器,这可能需要很长时间,甚至几秒钟。有没有办法取消呼叫(从另一个线程)甚至查询进度?如果在着色器中设置无限循环会发生什么?
答案 0 :(得分:3)
而不是glReadPixels你可以使用没有阻塞的PixelBufferObjects。 glReadPixels将等待(在您的主线程中)获得结果,但PBO将继续......在代码的后面某处,您可以检查PBO中的数据是否可用。
http://www.songho.ca/opengl/gl_pbo.html
http://www.opengl.org/wiki/Pixel_Buffer_Object
如果您需要更高级的计算,那么您可能希望使用OpenCL,这将为您提供更大的灵活性。
答案 1 :(得分:0)
如果在着色器中设置无限循环会发生什么?
我认为你的视频驱动程序会崩溃。