Как отменить блокирование требование OpenGL

Я исследую GPGPU, программирующий с OpenGL + GLSL. Одна проблема состоит в том, что, если у вас есть шейдер, который занимает много времени, чтобы закончиться, это, кажется, невозможно отменить его.

После подготовки всего я выпускаю финал glReadPixels требование, которое блокирует, пока все пиксели не были предоставлены к кадровому буферу. В зависимости от шейдера это могло занять много времени, даже секунды. Есть ли способ отменить требование (от другой нити) или даже подвергнуть сомнению прогресс? Что происходит, если вы настраиваете бесконечный цикл в шейдере?

0
nl ja de
правильный ответ был бы то, что блокирование OpenGL, блокирующего требование, не возможно (это - на самом деле проблема, потому что у некоторых людей есть шейдеры, которые делают долгие вычисления) от пространства пользователя. В основном действующая система дает OpenGL "некоторое время". Если openGL не заканчивает работу вовремя, действующая система просто убивают процесс. Однако, вы уже приняли ответ так удача anyway:D
добавлено автор GameDeveloper, источник
Посмотрите мой ответ, I' ve, от которого в основном просто разочаровываются это.:-)
добавлено автор Frederik Slijkerman, источник

2 ответы

вместо glReadPixels вы могли использовать PixelBufferObjects, которые не блокируют. glReadPixels будет ждать (в вашей главной нити) для результатов, но PBO продолжится... где-нибудь позже в коде, который можно проверить, доступны ли данные в PBO.

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

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

если вам нужны некоторые более передовые вычисления тогда, можно хотеть использовать OpenCL, который даст вам больше гибкости.

3
добавлено
+1 для PBO.It также назван "async передачей", Для меня это улучшило загрузку структуры до 80%.
добавлено автор Michael IV, источник
Похож на PBO в сочетании с забором, был бы к уловке..., но мне нужно это, чтобы работать над OpenGL ES 2.0 также для iPad (это также почему я don' t используют OpenCL). Но хороший ответ так или иначе, Спасибо!
добавлено автор Frederik Slijkerman, источник

Что происходит, если вы настраиваете бесконечный цикл в шейдере?

Я думаю, что вы получите катастрофу видеодрайвера.

0
добавлено
Это зависит от действующей системы не на водителях и отредактированной версии этого ответа (без, "я Думаю"), должен быть принят.
добавлено автор GameDeveloper, источник
Downvoted, потому что "Я думаю", ничего не имеет в виду. Я просто попробовал его на более старой карте ATI, и водитель здесь заканчивает шейдер, если это бежит слишком долго на основе за пиксель без какого-либо сообщения об ошибке. Возможно это определенное для продавца.
добавлено автор Frederik Slijkerman, источник
Я экспериментировал еще немного, и водитель действительно терпят крах после двух секунд на Windows Vista, потому что Windows вызывает его к. I' m все еще держащий downvote из-за "Я думаю": вы didn' t дают хорошее объяснение того, почему катастрофа произошла бы.
добавлено автор Frederik Slijkerman, источник
Этот случай не описан в документации. У меня есть опыт, когда у меня есть катастрофа с очень медленными шейдерами (я думаю, это было связано с nvidia.custhelp.com/app/answers/detail/a_id/3007, msdn.microsoft.com/en-us/windows/hardware/gg487368.aspx). Также у меня есть катастрофа, если мой шейдер прочитал много данных из структуры (приблизительно 1000 операций чтения). Я хотел написать комментарий под вопросом о, "Я думаю", но я не могу написать комментарий.
добавлено автор Unick, источник
pro.graphon (and gamedev)
pro.graphon (and gamedev)
389 участник(ов)

Обсуждаем стандарты консорциума Khronos: OpenGL, OpenCL и пр., предлагаем различные работы, туторы, интересные материалы по этим стандартам (и помечаем их тегами). Правила чата и инфо по системе тегов – /rules. Реклама только по согласованию с @AlexFails.