Почему вы злоупотребляете OpenGL для этого? То, что вы там делаете, очень неустойчиво. Например, пиксель, считываемый glReadPixels, будет соответствовать только положению вершин, если используется тщательно подобранная комбинация матрицы проекции и модели. Кроме того, каждая итерация заполнения будет выполнять полный раунд. Просто потому, что вы используете OpenGL, он не получает магически быстро.
Если вы хотите наполнить заливку некоторой областью в фреймбуфере, проверьте весь фреймбуфер, выполните заливку и верните результат в OpenGL. Также, если какая-то часть фреймбуфера закрыта (окном или подобным), эти части не будут
Теперь, чтобы понять, почему вы оказываетесь в бесконечной рекурсии. Рассмотрим это:
fill(4, 4)
позвонит fill(5, 4)
будем называть fill(5, 5)
будем называть fill(4, 5)
будем называть fill(4, 4)
бум
Теперь у вас есть, что тест там:
if(pixval[0] == pixvali[0] &&
pixval[1] == pixvali[1] &&
pixval[2] == pixvali[2])
Обратите внимание, что это оценивает истинный если установленный пиксель уже имеет целевой цвет, снова завершается бесконечной рекурсией. Вы должны проверить на неравенство.
И последнее, но не менее важное: изображение может состоять из миллионов пикселей легко. Обычные размеры стека позволяют использовать только не более 1000 уровней вложенности функций, поэтому вы конвертируете рекурсию хвоста в итерацию.
TL; DR: не используйте для этого OpenGL, работайте с локальным буфером, используйте надлежащий тест условий итерации и используйте итерацию вместо рекурсии (или используйте функциональный язык, тогда компилятор позаботится об этой хвостовой рекурсии).
http://en.wikipedia.org/wiki/Flood_fill
И добавьте язык в теги. Это может выглядеть как C, но есть довольно много языков, похожих на C :) – extraneon
- значения пикселей, установленные где угодно? – Dario
Мой хрустальный шар говорит мне, что «pixvali» - это цвет, который должен быть заполнен потоком. – 2009-05-24 12:22:48