2012-12-28 54 views
0

我正在研究OpenGL + GLSL的GPGPU编程。一个问题是如果你有一个需要很长时间才能完成的着色器,那么取消它是不可能的。如何取消阻塞的OpenGL调用

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

+0

正确的答案是阻止OpenGL阻塞调用是不可能的(这实际上是一个问题,因为有些人拥有长时间计算的着色器)来自用户空间。基本上,操作系统给OpenGL“一段时间”。如果openGL不能及时结束工作,那么操作系统就会终止这个过程。但是,无论如何,您已经接受了如此好运的答案:D – GameDeveloper

+0

看到我的回复,我基本上已经放弃了。 :-) –

回答

3

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

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

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

,如果你需要一些更高级的计算,那么你可能需要使用OpenCL的,会给你更多的灵活性。

+0

+1为PBO.It也被称为“异步转移”对我来说,它提高了纹理下载高达80%。 –

+0

看起来像一个PBO与栅栏组合将会诀窍...但我需要这个工作在OpenGL ES 2.0以及iPad上(这也是为什么我不使用OpenCL)。但无论如何,一个很好的答案,谢谢! –

0

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

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

+0

因为“我认为”并不意味着什么。我只是在一张较旧的ATI卡上试过,如果它在每个像素的基础上运行时间过长,驱动程序在这里终止着色器,而没有任何错误报告。可能这是供应商特定的。 –

+0

我尝试了更多,并且驱动程序确实在Windows Vista上两秒钟后崩溃,因为Windows强制它。由于“我认为”,我仍然保持低调:你没有提供一个很好的解释为什么崩溃会发生。 –

+0

这种情况在文档中没有描述。我遇到非常慢着色器崩溃时的经验(我认为它与http://nvidia.custhelp.com/app/answers/detail/a_id/3007,http://msdn.microsoft.com/en -us /窗/硬件/ gg487368.aspx)。如果我的着色器从纹理读取很多数据(大约1000次读取操作),我也崩溃了。我想写一个关于“我认为”的问题的评论,但我不能发表评论。 – Unick